[转]分析DoSWF处理过的SWF

最近看到不少SWF是被DoSWF处理过的,给静态分析带来了不少麻烦。尤其是其中的op_li系列的指令,也阻碍了将反编译的code执行下去。看到网上有不少人都问到如何处理这一类sample,下面将自己总结的方法写下来,希望能够有兴趣的朋友共享。
本人使用的方法是基于这样的假设:无论flash packer怎么混淆,最后总会通过loadBytes将原始flash file加载起来。那么,在Flash Player的进程空间中一定可以搜寻到这样的flash file。这种方法并不局限于解决DoSWF混淆的SWF文件,其他的packer也可以对抗。有兴趣的朋友,可以试试。
思路有了,就具体实施。使用Flash Player将混淆后的flash file打开,搜寻FWS/CWS/ZWS起始的memory,就可以找到(可以使用你喜爱的任何一款二进制编辑工具都可以,甚至在windbg里使用s直接search也可以)。FWS的flash file没有经过压缩,文件size可以通过指定的size来确认,但是CWS/ZWS就麻烦许多。这里就不赘述了,因为我们有更方便的工具来解决这些问题。另外多说一句,在搜索前,看看当前flash file的版本信息很有必要,因为绝大多数情况下,混淆以后的SWF不会修改version信息,这就便于我们过滤掉一下干扰信息。
推荐使用FFDec,开源的Flash Decompiler,http://www.free-decompiler.com/flash/。后面,我们就使用这个工具完成上面的思路。
打开混淆后的flash file
1
可以看到SWF version是11,那么后面,我们在搜索到的SWF中多留意这个了。简单看看被DoSWF处理以后的SWF是长成什么样。
2
有价值的东西被藏在binaryData里,这些code的主要作用就是从binaryData中解析出最终的那个SWF,并加载进来。
下面这段code就是影响静态分析的根源,如果能突破这里,静态分析也是可以搞定的。当然,还是有方法的。虽然AVM specification里没有对这些指令做介绍,但是,Tamarin code里已经实现了,有兴趣的可以自己下载下来看看。
3
下面开始干正事了!
点击左侧目录结构的顶层.swf文件,可以在Process Explorer中看到SWF已经运行起来了。
4
继续搜索这个进程空间,当然不是用二进制编辑器,而是使用FFDec自带的搜索功能。
5
双击左侧的FlashPlayer.exe,可以从这个进程空间搜寻到所有的SWF,列于右侧,如下图:
6
我们可以看到很多SWF,有不同版本的,其中version=11的还非常多。其实,这就是DoSWF的混淆策略,为了防止很容易在memory中找到真实的SWF,创建了许多garbage SWF,这个可以在混淆后的SWF code里看到。
7
将上述Version=11的SWF逐个过一遍,就可以找到真实的SWF,当然,为了图省事,你可以写一个简单的过滤工具,检查constant pool中是否包含”http://www.doswf.com”或者其他有用的信息,将其过滤掉,剩下的就是真实的SWF了。

本文转载自看雪论坛

原文连接:http://bbs.pediy.com/showthread.php?t=191477

添加新评论