簡體   English   中英

將x86代碼注入x64進程

[英]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體系結構拋出了所有INCDEC操作碼,以便用REX前綴替換它們,而指令本身被替換為兩字節的等效項。 這意味着,如果您的x86代碼包含編碼為一個字節的INCDEC ,則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.

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