Win32ASM-进程学习[3]-读写进程空间

本文介绍如何使用Windows API函数ReadProcessMemory和WriteProcessMemory进行跨进程内存读写操作,并提供了一个具体的内存补丁应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 invoke ReadProcessMemory,hProcess,lpBaseAddress,lpBuffer,dwSize,lpNumberOfBytesRead

 invoke WriteProcessMemory,hProcess,lpBaseAddress,lpBuffer,dwSize,lpNumberOfBytesWritten


hProcess 指定将要被读写的目标进程句柄

lpBaseAddress 目标进程中被读写的起始线性地址.

lpBuffer 用来接受数据的缓冲区

dwSize要读取的字节数

lpNumberOfBytesRead 或 lpNumberOfBytesWritten 指向一个双字变量,用来供函数返回实际读写的字节数,如果不关心读写结果,可以在这里使用NULL

 

如果函数执行成功则返回非0值,否则返回0

 

注意

(1)lpBaseAddress 和 lpBuffer参数指向的地址位于不同的进程空间内,lpBuffer指向的缓冲区位于自身进程地址空间中,lpBaseAddress指向的地址位于目标进程的地址空间内

(2)要对 目标进程的地址空间进行读写,必须具备PROCESS_VM_READ或PROCESS_VM_WRITE或PROCESS_VM_OPERATION

(3)lpBaseAddress位置开始的dwSize大小的内存必须可存取的,函数在执行前会对整个区域进行测试,如果中间有某处是不可存取的,(如没有递交到物理内存),那么函数直接返回失败

,所以一般不会出现只读写了一部分内存的情况

(4)在ring3级下,自己进程中,代码段是不可写的,但使用WriteProcessMemory函数是 可以去写目标进程的代码段是允许的

也不是一定不能写自己的代码段,可以通过修改PE导入表中的属性来达到自己可写的目的

 

下面给出一个内存补丁的例子

.386
.model flat,stdcall
option casemap:none
	
	include windows.inc
	include kernel32.inc
	include user32.inc
	includelib user32.lib
	includelib kernel32.lib
L MACRO var:VARARG        
local lbl
.const
	lbl db var,0
.code
	exitm   <offset lbl>
ENDM
.code
start:
	xor eax,eax
	.if eax
		invoke MessageBox,NULL,L("您使用的是正版软件"),L("Caption"),MB_OK
	.else
		invoke MessageBox,NULL,L("您所使用的是盗版软件"),L("错误"),MB_OK
	.endif
	invoke ExitProcess,NULL
end start

 

 可以通过OD等软件来查看.if eax的语句的地址....


 

;--------------------------------------------------------------------------------
;程序环境设置
.386
.model flat,stdcall
option casemap:none
;--------------------------------------------------------------------------------
;头文件与库文件导入
include windows.inc
include kernel32.inc
include user32.inc

includelib kernel32.lib
includelib user32.lib
;--------------------------------------------------------------------------------
;函数定义
;--------------------------------------------------------------------------------
;等值替换定义
PATCH_POSITION equ 00401014h
;--------------------------------------------------------------------------------
;宏定义
L macro var:VARARG
 LOCAL @lbl
 .const
 @lbl db var,0
 .code
 exitm <offset @lbl>
endm
;--------------------------------------------------------------------------------
;包含文件
;--------------------------------------------------------------------------------
;已初始化数据段
.data
;--------------------------------------------------------------------------------
;未初始化数据段
.data?
dwOldBytes db 2 dup(?)
stStartUp  STARTUPINFO  <?>
stProcessInfo PROCESS_INFORMATION <?>
;--------------------------------------------------------------------------------
;常量段
.const
dbPatched db 90h,90h
dbPatch  db 74h,15h
;--------------------------------------------------------------------------------
;代码段
.code
start:
 invoke GetStartupInfo,addr stStartUp
 invoke CreateProcess,L("Test.exe"),NULL,NULL,NULL,NULL,NORMAL_PRIORITY_CLASS or CREATE_SUSPENDED,0,0,offset stStartUp,offset stProcessInfo
 .if eax
  invoke ReadProcessMemory,stProcessInfo.hProcess,PATCH_POSITION,addr dwOldBytes,2,NULL
  .if eax
   mov ax,word ptr dwOldBytes
   .if ax == word ptr dbPatch
    invoke WriteProcessMemory,stProcessInfo.hProcess,PATCH_POSITION,addr dbPatched,2,NULL
    invoke ResumeThread,stProcessInfo.hThread
   .else
    invoke TerminateProcess,stProcessInfo.hProcess,-1
    invoke MessageBox,NULL,L("可执行文件版本不正确"),NULL,MB_OK or MB_ICONSTOP
   .endif
  .endif
  invoke CloseHandle,stProcessInfo.hProcess
  invoke CloseHandle,stProcessInfo.hThread
 .else
  invoke MessageBox,NULL,L("无法加载执行文件 或 可执行文件没有找到"),NULL,MB_OK or MB_ICONSTOP
 .endif
 invoke ExitProcess,NULL

;--------------------------------------------------------------------------------
end start  ;函数入口地址

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值