首页
社区
课程
招聘
[讨论]如何编程修改exe内存里的数据,并将结果保存到exe
发表于: 2006-12-24 02:08 9908

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

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

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 214
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
随便找个十六进制编辑器,搜索"你可以把我修改成别的吗",改掉
2006-12-24 09:19
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
3
最初由 Winker 发布
.if ecx != 0 ;找到了字符串
;这里开始处理.....

既然你已经找到字符串的地址了,直接修改字符串,然后保存文件不就行了?
2006-12-24 12:31
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
4
Originally posted by 仙剑太郎
随便找个十六进制编辑器,搜索"你可以把我修改成别的吗",改掉


用UE谁不懂丫....主要是编程问题上实现 
2006-12-24 18:14
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
5
Originally posted by llydd
既然你已经找到字符串的地址了,直接修改字符串,然后保存文件不就行了?


我是懂找到,但是不知道怎么修改 请赐教 
2006-12-24 18:14
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
6
顺便在问一下,win32汇编里有RtlZeroMemory,怎么就没有RtlCopyMemory..

怎么用另外的方法来实现和RtlCopyMemory相同的功能?
2006-12-24 19:40
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
7
这个问题也可以用内存映射来解决
建立映射的时候要可写
修改完之后,update就可以了
(内存中的数据会自动保存到磁盘文件)
2006-12-25 09:33
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
8
WriteProcessMemory
2006-12-25 10:19
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
9
最初由 北极星2003 发布
这个问题也可以用内存映射来解决
建立映射的时候要可写
修改完之后,update就可以了
(内存中的数据会自动保存到磁盘文件)

直接以指针的方式来修改数据可以?如何来UPDATE
希望winker把过程写出来
2006-12-25 13:18
0
雪    币: 196
活跃值: (135)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
10
最初由 Winker 发布
顺便在问一下,win32汇编里有RtlZeroMemory,怎么就没有RtlCopyMemory..

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


RtlMoveMemory应该可以用
2006-12-25 14:32
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
11
最初由 llydd 发布
直接以指针的方式来修改数据可以?如何来UPDATE
希望winker把过程写出来


直接修改内存数据,然后FlushViewOfFile
2006-12-25 14:58
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
同意用
ReadProcessMemory和
WriteProcessMemory
2006-12-25 16:06
0
雪    币: 226
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
2006-12-26 14:08
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
14
Originally posted by 北极星2003
直接修改内存数据,然后FlushViewOfFile


其实不用FlushViewOfFile也行吧,

调用MapViewOfFile后,如果可写,系统就自动保存貌似....我参考了一些代码,是这样解决的:

CreateFile---CreateFileMapping--MapViewOfFile--然后调用:

ModifyFile proc uses ebx esi edi,lpBufferAddress:LPSTR
  mov edi,lpBufferAddress     ;得到内存地址
  add edi,0010a0h         ;得到要写入的地址
  invoke lstrcpy,edi,addr szU   ;修改edi地址处的内容为szU所保存的
  xor edi,edi ;清空这个edi,免得物理内存地址重复
  mov edi,lpBufferAddress ;重新得到内存地址
  add edi,001a24h ;得到要另外的地址
  invoke lstrcpy,edi,addr szUrl ;修改edi地址处的内容为szUrl所保存的
  ret
ModifyFile endp

其中的物理内存地址,是先用VC++编辑器查看要修改的字符串的内存地址,这样就可以通过修改szU或者szUrl的值来改变MessageBox里的参数内容了
2006-12-26 14:15
0
游客
登录 | 注册 方可回帖
返回
//