《Windows API巡礼》--CreateRemoteThread和WriteProcessMemory

C语言学习day23:WriteProcessMemory函数/游戏内存数据修改工具开发 上一章我们说了获取应用进程的某数据(data),这一章我们就说说修改内存地址的数据。想要修改内存,那么就需要我们另一个WinAPI函数:WriteProcessMemory()函数。 阅读详情

CreateRemoteThread函数用于为指定进程创建线程,该线程将会在其他进程的地址空间中执行,访问其他进程的资源:

HANDLE WINAPI CreateRemoteThread(

  __in   HANDLE hProcess, //需要为其创建线程的目标进程句柄,该目标进程需要具有如下权限:

                              //PROCESS_CREATE_THREAD、PROCESS_QUERY_INFORMATION、

                              //PROCESS_VM_OPERATION、PROCESS_VM_WRITE、PROCESS_VM_READ

  __in   LPSECURITY_ATTRIBUTES lpThreadAttributes, //指向安全描述符的指针,NULL为默认

  __in   SIZE_T dwStackSize, //线程堆栈大小,0表示使用默认值

  __in   LPTHREAD_START_ROUTINE lpStartAddress, //函数指针,指向存在与目标进程中的线程函数

  __in   LPVOID lpParameter, //传给线程函数的参数

  __in   DWORD dwCreationFlags, //0---线程创建后立即运行;

//CREATE_SUSPENDED---线程创建后挂起,知道ResumeThread函数调用才开始运行;

//STACK_SIZE_PARAM_IS_A_RESERVATION---dwStackSize参数指定初始保留的堆栈大小

//不指定该标志时,dwStackSize表示提交的大小(commit size)

  __out  LPDWORD lpThreadId //指向存放线程ID的缓冲区的指针,为NULL表示不保存线程ID

);

返回值:

成功时,返回新线程的句柄;

失败时,返回NULL。

 

WriteProcessMemory函数用于将数据写入到目标进程的虚拟地址空间中:

BOOL WINAPI WriteProcessMemory(

  __in   HANDLE hProcess, //目标进程句柄,操作进程需要有目标进程的PROCESS_VM_WRITE和

                            //PROCESS_VM_OPERATION权限

  __in   LPVOID lpBaseAddress, //写入数据的地址,目标进程虚拟地址空间中的地址

  __in   LPCVOID lpBuffer, //指向需要写入的数据

  __in   SIZE_T nSize, //写入数据的字节大小

  __out  SIZE_T *lpNumberOfBytesWritten //用于保存实际写入的数据的大小

);

返回值:

成功时,返回非零值;

失败时,返回零值。

 

实例代码:直接将远程进程地址空间中的API函数LoadLibraryW作为线程函数调用:

#include <windows.h>

 

/***********************************************************

* 功能:通过创建远程线程给其他进程加载DLL

* 参数:dwProcessId--目标进程PID

*       lpszLibName--DLL的路径

* 返回值:是否成功

***********************************************************/

BOOL LoadRemoteDll(DWORD dwProcessId, LPTSTR lpszLibName)

{

    BOOL bResult = FALSE;

    HANDLE hProcess = NULL;

    HANDLE hThread = NULL;

    PTSTR pszLibFileRemote = NULL;

    DWORD cch;

    PTHREAD_START_ROUTINE pfnThreadRtn;

   

    __try

    {

        //获得想要注入代码的进程的句柄

        hProcess = OpenProcess(PROCESS_ALL_ACCESS,

                              FALSE, dwProcessId);

        if(hProcess == NULL)

        {

            __leave;           

        }    

        //计算DLL路径名需要的字节数

        cch = lstrlen(lpszLibName) + 1;

        //在远程线程中为路径名分配空间

        pszLibFileRemote = (PTSTR)VirtualAllocEx(

                           hProcess, NULL, cch,

                           MEM_COMMIT, PAGE_READWRITE);

        if(pszLibFileRemote == NULL)

        {

            __leave;                   

        }

       

        //将DLL的路径名复制到远程进程的内存空间

        if(!WriteProcessMemory(hProcess,

                  (PVOID)pszLibFileRemote,

                  (PVOID)lpszLibName,

                  cch,

                  NULL))

        {

            __leave;         

        }

       

        //获得LoadLibrary在Kernel32.dll中的真实地址

        pfnThreadRtn = (PTHREAD_START_ROUTINE)GetProcAddress(

                     GetModuleHandle(TEXT("Kernel32")), TEXT("LoadLibraryW"));

        if(pfnThreadRtn == NULL)

        {

            __leave;               

        }

       

        //创建远程线程,并通过远程线程调用用户的DLL文件

        hThread = CreateRemoteThread(hProcess, NULL,

                0, pfnThreadRtn, (PVOID)pszLibFileRemote,

                0, NULL);

        if(hThread == NULL)

        {

            __leave;           

        }

       

        //等待远程线程终止

        WaitForSingleObject(hThread, INFINITE);

        bResult = TRUE;

    }    

    __finally

    {

        //关闭句柄

        if(pszLibFileRemote != NULL)

        {

            VirtualFreeEx(hProcess, (PVOID)pszLibFileRemote, 0, MEM_RELEASE);

            pszLibFileRemote = NULL;                   

        }        

        if(hThread != NULL)

        {

            CloseHandle(hThread);

            hThread = NULL;

        }

        if(hProcess != NULL)

        {

            CloseHandle(hProcess);

            hProcess = NULL;           

        }

    }

    return bResult;

}

 

Windows-注入技术学习总结 目录 1.远程线程注入 2.消息钩子注入 3.输入法注入 4.注册表注入 5.EIP注入 6.APC注入 7.SSDT替换 总结 1.远程线程注入 原理:利用CreateRemoteThread()函数,将自己创建的的线程加载到远程空间进程里去执行。 CreateRemoteThread function (processthreadsapi.h) - Win32 apps | Microsoft Docs 注入流程: OpenProcess 打开被注入进程句柄。 Vir 阅读详情

相关推荐

5.4 磁悬浮轴承控制系统仿真:在MATLAB/Simulink中搭建包含功放、传感器模型的闭环系统模型,进行稳定性与动态性能仿真

磁悬浮轴承控制系统仿真方法 摘要:磁悬浮轴承控制系统仿真需建立包含转子动力学、传感器、控制器、功率放大器和电磁执行器的高保真非线性模型。通过MATLAB/Simulink搭建闭环系统,重点建模传感器带宽限制与噪声、功放饱和特性以及电磁力非线性。仿真分析包括时域阶跃响应、扰动抑制测试,频域稳定性分析(伯德图、奈奎斯特图),以及参数摄动下的鲁棒性验证。关键要验证控制算法在非线性因素影响下的稳定性和动态性能,为实际系统实现提供可靠依据。仿真中需特别注意物理量单位一致性和数字控制离散化效应。

技术工作者 1107

WriteProcessMemory

以PROCESS_ALL_ACCESS权限打开进程以后既可以使用ReadProcessMemory读取程序内存,也可以使用WriteProcessMemory改写程序的内存,这也是一些内存补丁使用的招数,以下是程序的实现代码 #include  #include  BOOL CALLBACK EnumChildWindowProc(HWND hWnd,LPARAM lParam);/

pjz969的专栏 4085

低成本主从机械臂系统构建:6D位姿数据采集与VLA模型训练实战

本文详细介绍了如何构建低成本主从机械臂系统,实现高精度6D位姿数据采集与VLA模型训练。通过300美元级别的硬件组合,系统达到±1mm位置精度和≤0.5°姿态误差,满足Vision-Language-Action模型的多模态训练需求。文章涵盖硬件选型、数据采集技巧、模型训练实战经验,为机器人研究提供经济高效的解决方案。

r7s8t的博客 266

WriteProcessMemory 函数 (memoryapi.h)

将数据从当前进程中的指定缓冲区复制到指定进程的地址范围。任何具有 PROCESS_VM_WRITE 句柄且PROCESS_VM_OPERATION访问要写入的进程的进程都可以调用 函数。如果请求的写入操作交叉到无法访问的进程区域,函数将失败。在进行数据传输之前,系统会验证指定大小的基址和内存中的所有数据是否可供写入访问,如果无法访问,则函数将失败。要修改的进程内存的句柄。指向缓冲区的指针,该缓冲区包含要写入指定进程的地址空间中的数据。要写入到的整个区域必须可访问,如果无法访问,则函数将失败。

程序猿的白兰日常 1145

《无人驾驶车辆模型预测控制》(第二版)第四章详细学习——算法部分

根据代码进行的“MPC跟踪直线和圆算法”的详细推导学习记录。

Fengdf666的博客 5018

多摄像头同步技术:帧同步信号在Sensor与解串器间的传递机制

本文深入探讨了多摄像头系统中帧同步信号的两种核心传递机制:由解串器统一发号施令或由主Sensor作为“带头大哥”。文章对比了两种方案在同步精度、硬件复杂度、成本及适用场景上的差异,并提供了实战配置要点与调试心法,为车载环视、ADAS及工业检测等应用提供关键的技术选型与实施指导。

weixin_29193359的博客 435

ReadProcessMemory与WriteProcessMemory用例分析

首先介绍一个函数VirtualProtectEx,它用来改变一个进程的虚拟地址中特定页里的某一区域的保护属性,这句话有些咬嘴,直接从MSDN中翻译过来的,简单来说就是改变某一进程中虚拟地址的保护属性,如果以前是只读的,那改变属性为PAGE_EXECUTE_READWRITE后,就可以更改这部分内存了。 具体看它的实现 BOOL WINAPI VirtualProtectEx( __in H...

wodamazi 1164

微软商店报错“此产品当前不可用”?终极修复指南

微软商店报错“此产品当前不可用”?终极修复指南

安德洛夫 3810

WriteProcessMemory函数说明

WriteProcessMemory 目录 概览C++VB 编辑本段概览 WriteProcessMemory   此函数能写入某一进程的内存区域。入口区必须可以访问,否则操作将失败。 编辑本段C++   此函数能写入某一进程的内存区域(直接写入会出Access Violation错误,故需此函数)。   VC++声明   BOO...

weixin_30875157的博客 1709

UNet 改进(19):与ASPP结合的图像分割模型

这个代码实现了一个改进版的UNet模型,在传统的UNet架构基础上,引入了ASPP模块来增强模型捕获多尺度上下文信息的能力。​​UNet主干网络​​:经典的编码器-解码器结构,带有跳跃连接​​ASPP模块​​:位于瓶颈层,用于提取多尺度特征。

2401_82355416的博客 878

Unity 如何使用命令模式

命令模式 游戏中,当你想通过一种通用的方式来存储命令并能够撤消命令时,那么命令模式最有用。 在“示例”中,你将看到一个可以通过GUI按钮移动的简单点。 采取行动后,您可以撤消并重做。我在屏幕上添加了一个简单的OnGUI标签输出,因此您可以看到命令列表,并指出哪个是当前命令。 在此示例中使用了4个类: Command-这是任何命令模式都可以继承的基本结构(抽象类)。您可以在任何项目中使用此类。 MoveCommand-这是从Command类继承的结构,将使用Execute和UnExecute(撤消)。每个移

TxNet 1556

通过WriteProcessMemory改写进程的内存

http://www.cnblogs.com/feiyucq/archive/2009/10/21/1587628.html 以PROCESS_ALL_ACCESS权限打开进程以后既能够使用ReadProcessMemory读取程序内存,也能够使用WriteProcessMemory改敲代码的内存,这也是一些内存补丁使用的招数,下面是程序的实现代码 #include &lt;windo...

weixin_34378922的博客 1087

华为OD面试手撕真题 【合并相邻且相等的元素】多语言题解

华为OD面试高频手撕真题【合并相邻且相等的元素】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。

qq_45776114的博客 548

[检测&过检测] 重写 ReadProcessMemory 、WriteProcessMemory

一、本文大纲 系统调用的两种方式:中断门和快速调用 _KUSER_SHARED_DATA 结构 使用 cpuid 指令判断当前CPU是否支持快速调用 3环进0环需要更改的4个寄存器 以 ReadProcessMemory 为例说明系统调用全过程 重写 ReadProcessMemory 和 WriteProcessMemory int 0x2e 和 sysenter 都做了什么工作? 二、中断门和快速调用 以我的理解,系统调用,即从调用操作系统提供的3环API开始,到进0环,再到返回结果到3环的全过程

LYSM 3260

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

用WriteProcessMemory做进程注入

用WriteProcessMemory做进程注入 今天要完成一个项内容,运行另一个应用程序abc.exe,实现它的父进程是explorer.exe。最开始的思路是获得explorer.exe的句柄,用ShellExecute启动abc.exe。但是用explorer.exe的句柄创建的进程的父进程依然是调用和进程,而不是传入句柄的进程。看来直接的不行,只能用间接的了。把运行ab

manbug的专栏 5162

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C#使用WinAPI读写进程内存

0x01 使用kernel32.dll中的ReadProcessMemory和WriteProcessMemory内存函数可以完成对程序内存的读写。 我在写读内存整数型、写内存整数型和读内存小数型三个方法的时候测试可以正确读写进程地址的内存,但是我在写内存小数型的时候遇到了问题,记录一下。 0x02 ReadProcessMemory函数原型如下: BOOL ReadProces

cgs的博客 5542

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

用WriteProcessMemory函数注入进程的流程

<br />CreateProcessA         创建挂起进程<br />GetThreadContext <br />ReadProcessMemory<br />VirtualAllocEx             分配空间  <br />WriteProcessMemory 写入PE头<br />WriteProcessMemory 循环写入各节表<br />WriteProcessMemory <br />SetThreadContex

a1234567mdy的专栏 2129

【转载】Win2K下地Api函数地拦截 VirtualProtectEx,WriteProcessMemeory,ReadProcessMemeory

Api拦截并不是一个新的技术,很多商业软件都采用这种技术。对windows的Api函数的拦截,不外乎两种方法,第一种是Mr. Jeffrey Richter 的修改exe文件的模块输入节,种方法,很安全,但很复杂,而且有些exe文件,没有Dll的输入符号的列表,有可能出现拦截不到的情况。第二种方法就是常用的JMP XXX的方法,虽然很古老,却很简单实用。 本文一介绍第二种方法在Win2k下的使用。...

mangshe0的专栏 771

CreateRemoteThreadWriteProcessMemory技术 简要的

CreateRemoteThreadWriteProcessMemory第三种方法的基本思想是拷贝一些代码到另一进程的地址空间中然后执行。这种方法代替了编写独立的DLL,而是直接将代码使用WriteProcessMemory API函数拷贝到远程进程中。然后通过CreateRemoteThread来执行它。本文前面已经介绍过CreateRemoteThread的函数原型,注意以下几点:

天蓝的专栏 2023

【干货】Windows进程注入之CreateRemoteThread

函数介绍 百度百科 CreateRemoteThread是一个Windows API函数,它能够创建一个在其它进程地址空间中运行的线程(也称:创建远程线程) 这个函数很好理解,即控制其它进程来运行一个线程!由于是控制其它进程运行所以函数的参数以及需要的数据必须存在目标进程中,否则必须将数据写入到目标进程中,写入数据的过程如下: Cre...

weixin_34109408的博客 1283

创建远程线程注入Dll——CreateRemoteThread

CreateRemoteThread是创建一个在其他进程的地址空间中运行的线程(也称远程线程)。其函数原型为:HANDLE WINAPI CreateRemoteThread( __in HANDLE hProcess, __in LPSECURITY_ATTRIBUTES lpThreadAttributes, __in SIZE_T dwStackSize, __in LPTHREAD_STA...

拉塞尔的博客 1215

Java-jna 向内存中写入数据

在遍历条目时我直接使用 JNA 封装的方法(Kernel32.INSTANCE.Process32Next(snapshot, processEntry))是因为我在使用自己声明的接口(Process32Next)中,出现了乱码,经过不断的尝试解码,最终只发现使用Unicode解码才勉强能分辨出对应的进程名称,(使用其他解码工具发现将编码定义为Big5,使用Unicode重新编码效果最好。按图顺序点击后(当点击指针选项后,地址值会变,不要担心,那是正常的),然后输入之前找的偏移地址。记录地址和偏移地址。

G01010110的博客 2263
上一篇: 《Windows API巡礼》---GetEnvironmentStrings和GetEnvironmentVariable
下一篇: 《Windows API巡礼》---VirtualAlloc和VirtualFree
ACE1985
博客等级 码龄17年 1307粉丝 308原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值