Heart执行文件EXE注入函数完整过程(图15个,设计函数重定向,函数参数等问题)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_40554560/article/details/102760420

Heart执行文件EXE函数注入完整过程(图15个,设计函数重定向,函数参数等问题)

微软红桃大战游戏heart.exe,我拷贝为D.EXE,运行后先弹出自己的一个对话框,然后再正常游戏。几乎花了我2周的时间,从头到尾。这只是后面一部分。涉及到DLL函数的重定位,函数参数的相对地址,PE文件的结构。声明一下,我是在WIN 7 + Intel 赛扬32位上破解注入成功的。

我信奉动手做,之说不做不大喜欢。实现这个破解和注入,过程很辛苦,但也有收获。可以和同行互相交流。

1.在010 Edito.exe中, 选择DATA段,找到空白空间92BB0H,

在这里插入图片描述
在这里插入图片描述
增加文字:
在这里插入图片描述
2.在010 Edito.exe中, 选择 TEXT段,找到空白空间8A110 H,
在这里插入图片描述
编辑代码:
在这里插入图片描述
至此,增加的一部分代码初步完成。这段代码实现对话框的弹出。
机器语言:6A 00 B8 D0 39 09 01 50 B8 B0 39 09 01 50 6A 00
FF 15 04 14 00 01 C3

对应的汇编语言是:
6A 00 PUSH 0
B8 D0390901 MOV EAX,OFFSET 010939D0
50 PUSH EAX
B8 B0390901 MOV EAX,OFFSET 010939B0
50 PUSH EAX
6A 00 PUSH 0 ; hOwner = NULL
FF15 04140001 CALL DWORD PTR DS:[<&USER32.MessageBoxW> ;
C3 RETN
3.在ollydbg.exe中, USER32.MessageBoxW 函数重定位.找到区间代码,
在这里插入图片描述
4.在010 Edito.exe中, 根据前面的区间代码85 FF 74 02 8B C7 56 51 50 FF 35,进行搜索找到对应位置:
在这里插入图片描述
粘贴代码这一部分代码(MessageBoxW函数调用):FF 15 04 14 00 01
在这里插入图片描述
5. 在010 Edito.exe的TEXT 段中, 确认8A120 H地址是FF 15 04 14 00 01。函数重定向剩下最后一步。调用地址04 14 00 01所在位置是8A122 H 。在这里插入图片描述
在010 Edito.exe上图中, 函数重定向剩下最后一步。打开重定向项目
struct IMAGE_BASE_RELOCATION BaseReloc[126]
在这里插入图片描述
因为.data FOA = 0x8A200 > 8A122 H,所以需要在这里增加定向项目。在ACDF0 h位置增加10H个字节空间:
在这里插入图片描述
在这里插入图片描述
并进行编辑(ACDF0h):00 A0 08 00 10 00 00 00 22 3B 00 00 00 00。
其中00 A0 08 00就是0008A000,经过换算就是text FOA = 0x89600(工具自动计算), 见下图。
10 00 00 00就是00000010,表示10H个字节。
22 3B 00 00就是00003B22 H 。
计算公式如下:89600 H + 00003B22 H - 00003000 H = 8A122 H, 就是前面需要重新定位的DLL函数地址。
至此,DLL函数重定向完成(为何要减掉00003000 H?看看重定义表的第一项就明白了)。
在这里插入图片描述
保存文件。
6.计算参数的相对地址。在010 Edito.exe中,数据段DATA的地址是8A200h : 在这里插入图片描述
数据段DATA的装入地址是8B000 h, 整个程序的装入地址是1000000h,
即1000000 h + 8B000 H - 8A200h = 10OOE00 H.
在这里插入图片描述
数据的存储地址是92BBOH, 92BDOH (4个文字串,我们用2个):
在这里插入图片描述
计算公式如下:10OOE00 H + 92BBOH = 10939B0 H,即B0 39 09 01
10OOE00 H + 92BDOH = 10939D0 H,即D0 39 09 01
在下图中,观察位置8A113 H 和8A119 H处的数据,确认增加的程序代码的数据地址是B0 39 09 01和D0 39 09 01。
至此,完成参数相对地址的计算。
在这里插入图片描述
机器语言:6A 00 B8 D0 39 09 01 50 B8 B0 39 09 01 50 6A 00
FF 15 04 14 00 01 C3

对应的汇编语言是:
6A 00 PUSH 0
B8 D0390901 MOV EAX,OFFSET 010939D0
50 PUSH EAX
B8 B0390901 MOV EAX,OFFSET 010939B0
50 PUSH EAX
6A 00 PUSH 0 ; hOwner = NULL
FF15 04140001 CALL DWORD PTR DS:[<&USER32.MessageBoxW> ;
C3 RETN
7.在ollydbg.exe中, 找到程序的入口函数地址,准备调用执行我们的代码:
在这里插入图片描述
8.在010 Edito.exe中, 参照上图,找到程序的入口函数位置(可以计算地址最快),进行编辑:
在这里插入图片描述
在这一段代码(33845 H):E8 BF 05 00 00 E9 4D FD FF FF中插入E8 C1 68 05 00,并更改即:E8 BF 05 00 00 E8 C1 68 05 00 E9 48 FD FF FF,调用执行我们的代码。
我们的程序地址C1 68 05 00对应的是 000568C1 H(运行时的地址,不是EXE中的地址,需要计算公式,道理同上省略)
在这里插入图片描述
这段机器指令是:
E8 BF 05 00 00 E8 C1 68 05 00 E9 48 FD FF FF

对应的汇编命令是:
E8 BF050000 CALL 01034809
E8 C1680500 CALL 0108AB10
E9 48FDFFFF JMP 01033F9C

再次看一下我们的程序的位置( 8A110 H ),也就是第2图:
在这里插入图片描述
9.在010 Edito.exe中, 保存程序并运行,先弹出对话框后启动游戏程序:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40554560/article/details/102760420