我正在使用c#来读取exe文件并注入代码以在exe运行时显示消息框,因此我使用的代码如下:
6A 00 //push 0
68 OXxxxx //push Address of Message Title
68 OXxxxx //push Address of Message Body
6A 00 //push 0
FF 15 OXxxxx //Call Address of User32.MessageBoxA
E9 OXxxxx // jmp to old entry point
我使用的所有地址都是虚拟地址,但新的exe不能运行,我认为地址应该转换为内存地址(通过Windows加载程序),但我怎么能这样做?。
感谢
答案 0 :(得分:2)
虚拟地址是内存地址
但是,如果.exe具有重定位表,则可以将其重定位到新的基址,如果您的push
和call
指令在重定位表中没有条目,则它将被破坏。
此外,我不确定您的代码是否正确,因为我看不到代码中使用的字符串在哪里。
要确保重定位表中缺少条目,请尝试以下与位置无关的代码:
6A 00 // push 0
6A 00 // push 0
E8 04 00 00 00 // call $+5+4
31 32 33 00 // '123', 0
6A 00 // push 0
68 XX XX XX XX // push user32.MessageBoxA address, it's the same in all processes
C3 // retn
E9 XX XX XX XX // jmp OEP
更新如ruslik所述,如果我们修补文件,我们就不知道 user32.MessageBoxA 地址,所以我们应该在其他方式。
如果我们知道其IAT条目的地址,我们应该将FF 15 (__imp_MessageBoxA)
替换为独立的基础:
E8 00 00 00 00 // call base:
base:
58 // pop eax
05 XX XX XX XX // add eax, __imp_MessageBoxA - base
FF 10 // call dword ptr [eax]