运行为x86未受保护的保护模式构建的代码

时间:2013-07-02 20:26:03

标签: x86 paging reverse-engineering qemu protected-mode

我目前正在尝试对一个似乎是针对x86 未受管保护模式构建的程序(~30KB,主要是代码)进行逆向工程。它包含直接访问物理内存(或内存映射设备寄存器更精确)的指令,例如:

mov esi, 0FED400000h ; Some device base address
mov eax, [esi+18h]   ; Memory mapped status register of said device

我想在 QEMU 中运行该程序,理想情况下可以在gdb等调试器中逐步执行该程序。

现在的问题是代码中编码的绝对内存地址导致任何启用了分页的操作系统出现分段错误。

我一直在想办法绕过这个:

  • 使用/ dev / mem上的mmap将物理内存映射到用户空间,并在用户空间中运行该程序。虽然这允许访问物理内存,但是需要修补分析程序中的硬编码内存地址,因为映射地址与物理地址不同。由于大量编码的绝对地址,这似乎不太可行。
  • 安装分段错误处理程序,尝试通过重写地址来修复非法内存访问。然后在用户空间中运行该程序。
  • 编写一个引导加载程序,将程序代码从磁盘加载到内存中,进入保护模式(包括设置GDT)并跳转到它。由于我从未编写任何类似的代码,我甚至不确定这是否有效。

到目前为止,我还没有其他选项可以运行这个程序吗?或者您对上述想法有任何建议,补充或经验吗?

1 个答案:

答案 0 :(得分:1)

我见过的几个SINIT模块在条目处有一个小的实模式加载器部分,它解析并跳转到嵌入模块末尾的普通PE文件。因此,如果您不需要调试加载程序,则可以提取PE,然后使用支持PE文件的DOS扩展程序之一(例如HX-DOS,WDOSX)从DOS加载和调试它。但请注意,一旦模块运行并发出CLOSE-PRIVATE命令,将无法访问专用TXT寄存器。

BTW,0xFED40000范围似乎属于英特尔的内部TPM(iTPM)。请参阅Linux中的tpm_tis驱动程序。因此,您可以拦截这些访问(使用信号/异常处理程序)并将它们重定向到实际的TPM。