我目前正在开发一个代码模拟器,主要是为了好玩,而不是为了其他任何事情,使用 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/