我目前正在开发代码模拟器,而不是其他任何东西,使用libemu作为此模拟器的核心。
我唯一想要实现的是将整个PE加载到内存中并让它翻录。
所以我用以下项目构建了一个小TODO列表:
我设法在一天内完成大部分工作。虽然我似乎有正确设置堆栈段的问题。目前,我使用以下代码段设置寄存器:
/* 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
答案 0 :(得分:1)
问题似乎是堆栈处于不同的内存偏移量中。