如标题,exe启动时添加messagebox。
思路:修改程序入口地址,改为调用messagebox地址,再jmp回去原来的程序入口地址。
需要注意的是,在文件中的地址和在内存中的地址是不一样的。
以dev c++为例,
Imagebase:100000 OEP:16D320
准备在第一个节的空白区添加。因为可写可读可执行
messagebox调用,有四个参数。call 调用的硬编码E8,jmp 的硬编码为E9。push 的硬编码为6A
所以这个添加的代码雏形:6A 00 6A 00 6A 00 6A 00 E8 00 00 00 00 E9 00 00 00 00 (因为为测试messagebox所以参数为0,0,0,0)
在 400 ——16C800+400 之间的空白处添加
现在就是简单的换算,如果我要得到call的目的地址,即 764F1160,当前地址为 16CBC8
那么E8 后的地址为 :764F1160 - [(16CBC8 + 5) - 400 + 1000](该地址在内存中的偏移) + 100000 = 76283993 小端序:93 39 28 76 则:E8 93 39 28 76
OEP(想jmp目的地址):16D320 在内存中 16D320 + 10000 = 26D320
jmp当前地址:(16CBCD + 5)- 400 + 1000 + 10000 = 26D7D2
那么E9 后的地址为 :26D320 - 26D7D2 = 74E 小端序:4E FB FF FF
则:E9 4E 07 00 00
修改后:
最后一步,修改OEP,将程序入口地址改为写入代码的地址.
在文件中地址 16CBC0 ,在内存中地址 16CBC0 - 400 + 1000 = 16D7C0
保存即可。
本次操作需要注意一点,就是在文件中和在内存中的位置是不一样的。除了 sizeofheader 换算简单一点。其他地方的换算需要考虑每个节的文件偏移和内存偏移。
结果:
先弹出这个界面在,在正常运行软件。