[英]inject x86 code into x64 process
我正在使用x86 dll注入器,我想將x86代碼注入到x64進程線程中並執行它。 首先,我無法在x64進程上調用CreateRemoteThread ,從而導致錯誤代碼5。然后,我找到了這個技巧,並且能夠使用它創建遠程線程。 但是,當我嘗試使用ResumeThread並在x64進程內執行該x86代碼時,整個進程將崩潰。
將x86注入x86效果很好,問題僅在於x86到x64。
所以,我的問題是-是否可以模擬並運行在x64進程中復制的x86代碼? 我知道執行此操作的一種方法是擁有相同代碼的兩個版本,然后根據遠程進程的體系結構選擇一個版本,但是我認為這樣做並不是最好的方法。
謝謝。
段選擇器確定位數,因此您要做的就是使用正確的段選擇器進行“某種形式的遠跳”。 當使用64位時,已經沒有太多方法可以做到這一點。 retf
仍然有效。
未經測試,但您明白了:
sub rsp, 8
mov dword [rsp+4], 0x23 // 32 bit segment selector
mov dword [rsp], offset some32bitcode
retf
就是這樣,您現在處於32位模式。 這可能會導致嚴重損壞(尤其是如果您嘗試調用任何Windows函數),但是您可以- 可以做到(只是不要這樣做)。
您可以更輕松地切換回:
jmp far 33h:some64bitcode // 64 bit segment selector
在64位模式下,無法直接跳遠。 間接的遠距離跳轉/遠距離調用仍然存在,並且遠距離返回也很明顯是間接的。
23h和33h是windows的值,在其他操作系統上可能是(可能是)不同。
當然,這仍然意味着您必須以不同的方式處理64位進程。
您不能在x64進程中運行x86代碼,反之亦然。 期。 操作系統根本不允許這樣做。 您只能將x86代碼注入x86進程,而只能將x64代碼注入x64進程。
我真的懷疑這是否可以正常工作。 請記住,AMD64體系結構拋出了所有INC
和DEC
操作碼,以便用REX前綴替換它們,而指令本身被替換為兩字節的等效項。 這意味着,如果您的x86代碼包含編碼為一個字節的INC
或DEC
,則CPU在x64中工作時,會將其視為REX前綴,並將嘗試將指令流中的下一個字節解碼為普通指令,由於指令被解碼為不合理的內容,因此肯定會導致一般的保護錯誤或類似的錯誤。
這是一個例子。 假設我想使用以下代碼(NASM)循環訪問數組。
bits 32
mov ecx, 200
myloop:
dec ecx
mov eax, [myarray+ecx*4+0x100]
jnz myloop
myarray resb 10
將其編譯為平面二進制文件並分解為64位代碼后, ndisasm
返回以下內容:
00000000 B9C8000000 mov ecx,0xc8
00000005 498B048D0F010000 mov rax,[rcx*4+0x10f]
0000000D 75F6 jnz 0x5
如您所見,“循環”不再是真正的循環,因為它的計數器永遠不會減少,並且跳轉會根據最后修改零標志的指令進行。 這清楚地表明,指令解碼器在32位和64位模式下的工作方式有很大不同,有效地使您無法在以64位模式運行時運行匯編為32位的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.