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

我想创建此过程的转储,以便从暂停点开始可以在另一个PC(无Ida)中继续运行它使用breakPoint。
仅通过cmd或c / cpp / c#代码运行它,而不是从Gui运行

如果可以通过,我想:


在我继续在特殊地址中的另一个PC编辑值中运行它之前,请运行该过程,直到它到达特殊地址,然后再在特殊地址中查看thr值。

CreateRemoteThread对我不好当然。

VM不能帮我,因为我想将其与不带VM的代码合并。

我该怎么办?谢谢

评论

如何使用VirtualBox之类的工具来拍摄完整的系统快照,然后可以在其他位置复制和恢复。

@ 0xec因为我想将其与c / cpp / c /#/ java ode合并,而不是通过VM

每个进程都有一个关联的上下文,例如文件句柄,您不能简单地将其复制到另一台PC并期望它们是有效的。 VM快照在复制操作系统的整个状态而不是单个进程时起作用。

@ 0xec我不需要上下文文件句柄,如果我要复制VM快照,将很难使用VM中存在的代码来运行它(快照将占用一些GB),我只需要寄存器和堆栈值即可放置断点

#1 楼

如果不需要当前程序的所有状态(例如堆栈的状态,寄存器值或打开的句柄),则可以尝试转储到新的可执行文件并将EntryPoint设置为当前EIP。 OllyDumpEx(https://low-priority.appspot.com/ollydumpex/)通常用于恶意软件分析。不管它的名字是什么,它都是OllyDbg,IDA,x64dbg和WinDbg的插件。

如果确实需要某些程序状态,则可以添加自定义EntryPoint函数或设置该指令集

从理论上讲,以下应该可以工作(对于单线程32位进程)...

您需要保存处理器状态,堆栈,以及通过用户代码在堆上分配的任何部分(例如,对VirtualAlloc,HeapAlloc或malloc的调用)。您还需要找到一个插入一些设置说明的地方。

首先,在调试器中启动进程时,查看内存映射/段(在IDA中,我相信它在菜单中)查看>打开子视图>分段)并记下它们(或截取屏幕截图以供参考)。

接下来,运行该程序直至将其移至其他系统。现在,再次查看内存段,并注意“堆”下的哪些是新的。还要记下指令指针的当前地址。

现在要保存处理器状态,可以使用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按钮。这可能需要反复试验。

注意:如果您的进程是多线程的,那么它将无法正常工作。将有特定于线程的状态,也需要保存,但是我不确定如何做到这一点。

评论


谢谢您的评论,我不需要打开句柄,但是我需要寄存器值和堆栈值,那么如何加载所有这些值并在另一台PC中重新启动该过程?

–g319909.nwytg.coM
18/12/31在7:09

您的意思是说,一旦进程在断点处暂停,您将复制寄存器值,然后将其用于其他进程吗?

–ismael_akez
19年1月1日在10:10

@ismael_akez是的,当我使用breakPoint暂停该过程时,我想在另一台PC上继续执行该过程,因此我需要复制所有寄存器和堆栈,因为有些寄存器指向堆栈中的地址,并且堆栈很快包含一些重要值。继续在另一台PC上运行,直到它与breakPoint断开。

–g319909.nwytg.coM
19年1月1日在18:01

我认为您应该考虑GetThreadContext,获取重要的值或寄存器,使用SetThreadContext设置值,然后通过将地址分配给EIP来设置ResumeThread。复制堆栈可能不起作用。

–ismael_akez
19年1月2日在4:34



堆栈是一个内存段,因此可以将其转储到新的PE中。根据您使用的转储工具,可能需要花费一些时间(OllyDumpEx)或可能无法完成(原始的OllyDump)。如果对此感兴趣,请告诉我,我将详细信息添加到我的答案中。

–恶意软件
19年1月3日,0:31