如何调试将自身注入另一个进程的恶意软件?

逆向工程 ollydbg 调试 恶意软件 注射
2021-06-27 09:41:35

我是逆向工程领域的新手,如果这是一个愚蠢的问题,我很抱歉。

我必须为我的学士论文分析一些恶意软件,我目前正在尝试对一种名为“Dexter”的恶意软件进行逆向工程,它是一种销售点恶意软件。

现在我的问题:
经过一些静态分析后,我使用 OllyDbg 调试 Dexter,但恶意软件正在将自身注入iexplore.exe进程,而恶意软件的原始进程正在终止自身。如何调试 iexplore.exe 进程中注入的代码?我知道您可以将 OllyDbg 附加到正在运行的进程,但我无法在内存映射中真正找到注入的恶意软件代码。

2个回答

大多数情况下,恶意软件会做类似的事情只是为了让调试变得更加困难。因此,您可以轻松地在注入程序上设置断点并将其重定向到另一个进程。确保重定向内存写入/注入和代码执行。

将其重定向到同一进程可能会起作用,但也可能会导致问题。创建调试创建的虚拟进程(我经常使用calc.exe)可能是合理的,让恶意软件注入该进程而不是原始目标,然后BP注入的代码并让它运行。

如果您有兴趣,也可以调试 iexplore.exe。您需要杀死它,然后从 ollydbg 中重新打开它。

编辑:您可以按照 C0rK1 在他的回答中建议的那样更改目标进程,并将前两个字节修改为jmp self(x86/64 字节是EB FE),然后让恶意代码在该循环中执行,暂停进程,放置一个跳转自循环上的断点并手动替换为原始代码。这是另一个常见的技巧。

大多数时候,当恶意软件将自己注入到另一个进程中时,它会调用“SetThreadContext”来设置CONTEXT结构。通过CONTEXT结构中的“eax”成员,您可以轻松获取目标进程的“oep”。 “oep”代表目标进程恢复时的原始地址,你可以在“oep”处做一个循环,这样目标进程就会一直在循环中运行。但是如何在“oep”中做一个循环呢?

恶意软件通常调用“WriteProcessMemory”将代码写入目标进程。“WriteProcessMemory”的第二个参数是“lpBaseAddress”,表示这段代码在目标进程中的开始位置。第三个参数是“lpBuffer”,它代表缓冲区包含此代码。

你可以很容易地计算出“oep”和“lpBaseAddress”之间的偏移量,然后,如果偏移量>0并且偏移量<参数“nSize”,将偏移量添加到“lpBuffer”,你会得到地址包含“oep”缓冲区中的代码。

例如,目标进程的“oep”为0x401000,参数“lpBaseAddress”为0x400000,参数“lpBuffer”为0x120000,因此缓冲区中包含“oep”代码的地址为0x401000-0x400000+0x1000x1002

然后,您可以将包含“oep”的地址中的指令更改为“jmp本身”(即修补前2个字节到EB FE)。在上面的示例中,它是“jmp 0x121000”。调用“WriteProcessMemory”和“SetThreadContext”后”,你会看到代码在目标进程的“oep”处循环运行,因为指令更改为“jmp oep”,在上面的例子中它是“jmp 0x401000”。目标进程“停止”。

现在您可以使用 OllyDbg 附加它并开始您的工作!

在某些情况下,恶意软件会通过共享节、原子弹等其他方式将自身注入目标进程。现在在这些情况下您可能找不到“WriteProcessMemory”,但您会发现恶意软件使用其他方式注入代码。因此您可以更改通过将前 2 个字节修补到 EB FE 将代码注入目标进程,目标进程将在与第一种情况相同的循环中运行。