如果您不需要当前程序的所有状态(例如堆栈状态、寄存器值或打开句柄),那么您可以尝试转储到新的可执行文件并将 EntryPoint 设置为当前 EIP。OllyDumpEx ( https://low-priority.appspot.com/ollydumpex/ ) 通常用于恶意软件分析。尽管它的名字,它是 OllyDbg、IDA、x64dbg 和 WinDbg 的插件。
如果您确实需要某些程序状态,您可以添加自定义 EntryPoint 函数或设置它的指令集。
理论上,以下应该有效(对于单线程 32 位进程)...
您需要保存用户代码(例如调用 VirtualAlloc、HeapAlloc 或 malloc)在堆上分配的处理器状态、堆栈和任何部分。您还需要找到一个位置来插入一些设置说明。
首先,当您在调试器中启动您的进程时,查看内存映射/段(在 IDA 中,我相信它在菜单 View > Open Subview > Segments 中)并记下它们(或截取屏幕截图以供参考)。
接下来,将程序运行到您想要将其移动到其他系统的程度。现在再次查看内存段并注意堆下的哪些是新的。还要记下指令指针的当前地址。
现在要保存处理器状态,您可以使用 PUSHAD 和 PUSHFD 指令。找到一个长度至少为 7 个字节的代码洞。编辑字节并将它们更改为 0x60 0x9c,然后将指令指针更改为指向插入这两个字节的地址。现在单步两次。这将执行保存通用寄存器(包括堆栈指针)和标志的 PUSHAD 和 PUSHFD。现在将这些相同的字节编辑为 0x9d 0x61 0xEA 。最后,将指令指针更改为指向插入这些字节的地址。
运行 OllyDumpEx 插件。在List section选择下All memory,然后单击ReScan memory按钮。现在选中旁边的框Auto Adjust Image Base Address。然后点击Get EIP as OEP按钮。
现在,在对话框底部的部分列表中,应该已经选择了几个部分。保持那些被选中。另外选择与堆栈和堆相关的任何内容。现在点击Dump按钮。这可能需要一些反复试验。
注意:如果您的进程是多线程的,那么这将不起作用。还需要保存特定于线程的状态,但我不确定如何做到这一点。