如何包装转储进程并在另一台 PC 上执行它

逆向工程 艾达 视窗 倾倒 可执行程序
2021-06-16 12:02:46

我在 Ida 中调试 exe 文件,并将断点放在某个地址中。

我想创建这个进程的转储,我可以从我用 breakPoint 暂停它的那一点开始在另一台 PC(没有 Ida)上继续运行它。简单地从 cmd 或从 c/cpp/c# 代码运行它,而不是从 Gui

如果它可以通过我想要:

  1. 在我继续在另一台 PC 中运行它之前,在特定地址中编辑值

  2. 运行这个过程,直到到达指定地址,然后查看指定地址中的thr值。

CreateRemoteThread 当然对我不好。

VM 对我没有帮助,因为我想将它与没有 VM 的代码合并。

请问我该怎么做?谢谢

1个回答

如果您不需要当前程序的所有状态(例如堆栈状态、寄存器值或打开句柄),那么您可以尝试转储到新的可执行文件并将 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按钮。这可能需要一些反复试验。

注意:如果您的进程是多线程的,那么这将不起作用。还需要保存特定于线程的状态,但我不确定如何做到这一点。