[讨论]如何编程修改exe内存里的数据,并将结果保存到exe

n00000000p 2006-12-24 07:53:34
例如一个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 ,并把它保存成我想要的数据,这里我就不懂了,请朋友们指教!

顺便在问一下,win32汇编里有RtlZeroMemory,怎么就没有RtlCopyMemory..

怎么用另外的方法来实现和RtlCopyMemory相同的功能?

是否这样实现:
invoke lstrlen,addr szBuffer
lea esi,szBuffer
mov edi,lpData
add edi,000800h
mov ecx,eax
cld
rep movsb

还有其他方法吗?

...全文
478 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
n00000000p 2006-12-25
  • 打赏
  • 举报
回复
如果利用内存共享查找捏?调用MapViewOfFile的时候,可写就行.例如
invoke MapViewOfFile,eax,FILE_MAP_WRITE,0,0,0
...然后自动保存到磁盘,我自己写代码测试一下 :-)
csShooter 2006-12-25
  • 打赏
  • 举报
回复
up
zara 2006-12-25
  • 打赏
  • 举报
回复
查找资源是否成功, 在 FindResource 后检查下 eax 就可以了. 对于 exe 文件的结构, 还是比较复杂的, 我自己没有实际操作过. 可以参考 http://211.90.241.130:22366/view.asp?file=38 (罗云彬的编程乐园) 侯捷翻译的 "Winfows 系统程序设计 - 大解密" 的第八章 "PE 与 COFF OBJ 档案格式" 的介绍
n00000000p 2006-12-24
  • 打赏
  • 举报
回复
zara能给出一段代码我参考一下吗?  :-)
zara 2006-12-24
  • 打赏
  • 举报
回复
首选开始的查找资源是否成功; 其次, exe 文件不仅仅是资源就可以的, 它有一定的结构要求的
n00000000p 2006-12-24
  • 打赏
  • 举报
回复
那如何导出一个程序的二进制资源,然后存为exe?

下面是主要代码,不过我导出的时候却是一个空的exe,

   invoke FindResource,NULL,ASM,RT_RCDATA ;查找ASM资源
mov hRsrc,eax
invoke SizeofResource,NULL,hRsrc
mov dwSize,eax
invoke LoadResource,NULL,hRsrc
mov hResData,eax
invoke GlobalAlloc,GPTR,dwSize
mov lpData,eax
invoke LockResource,hResData
mov lpRes,eax
invoke lstrcpyn,lpData,lpRes,dwSize
invoke lstrlen,addr szBuffer
lea esi,szBuffer ;esi=szBuffer
mov edi,lpData ;edi=lpData
add edi,000800h ;edi=lpData+000800H
mov ecx,eax ;ecx=szBuffer的长度
cld
rep movsb
invoke CreateFile,offset szName,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
.if eax != NULL
mov hFile,eax
invoke WriteFile,hFile,addr lpData,dwSize,addr dwSizeWritten,NULL
invoke MessageBox,hWnd,offset szText,offset szCaption,MB_OK
invoke CloseHandle,hRsrc
invoke CloseHandle,hResData
invoke CloseHandle,hFile
invoke GlobalFree,lpData

我啃 2006-12-24
  • 打赏
  • 举报
回复
要访问和修改人家的内存
zara 2006-12-24
  • 打赏
  • 举报
回复
RtlMoveMemory 就是内存块复制功能, 是你想像的 RtlCopyMemory 的功能

如果要对运行中的文件进行修改的话, 是不能的. 正在运行的程序模块文件是被系统保护的.
如果不是特别的需用, 可以通过其它方式来改变不同的使用内容, 比如是注册表, 自己的配置文件等等, 而不非得去修改自己

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧