|
在图中我们可以看到 API report ,80000003 也在其中。我们同样也可以看到report 的产生出406217(第一个INT 3的地址)。
看起来我们已经进入正轨了当父进程第一次接收到来自子进程的一个INT 3,它解码了一张report,这张report存储了所有INT 3需要的信息。这些信息可以被另存于任何一个安全的地方,以方便我们需要时直接查阅而不必重新启动父进程。
接下来的条件跳转,第二次来到这里时要留心,我们没有进入到decrypt routine。

我并不关心Armadillo解码report的方法, 我只是想知道解码后的值, 所以我将要喘口气然后直接解释如何做。
这是最有趣的一个section。 它需要 API GetThreadContext 去读取子进程的 EIP和标志寄存器的状态。在那儿BPX 然后继续直到你来到API。
用F8跟踪运行API,然后你将会看到下一行存有关于此API的信息。
005C5E4F 8B95 E0F3FFFF MOV EDX,DWORD PTR SS:[EBP-C20]
在这一行右击鼠标选择 FOLLOW IN DUMP-MEMORY ADDRESS 你将会看到这个API数据信息。

如果我们看一下dump下来的程序,在第一个INT 3发生时,我们可以看到EIP的值是406218,标志寄存器EFL的值是00000202。
下面这张图片来自子进程,停在了第一个INT 3上。

正如你看到的接下来几行代码就在处理这些值,在Table 1中查看这个INT 3。 现在我们来看 Table 1。

运行到ECX 获得Table 1的起始值的那一行停下,Table 1包含了每一个INT 3的内存地址。
如果我到了这一行,再运行一下, ECX 会获得 table 1的起始值,在我的机器里如图:

在ECX上右击鼠标选择FOLLOW IN DUMP 到窗口去看Table 1。
TABLE 1

这张表将会非常有用。稍稍向下翻页我们将会看到我们当前所处的INT 3的地址值,但是在表中这个值是紧接着INT 3的下一个地址值。这对于我们通过patch 或者使用工具修复nanomites 非常有用。

这儿你可以看到我所说的。这就是INT3的下一条指令地址。当父进程接收到INT 3时它就把子进程的EIP和这张表进行比较,以此获得子进程当前的地址以及从section开始的INT 3的数量。
这就是Table 1的一切。现在步进到指向 Table 2的地方。

EAX 包含了Table 2的起始值。当我们运行到这一行时同样在EAX上右击鼠标并选择FOLLOW IN DUMP ,我们将会看到Table 2。
TABLE 2

上一页 1 2 3 4 5 6 下一页 |