簡體   English   中英

自動將虛擬地址轉換為內存地址?

[英]Automatic Convert Virtual Address to Memory Address?

我正在使用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加載程序),但我怎么能這樣做?

謝謝

虛擬地址是內存地址。
但是如果.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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM