手动打开 DarkTequila 的包装,难住了。任何人都可以帮忙吗?

逆向工程 ollydbg 恶意软件 开箱
2021-06-21 12:04:43

带 UPX 包装 - 可以看到 0/1 部分

恶意软件使用 UPX 打包 - 可以看到 0/1 部分。

当然,我可以使用工具甚至使用 UPX -d -o flags .exe 来创建一个比例 > 97% 的解压缩副本,但是我想手动解压缩它以继续练习我的技能并变得更好。

使用 OllyDbg 打开 .exe(恶意软件的 MD5:9fbdc5eca123e81571e8966b9b4e4a1e)让我们直接看到 POPAD 指令和堆栈上的几个常见后续调用,这也让我们知道这是典型的 UPX 内容。

问题是,当我跳过 PUSHAD 并执行 MOV 指令时,如果我通过转储跟踪 ESP 寄存器,前四个十六进制转储字节将被清零。

归零字节。

话虽如此,我仍然将 HWBP 设置为访问权限,只是为了看看它会引导我做什么,它让我想到:

硬件断点后

这就是我被难住的地方。如果我尝试单步执行 JUMP 指令,它只会在返回到 PUSH 指令之前转到条件跳转 (JNZ)。我可以手动单击 JMP 指令并再次运行程序,这将引导我进入 CMP ESP、EAX。如果我再运行一次该程序,它会将我带到 0139BC0E,如下所示:

CMP指令后

可能会在程序开始时看到一些 kernel32 函数调用,但老实说,我不确定我是否需要进行解包。我对此表示怀疑。

总而言之,我可以使用一些帮助。

2个回答

这可能会被多次打包或包含额外的混淆或反分析。使用“PUSHAD,ESP 上的断点,运行”方法来查找尾部转换,就像您一样。然后在尾部转换(在您的情况下,JMP 0002A99E)上设置一个断点并运行到该断点。只需一步即可完成 jmp,您将进入 OEP,或进入下一阶段的包装。

确定是否已解压缩的一种方法是此时转储(例如使用OllyDumpEx)并将其加载到您的典型工具(IDA、exeinfo、PEiD 等)中以查看它的外观。

当我使用您的二进制文件执行此操作时,我看到的是一些典型的设置代码,但是在调用 initterm 之后,在 0040A7F2 处有一个使用包含零的内存地址的调用(将鼠标悬停在 dword_xxxx 值上以查看) . 如果您稍微回顾一下,您会看到对 sub_xxxx 的调用,该调用将 dword_xxxx 地址作为参数。深入研究该函数及其调用的函数,似乎对 PE 标头进行了一些解析(请参阅立即数为 5A4Dh 和 4550h 的 cmp)。在恶意软件中,这通常是为了找到 kernel32 或其他模块在内存中的位置。

除此之外,查看导入,您可以看到有对 LoadLibrary 和 GetProcAddress 的引用。如果您查找那些交叉引用(又名外部参照),那么您会发现看起来像是已编码值的函数(一排带有立即数的 xor 指令),因此可能会动态重建 IAT。

这比您通过 UPX 解包阶段所需的信息多,但此恶意软件具有比 UPX 打包更多的反分析技术,因此您可能还有其他问题。实用恶意软件分析的书有你会想下一步该怎么做一个很好的说明,一般是一个很好的参考,但随时如果你想要更多的帮助,开始对stackexchange更多的问题!

因此,对于您的第一个问题,堆栈的最后两个元素为 0,因为PUSHAD将寄存器按以下顺序压入堆栈。EAX、ECX、EDX、EBX、EBP、ESP、EBP、ESI、EDI

由于ESIEDI在您的情况下均为 0,因此堆栈顶部的两个值也为 0。

一般来说,UPX 是最容易解压的一种,因为它不是为安全而设计的,而是为压缩而设计的。

所以到这里的方法,就是找尾跳。这个可以通过后面的零和跳转到远地址来识别。

我不完全明白你的问题,因为你已经发现尾巴跳跃了。请参阅地址001026B1跳转到0002A99E因此,您的程序开始于 0002A99E,这就是您的 OEP。然后就可以去掉硬件断点,在跳转处设置断点,继续运行直到停在JMP处,然后按F7单步调试解压后的程序。