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

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

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

#1 楼

在大多数情况下,恶意软件会执行类似的操作,仅仅是为了使调试更加困难。因此,您可以轻松地在注入过程中断点并将其重定向到另一个过程。确保同时重定向内存写/注入和代码执行。

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

如果您有兴趣,也可以调试iexplore.exe。您需要将其杀死,然后从ollydbg中重新打开。字节到jmp self(x86 / 64字节是EB FE),然后让恶意代码在该循环中执行,暂停进程,在跳转自循环上放置一个断点,然后手动将其替换为原始代码。这是另一个常见的技巧。

评论


我经常更改pid,以使恶意软件注入记事本实例。当您首先在Olly中打开进程时,可以将其设置为在线程创建时停止。

–诺德瓦尔德
17年3月12日在16:13

是的,为此很多人都喜欢notepad.exe。 idk为什么我使用calc但我总是这么做,所以我坚持使用它:)

– NirIzr
17年3月14日在9:31

#2 楼

大多数情况下,恶意软件会将自己注入另一个进程时,它将调用“ SetThreadContext”来设置CONTEXT结构。您可以通过CONTEXT结构中的“ eax”成员轻松获得目标进程的“ oep”。 “ oep”代表目标进程恢复时的原始地址,您可以在“ oep”处进行循环,以便目标进程始终在循环中运行。但是如何在“ oep”中进行循环? >
恶意软件通常调用“ WriteProcessMemory”将代码写入目标进程。“ WriteProcessMemory”的第二个参数是“ lpBaseAddress”,这意味着该代码在目标进程中的起始位置。第三个参数是“ lpBuffer” ,它代表包含此代码的缓冲区。

您可以轻松计算“ oep”和“ lpBaseAddress”之间的偏移量,然后,如果offset> 0以及offset <参数“ nSize” ,将偏移量添加到“ lpBuffer”,您将在缓冲区中获得包含“ oep”代码的地址。例如,targ的“ oep” et process是0x401000,参数“ lpBaseAddress”是0x400000,参数“ lpBuffer”是0x120000,因此该地址在缓冲区中包含“ oep”代码是0x401000-0x400000 + 0x120000 = 0x121000。

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

现在您可以将其与OllyDbg相连并开始工作!

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

评论


不赞成投票,因为此答案包含错误的事实。 Windows中有许多API函数,可以进行进程注入。有趣的是,仍在发现用于代码注入的新技术。例如QueueUserAPC +共享节或Atombombing。当然,您也可以使用ntdll函数,例如NtWriteVirtualMemory和其他函数。

–诺德瓦尔德
17年3月13日在12:51

另请注意,始终通过将前两个字节修补到EB FE来归档“ jmp本身”(非常常见)

–诺德瓦尔德
17年3月13日在13:05

我的错是我没有考虑其他情况,例如Atombombing,Shared Section。我的意思是,您可以将注入定位过程的代码条目更改为“ jmp本身”,即将前2个字节修补到EB FE。我认为在注入之前很容易做到这一点,不仅在使用WriteProcessMemory时,而且在使用其他方式时也是如此。

– C0rK1
17 Mar 14 '17:40



我并不是要冒犯您,我只是不希望有一些差距的答案成为评分最高的答案。如果您稍加修改,我会再次投票;)

–诺德瓦尔德
17年3月14日在6:11