x86 - 将 PE 加载到内存中进行仿真

标签 x86 kernel emulation portable-executable

我目前正在开发一个代码模拟器,主要是为了好玩,而不是为了其他任何事情,使用 libemu 作为这个模拟器的核心。

我真正想要实现的唯一一件事就是将整个 PE 加载到内存中并让它撕裂。

所以我建立了一个包含以下项目的小 TODO 列表:

  • 读取 header 检查 PE 是否有效(x86 平台)
  • 提取所需的数据来设置内存段
  • 将所有导入的函数 Hook 到我的自定义 API。
  • 设置 EIP 使其正常工作
  • 构建堆栈段(设置 esp 和 ebp)
  • 设置标志

我设法在一天内完成了大部分工作。尽管我似乎在正确设置堆栈段方面遇到问题。目前我使用以下代码段设置寄存器:

/* 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。

我认为堆栈是通过使用 PE 文件的 NTLoader 设置的。但我似乎找不到它或有关此的文档。

任何有关如何继续的指示都将非常感激。

  • 罗宾

ps。 我已将其交叉发布在几个板上等以增加获得答案的机会。我读过很多关于加载 PE 文件的旧 Windows 文档,但它们都只是指向 header 中的 SP 段。但由于那不是 ESP,我怀疑它是堆栈的基础 (EBP)。

在 OpenRCE 上可以找到一个交叉帖子:http://www.openrce.org/forums/posts/2171 另一个交叉帖子可以在 SysInternals 中找到:http://forum.sysinternals.com/topic28898_post138041.html#138041

最佳答案

问题似乎是堆栈位于不同的内存偏移中。

关于x86 - 将 PE 加载到内存中进行仿真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13875908/

相关文章:

visual-c++ - _umul128 在 Windows 32 位上

c - GCC 是否为静态分支预测生成次优代码?

c - diStorm库,反汇编CALL指令

linux - 如何在 Linux 中停止/禁用 IPI(进程间中断)?

linux - 如何初始化semaphore.h?

如果在处理时单击,Android 模拟器会崩溃

assembly - 这两个汇编代码段有什么区别?

linux - put_user() linux 内核

java - 安卓模拟器 : Unable to start webcam to capture picture in emulator

macos - 在 Mac Firefox 中测试站点