2012-12-14 18 views
3

我目前正在開發一個代碼仿真器,它比其他任何東西更有趣,使用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

+2

@Downvoter關注添加評論你爲什麼這麼低估?通過這種方式,OP可以在必要時改進問題。 ;-) – siebz0r

+0

@Stolas你曾經寫過關於這項工作的博客文章嗎?或者你有一些很好的參考分享?我正在尋找一個非常類似的解決方案,在虛擬的非Windows環境中加載win32-dl​​l並調用一些函數 – Alex

+0

@Alex沒有抱歉。 – Stolas

回答

1

的問題似乎是,堆棧是在一個不同的內存偏移。