2010-11-23 169 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