[英]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有重定位表,它可以重新定位到新的基地址,如果你的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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.