能力值:
(RANK:260 )
|
-
-
2 楼
你是用OD来操作进程的内存,还是要自己写Loader来实现?
OD的话,直接在数据窗口定位到地址A,选中要复制的字节,右键,二进制复制;然后来到地址B,右键,二进制粘贴,即可。
如果是自己写程序,无非是ReadProcessMemory和WriteProcessMemory两个API,外加OpenProcess或CreateProcess来获取进程对象的句柄。
推荐用CREATE_SUSPENDED标志来CreateProcess,然后执行内存的操作,最后ResumeThread即可。这样程序出错的概率小一点,前提是你知道自己在做什么。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
我只是想直接在原程序内打补丁,把一段解密后的数据代码动态地拷贝到程序的某个虚拟内存中. 这段数据代码我已经带狗跟踪到,而且加到程序的DATA段.
我想实现的功能就是在原程序无狗执行到解密结束后,把正确的解密数据复制到程序正确解密后应该放的内存段.
我用OD调试程序,手动替换解密后数据,程序已经可以正确执行. 不过想把程序patch下,让他可以自己完成数据替换工作,这样可以独立运行了.
讲得有点不清楚,抱歉.
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
这样说好了, 就是如何把程序数据段的一部分数据(比如字符串,但内容很多)读到指定的内存中去.
用什么指令实现?
|
能力值:
(RANK:260 )
|
-
-
5 楼
这样啊,最简单的实现方式就是 将 A 这个地址 放ESI寄存器,将 B 这个地址放EDI寄存器,将要拷贝的字节数放ECX寄存器,然后用REP MOVSB实现拷贝。再加上寄存器保存,代码看上去是这样的:
push esi
push edi
push ecx
mov esi, A
mov edi, B
mov ecx, 0xXXXX
rep movsb
pop ecx
pop edi
pop esi
把这段代码补在原来程序中.text节末尾的有大量的0的位置,在你找到的解密完成后的那个代码位置,用JMP指令跳出来执行,执行后再跳回去。因为JMP指令可能会破坏原来的若干条指令,所以你在补丁代码还要补上与原来功能等效的代码(这是打代码补丁的常规方法)。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
[QUOTE=书呆彭;611659]这样啊,最简单的实现方式就是 将 A 这个地址 放ESI寄存器,将 B 这个地址放EDI寄存器,将要拷贝的字节数放ECX寄存器,然后用REP MOVSB实现拷贝。再加上寄存器保存,代码看上去是这样的:
push esi
push edi
push ecx
mov esi, A
mov edi, B
mov ecx, 0xXXXX
rep movsb
pop ecx
pop edi
pop esi
把这段代码补在原来程序中.text节末尾的有大量的0的位置,在你找到的解密完成后的那个代码位置,用JMP指令跳出来执行,执行后再跳回去。因为JMP指令可能会破坏原来的若干条指令,所以你在补丁代码还要补上与原来功能等效的代码(这是打代码补丁的常规方法)。[/QUOTE]
就是要这个东西,我的汇编太菜,搞不定.
多谢书呆彭!
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
我用PUSHAD保存所有寄存器值,做完我的工作后,再用POPAD恢复原有寄存器值,是不是也可以?
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
程序终于可以工作了,谢谢.
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
楼主,请教下这个汇编代码怎么嵌入程序呢??
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
这个直接——aS
m嵌入就可以啊
|
|
|