首页
社区
课程
招聘
[原创]分析DoSWF处理过的SWF
发表于: 2014-8-21 23:50 35313

[原创]分析DoSWF处理过的SWF

2014-8-21 23:50
35313

最近看到不少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

可以看到SWF version是11,那么后面,我们在搜索到的SWF中多留意这个了。简单看看被DoSWF处理以后的SWF是长成什么样。
 
有价值的东西被藏在binaryData里,这些code的主要作用就是从binaryData中解析出最终的那个SWF,并加载进来。
下面这段code就是影响静态分析的根源,如果能突破这里,静态分析也是可以搞定的。当然,还是有方法的。虽然AVM specification里没有对这些指令做介绍,但是,Tamarin code里已经实现了,有兴趣的可以自己下载下来看看。
 
下面开始干正事了!
点击左侧目录结构的顶层.swf文件,可以在Process Explorer中看到SWF已经运行起来了。
 
继续搜索这个进程空间,当然不是用二进制编辑器,而是使用FFDec自带的搜索功能。
 
双击左侧的FlashPlayer.exe,可以从这个进程空间搜寻到所有的SWF,列于右侧,如下图:
 
我们可以看到很多SWF,有不同版本的,其中version=11的还非常多。其实,这就是DoSWF的混淆策略,为了防止很容易在memory中找到真实的SWF,创建了许多garbage SWF,这个可以在混淆后的SWF code里看到。
 
将上述Version=11的SWF逐个过一遍,就可以找到真实的SWF,当然,为了图省事,你可以写一个简单的过滤工具,检查constant pool中是否包含”http://www.doswf.com”或者其他有用的信息,将其过滤掉,剩下的就是真实的SWF了。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 3
支持
分享
最新回复 (16)
雪    币: 406
活跃值: (164)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
2
感谢分享。。
2014-8-22 03:00
0
雪    币: 6
活跃值: (1125)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
good
2014-8-22 07:04
0
雪    币: 3638
活跃值: (4197)
能力值: (RANK:215 )
在线值:
发帖
回帖
粉丝
4
对于SWF的size如何来确定?
是不是用FFDC直接复制出来就行了,不需要手动指定size.
2014-8-22 07:59
0
雪    币: 59
活跃值: (94)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
5
在FFDec里无需指定size
2014-8-22 10:21
0
雪    币: 62
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
先入为主的认为混淆就是将abc指令进行了变化,至少得有指令替换和加花指令等,应该不能从内存中直接搜索到原文件。
2014-8-22 12:52
0
雪    币: 59
活跃值: (94)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
7
不对之处,多谢指教!如果可以的话,能否将此类sample共享一份,一起学习。
2014-8-22 13:52
0
雪    币: 3638
活跃值: (4197)
能力值: (RANK:215 )
在线值:
发帖
回帖
粉丝
8
晓得了,THANKS
2014-8-22 18:40
0
雪    币: 62
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
你太谦虚了,上述只是学习你的文章恍然大悟之感
2014-8-23 12:29
0
雪    币: 211
活跃值: (58)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
分析Flash的文章很少,看了这篇教程,学习了不少,谢谢分享
2014-8-25 19:45
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
这位大哥好牛啊
2014-10-2 21:50
0
雪    币: 406
活跃值: (164)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
12
手机mark 下
2014-10-2 23:16
0
雪    币: 59
活跃值: (94)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
13
另外一种更为简单的方法是hook loadBytes,可以参考:https://github.com/F-Secure/Sulo
2015-2-11 15:23
0
雪    币: 256
活跃值: (377)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
楼主的文章不错,学习了
顺便给楼主推荐下另外一个大牛的方法
使用Object共享方式破解DoSWF加密的swf
百度搜下这个就有了
2015-2-13 22:13
0
雪    币: 59
活跃值: (94)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
15
谢谢,学习了!
2015-2-16 10:13
0
雪    币: 205
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
谢谢分享!
2015-2-27 10:12
0
雪    币: 6250
活跃值: (3315)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
michaelpdu 另外一种更为简单的方法是hook loadBytes,可以参考:https://github.com/F-Secure/Sulo
有联系方式不,一起学习一下
2017-3-28 15:40
0
游客
登录 | 注册 方可回帖
返回
//