我发现越来越多的二进制文件被打包有exe保护程序(例如upx,aspack等)。我尝试遵循一些教程来解压缩它们,但是示例通常很容易,而我的目标却没有。

我正在寻找良好的资源以及有关如何解包目标的任何提示/技巧。

评论

lena教程将通过许多包装工中使用的许多技术进行工作。有一些教程更着重于破解,但这些教程通常也有很好的信息。

您是否了解以下内容:以太网:通过硬件虚拟化扩展进行恶意软件分析

#1 楼

打开通用包装封隔器或密码器的包装通常涉及以下步骤:

1。跟踪代码,可能会逃避或绕过反调试检查。

使用简单的打包程序并不难,但对于更高级的打包程序可能会很棘手。他们可能会使用时序检查(rdtsc),基于异常的控制传输,使用调试寄存器进行计算等。在这里使用VM或仿真器通常可以帮助解决大多数问题。

2。查找原始入口点(OEP)

有很多方法可以做到这一点。有时,在遵循大量循环代码并且没有合理照顾的情况下,跳到OEP的过程很明显。或者,如果您熟悉不同编译器生成的入口点,则可以在OEP上识别代码。其他一些技巧:


如果打包程序在拆包之前保存了原始寄存器,请在堆栈中的位置上设置硬件断点-这样一来,您将在恢复它们时立即中断在跳转到OEP之前。
如果在跟踪过程中可以识别正在写入解压缩代码的内存,请在该内存范围内设置页面执行断点-跳转后将触发。 IDA允许您设置这样的断点,我想也可以使用OllyDbg。
在启动代码使用的常见API上设置断点,例如GetCommandLineGetVersionEx。这不会为您提供确切的OEP,但是通常您可以返回调用堆栈,或多或少地轻松找到它。

3。转储解压后的代码

如果您使用的是IDA,则实际上不需要将文件转储到单独的文件中-只需创建一个内存快照即可将字节从内存复制到数据库,以便您稍后进行分析。这里要记住的一件事是,如果打包程序使用了动态分配的内存,则需要将其标记为“ loader”,以便将其包含在快照中。更多内容。

4。恢复导入

我不太了解在Olly或其他调试器中如何完成此操作,但是AFAIK您需要在转储上使用ImpREC之类的工具,并在内存中使用该进程的副本。

它要简单一些(IMO )。您只需要找到导入表并根据它们当前指向的功能来重命名指针(这应该在调试器处于活动状态时完成)。您可以使用renimp.idc脚本或UUNP“手动重构功能”(请参见此处)。

为了找到导入表,有时会使用两个技巧:


请遵循OEP在启动代码中的一些调用来查找外部API,这将使您进入导入表。通常,表的开始和结束都很明显。
在解压缩过程中,在GetProcAddress上设置一个断点,然后查看将结果写入何处。但是,这对于使用通过导出目​​录使用手动导入结果的打包程序不起作用。将read BP放在kernel32的导出表上可能会有所帮助。

5。清理

这是可选的,但删除仅会分散您注意力的打包程序代码的剩余部分可能很有用。在IDA中,如果识别出所使用的编译器,还应该应用编译器FLIRT签名。

6。制作解压缩的可执行文件

我不需要执行此步骤,因为我很少需要运行解压缩的文件,但是通常您通常需要修复PE标头,以使文件中该部分代码的偏移量匹配转储中的文件。


现在,上述步骤未涵盖许多变体和技巧。例如,某些包装商最初并没有完全解决导入问题,而是跳到了在首次调用时解决导入问题的存根,然后对其进行了修补,以便下次直接进入目标。然后是“被盗代码”方法,这使得查找和恢复OEP变得更加困难。有时,打包程序将运行其自身的副本并对其进行调试,以使您无法将自己的调试器附加到该副本上(​​可以通过使用仿真器或不使用调试API(如Intel PIN)的调试器来解决)。尽管如此,概述的步骤仍可以涵盖其中的很多内容。

我将以Elias制作的视频作为结尾,该视频展示了拆开Lighty Compressor的过程:https://www.hex-rays .com / video / bochs_video_2.html

评论


好的答案(+1),毫无疑问,IDA在RCE中通常起着很大的作用,但是我认为您不应该将答案仅限于IDA(是的,我看到了提到ImpRec和OllyDbg)。

– 0xC0000022L♦
13年3月22日在22:54

@ 0xC0000022L:不幸的是,我对OllyDbg中的拆包并不熟悉,我只在理论上知道它。但是我认为我的大部分答案都可以与任何调试器一起使用(实际上,我完全不会说它仅限于IDA)。不过,您可以添加自己的答案,特别是关于在OllyDbg中解包!

–伊戈尔·斯科钦斯基♦
13年3月22日在23:26

一个不错的答案,这是一个工具:ether.gtisc.gatech.edu

–吉列什·乔汉(Grijesh Chauhan)
2013年4月9日4:23在

@IgorSkochinsky我真的很高兴您在这里介绍了IDA,因为坦率地说,在Tuts4You和其他地方的Olly / x64中有大量有关如何执行此操作的信息,但是在IDA Pro中却没有太多的信息。我为此感到非常感谢,因为我学会了在IDA Pro中完全解决此问题的全新方法。您对IDA Pro的解决方案是否比本帖子(插件/博客/等)还要新?谢谢你,伊戈尔。

–the_endian
17年11月22日在9:31

#2 楼

伊戈尔的答案很好。但是,概述的技术基于这样的假设,即在某个时候可执行文件已在内存中解压缩。这并非总是如此。虚拟化混淆器在运行时由模拟器执行时,会将原始二进制文件编译为自定义指令集。如果遇到以这种方式混淆的二进制文件,则别无选择,只能将反汇编程序从自定义指令集编写为您理解的指令集。

评论


是的,我提到我在谈论包装封隔器。

–伊戈尔·斯科钦斯基♦
13年3月22日在10:42

好吧,从技术上讲,甚至VM保护器都将文件解压缩到内存中,也就是说,它们仍然可以作为“包装程序”。唯一的区别是,要理解受VM保护的代码要困难得多,即使这些代码“是普通的”。

– newgre
13年4月2日在22:06

@newgre:但是,并不是所有人都可以一次解压缩所有东西。因此,您可能只剩下零碎的东西。

– 0xC0000022L♦
13年4月3日在17:31

哪些VM加壳程序可以这样做?

– newgre
13年4月6日在14:47

newgre您能解释一下,当内存中唯一的东西是用于随机指令集的字节码时,Igor处理的第3步是如何实现的?转储以这种方式保护的可执行文件的唯一方法是为字节码编写反汇编程序。

– 94c3
13年4月7日在18:38

#3 楼

Blackstorm门户网站包含大量拆箱教程
Blackstorm门户网站教程

Tuts4您还拥有大量拆箱教程
Tuts4You

我花了很长时间起初时间很长,但随着时间的流逝,拆箱变得容易得多,但是需要很多耐心和实践。