UPX打包了恶意软件-可以在部分中看到0/1。

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

打开.exe(针对恶意软件的MD5:9fbdc5eca123e81571e8966b9b4e4a1e) OllyDbg使我们直接进入POPAD指令,并在堆栈上进行了几次常规的后续调用,这也使我们知道它是典型的UPX东西。

问题是,当我越过PUSHAD并着陆时MOV指令中,如果我通过转储遵循ESP寄存器,则前四个十六进制转储字节将清零。



这样,我仍然设置HWBP在访问时只是想知道它会导致我什么,而这使我想到了:



这就是让我感到困惑的地方。如果我尝试逐步执行JUMP指令,它将仅返回到条件跳转(JNZ),然后再返回到PUSH指令。我可以手动单击指向JMP指令的方式,然后再次运行该程序,这将导致我进入CMP ESP EAX。如果我再次运行该程序,它将带我到0139BC0E,它看起来像这样:



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

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

#1 楼

它可能被打包多次或包含其他混淆或反分析。使用“ 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上提出更多问题!

#2 楼

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

由于ESIEDI均为0,因此堆栈顶部的两个值也均为0。 />
通常,UPX是较容易解压缩的工具之一,因为它不是为安全而设计的,而是为了压缩而设计的。

所以要走到这里的方法是找到尾巴跳。可以通过以下零和跳转到一个远地址来识别该地址。

由于您已经找到了尾部跳转,所以我并没有完全理解您的问题。参见地址001026B1跳转到0002A99E。因此,您的程序从0002A99E开始,这就是您的OEP。然后,您可以删除硬件断点,在跳转处设置断点,继续运行直到它在JMP处停止,然后再按F7键以调试解压缩的程序。

评论


抱歉给您带来任何混乱。我想找出的是,我怎么知道何时解压缩程序并准备将其转储以使用Import Reconstructor进行重建?例如,我尝试遵循您的建议在清除先前的断点后在JMP指令上设置断点,但是我应在该JMP指令上设置哪种类型的断点?选项包括:切换,条件日志,条件日志,运行选择,内存(访问),内存(写)和硬件(执行)。

–ajdbnabad13
18/12/8在7:35

到达jmp的断点时,程序已准备就绪。您不必一定要使用Import Reconstructor,OllyDbg可以转储该过程并使用名为“ OllyDump”的插件创建导入表。一个简单的断点就足够了,因此在突出显示目标行时按F2或右键单击并选择切换断点。

– Pudi
18/12/8在11:01

谢谢您到目前为止的知识,我正在学习很多东西。因此,我在JMP指令上切换了断点,然后按F7进入该断点,它使我转到该图像上方可以看到的条件跳转(JNZ)。此时,我该怎么办?我尝试从此突出显示的条件跳转中使用OllyDump转储该程序,它表明它无法读取调试过程的内存以及错误的DOS签名。我们是否在程序中处理的混淆比UPX还要多,还是有条件的jmp并不是转储程序的正确位置?

–ajdbnabad13
18/12/8在17:12



可能的问题是,您的指令指针没有指向无条件跳转的指令。由于硬件断点而导致程序停止后,需要在JMP处设置断点,然后继续运行(F9),直到程序再次在JMP处停止。然后,您可以按F7或F8进入解压缩程序的第一条指令。顺便说一句,谷歌“ ollydbg upx解压缩”或类似的东西,外面有一些很好的教程,应该可以解决您的问题。

– Pudi
18/12/8在17:33

我认为该恶意软件尤其在使用反VM /调试功能。我已按照您的指示进行操作,但我仍然无法解决问题/无法获得用于转储进程的内存。我尝试也使用cmd中的UPX自动将其转储,并且在执行时会引发访问冲突。奇怪...不太确定如何进行。

–ajdbnabad13
18/12/11在8:36