我目前正在開發一個代碼仿真器,它比其他任何東西更有趣,使用libemu作爲此仿真器的核心。在內存中加載PE以進行仿真
我真正想要實現的唯一的事情是將整個PE加載到內存中並讓它撕裂。
所以我建立與下列項目有點TODO列表:
- 讀頭◦Check如果PE是有效的(x86平臺)
- 提取所需的數據設置的內存段
- 將所有導入的函數掛鉤到我的自定義API。
- 將EIP正確
- 工作構建堆棧段(設置ESP和EBP)
- 設置EFLAGS
我已經成功地獲取其中的大部分在一天之內完成的。雖然我似乎有正確設置堆棧段的問題。目前我使用以下代碼段設置我的寄存器:
/* Set Registers */
entry_point = pe->nt_header->AddressOfEntryPoint;
emu_cpu_eip_set(cpu, entry_point);
emu_cpu_reg32_set(cpu, eax, 0x00
emu_cpu_reg32_set(cpu, ecx, 0x00);
emu_cpu_reg32_set(cpu, edx, entry_point);
emu_cpu_reg32_set(cpu, ebx, 0x00);
emu_cpu_reg32_set(cpu, ebp, (0x0095f000 - 0x1000/2));
emu_cpu_reg32_set(cpu, esp, emu_cpu_reg32_get(cpu, ebp));
emu_cpu_reg32_set(cpu, esi, 0x00);
emu_cpu_reg32_set(cpu, edi, 0x00);
emu_cpu_eflags_set(cpu,0x0000246);
我想這個問題在ebp寄存器內。這些值似乎很奇怪,但PyEmu似乎也使用它們。我認爲這個問題存在於堆棧的使用中的原因是,它是硬編碼的,第二個崩潰的代碼是83 65 f8 00,在彙編程序中轉換爲00692D67和dword ptr [ebp-8],0。
我認爲使用NTLoader爲PE文件設置了堆棧。但我似乎無法找到它或有關此文件。
任何關於如何繼續的指針將真的很感激。
- 羅賓
PS。 我已經在一些板子上發佈了這個帖子,以增加答案的機會。我讀過很多有關加載PE文件的舊文檔,但都只是指向標題中的SP段。但因爲這不是ESP,我懷疑它是堆棧的基礎(EBP)。
一個交叉後可以在OpenRCE發現:http://www.openrce.org/forums/posts/2171 其他交叉後可以在Sysinternals的發現:http://forum.sysinternals.com/topic28898_post138041.html#138041
@Downvoter關注添加評論你爲什麼這麼低估?通過這種方式,OP可以在必要時改進問題。 ;-) – siebz0r
@Stolas你曾經寫過關於這項工作的博客文章嗎?或者你有一些很好的參考分享?我正在尋找一個非常類似的解決方案,在虛擬的非Windows環境中加載win32-dll並調用一些函數 – Alex
@Alex沒有抱歉。 – Stolas