在内存中加载PE进行仿真

时间:2012-12-14 09:30:53

标签: x86 kernel emulation portable-executable

我目前正在开发代码模拟器,而不是其他任何东西,使用libemu作为此模拟器的核心。

我唯一想要实现的是将整个PE加载到内存中并让它翻录。

所以我用以下项目构建了一个小TODO列表:

  • 读取标题◦检查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在汇编程序中。< / p>

我认为使用NTLoader为PE文件设置堆栈。但我似乎无法找到它或关于此的文档。

关于如何继续的任何指示都会非常感激。

  • 罗宾

PS。 我已经在几块板子上发布了这个,以增加回答的机会。我已经阅读了很多关于加载PE文件的旧Windows文档,但它们都只是指向标题中的SP段。但由于那不是ESP,我怀疑它是堆栈的基础(EBP)。

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

1 个答案:

答案 0 :(得分:1)

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