自动将虚拟地址转换为内存地址?

时间:2010-11-23 06:39:37

标签: assembly x86

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

感谢

1 个答案:

答案 0 :(得分: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

更新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]