例如一个MessageBox的代码,要求编程实现修改数据:
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
.data
szText db '你可以把我修改成别的内容吗',0
.code
start:
invoke MessageBox, NULL, addr szText,NULL, MB_OK
invoke ExitProcess,NULL
end start
现在编译这个代码,然后在这个程序的内存中修改并且保存szText的内容...
按照一般的思路是,在修改之前,首先找到它的内存地址或者它本身,例如下面代码是在这个exe中寻找“你可以把我修改成别的吗”这个字符串:
.data
szText db '你可以把我修改成别的吗',0
invoke CreateFile,_lpszFile,GENERIC_READ,\ ;打开找到的文件
FILE_SHARE_READ or FILE_SHARE_WRITE,NULL,\
OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL
.if eax != INVALID_HANDLE_VALUE
mov @hFile,eax
invoke GetFileSize,eax,NULL
mov @dwFileSize,eax
.if eax
invoke CreateFileMapping,@hFile,\
NULL,PAGE_READONLY,0,0,NULL
.if eax
mov @hMapFile,eax
invoke MapViewOfFile,eax,\
FILE_MAP_READ,0,0,0
.if eax
mov @lpMemory,eax
mov ecx, @dwFileSize ;保存文件长度
sub ecx,10; 子字符串长度减 1
mov esi, @lpMemory ;保存共享句柄
@@:
mov edi, offset szText
push ecx
push esi
mov ecx,13 ; 子字符串长度
repe cmpsb ;这里对比,如果不符合,就继续
pop esi
pop ecx
je @f
inc esi
loop @b
@@:
.if ecx != 0 ;找到了字符串
;这里开始处理.....
至于怎么替换掉szText ,并把它保存成我想要的数据,这里我就不懂了,请朋友们指教!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)