2010-11-23 118 views
0

我使用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加载程序),但我怎么能做到这一点??。

谢谢

回答

2

虚拟地址是内存地址。
但如果.exe有重定位表,它可以重新定位到新的基址,并且如果您的pushcall指令在重定位表中没有条目,则它将被破坏。

另外我不确定你的代码是否正确,因为我看不到代码中的字符串在哪里。

为了确保问题是缺少重定位表项,请尝试以下位置无关的代码:

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 

UPD:作为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] 
+0

2个问题:1 是什么 - (E8 04 00 00 00 //调用$ + 5 + 4 31 32 33 00 //'123',0 6A 00 // push 0) 2 - 如何为重定位表中的推送和调用指令添加条目 – Radi 2010-11-23 13:23:06