- 浏览: 17870 次
最新评论
何反编译ActionScript代码在SWF(How To Decompile Actionscript Code In Swf)
2009年12月13日
何反编译ActionScript代码在SWF(How To Decompile Actionscript Code In Swf)文章录入:宝贝天使 编辑:本站原创 更新时间:2009-9-24 9:53:43 【字体:小 大】Author: xy7[80sec]
EMail: xy7#80sec.com/xuanmumu@gmail.com
Site: http://www.80sec.com
Date: 2009-7-27
[ 目录 ]
0x00 前言
0x01 swf 文件头分析
0x02 swf 文件结构
0x03 swf tag类型
0x04 寻找Actionscript代码
0x05 还原带有变量的AS代码段
0x06 总结
0x07 代码示例
0x00 前言
随着Flash的应用越来越广泛,针对Flash的安全性问题也被人们所重视。通过提取Flash文件中的AS代码,可以进行恶意行为检测(网马分析),代码安全性分析(HP的SWFSCAN)或者针对AS代码中出现的URL进行进一步检测分析(APPSCAN)。本文只是一篇工作笔记,通过实现一个简单的Swf Decompiler来提取SWF文件中的AS代码。
0x01 swf 文件头分析
首先新建一个flash文件,默认大小,背景,无任何其他元素,只添加一个geturl函数,里面随便写上一个链接http://1.1.1.1。这个新创建的flash文件就作为我们的分析对象。
SWF文件头格式如下:
SWF File Header
Field Type Comment
Signature UI8 Signature byte:
“F” indicates uncompressed
“C” indicates compressed (SWF 6 and later only)
Signature UI8 Signature byte always “W”
Signature UI8 Signature byte always “S”
Version UI8 Single byte file version (for example, 0x06 for SWF 6)
FileLength UI32 Length of entire file in bytes
FrameSize RECT Frame size in twips
FrameRate UI16 Frame delay in 8.8 fixed number of frames per second
FrameCount UI16 Total number of frames in file
UE打开新建的flash文件,首先读前三个字节,46 57 53=FWS,说明该文件是未经过zlib压缩。
下一个字节是代表flash的版本,0a=10。
继续后四个字节代表flash文件的大小4E 05 00 00 ,这里需要转成大尾存储0000054e=1385bytes。
接下来是flash的尺寸,这里定义了一个RECT结构用来存储这些数据。
RECT结构如下:
RECT
Field Type Comment
Nbits UB[5] Bits in each rect value field
Xmin SB[Nbits] x minimum position for rect
Xmax SB[Nbits] x maximum position for rect
Ymin SB[Nbits] y minimum position for rect
Ymax SB[Nbits] y maximum position for rect
继续往后读1个字节78,转换成2进制补齐8位78=01111000,根据RECT的格式取前五位01111=15,表示剩下的数据要按每15位进行划分,由于还剩下4组数据要表示,所以需要60位,60位至少需要读8个字节,所以RECT结构需要的字节数为00000008h: 78 00 05 5F 00 00 0F A0 00,都转为2进制进行15位分割,最后不足15位的舍去,最后得出的结果为 twip(20twip=1像素),所以最后输入应该是这样:
01111
000000000000000
010101011111000
000000000000000
001111101000000
RECT binary value:0
RECT binary value:550
RECT binary value:0
RECT binary value:400
接下来2个字节代表帧速 00 18 =>18 00 =>24
最后2个字节代表帧数 01 00 =>00 01 => 1
至此,swf文件头就结束了。
0x02 swf 文件结构
Swf文件主体是由一连串的tag组成,最终以一个end tag为结尾。大概结构如下:
[文件头]---[ FileAttributes]---[tag]---[tag]…[end tag]
| |
[tag type] [tag type]
| |
[tag data] [tag data]
0x03 swf tag类型
根据tag头可以将tag分为短tag和长tag,具体格式如下:
RECORDHEADER (short)
Field Type Comment
TagCodeAndLength UI16 Upper 10 bits: tag type
Lower 6 bits: tag length
RECORDHEADER (long)
Field Type Comment
TagCodeAndLength UI16 Tag type and length of 0x3F
Packed together as in short header
Length SI32 Length of tag
也就是说高10位都代表着tag类型,后6位如果长度大于等于0x3f则为长tag,其余的则是短tag。
按tag类型来分,tag也可分做2类:Definition tags和Control tags。其中Definition tags主要包含了flash中的文本,声音,图像等资源,而Control tags则包含了一些文件的处理流程等控制元素。
既然已经分清楚了swf tag类型,那么就可以进一步分析tag以寻找我们需要的AS代码。
文件头已经分析完毕,接下来就来分析第一个tag:FileAttributes。继续上面的例子,到了分析tag的时候依次读2个字节:44 11 =>11 44 => 0001000101000100 => 0001000101(高10位) => 69,在swf文件格式中查找Tag type = 69,正是FileAttributes,接着低6位代表tag长度:000100 =>4,向后再读4个字节:10 00 00 00 => 00 00 00 10 =>16 => 00010000,这段数据就是FileAttributes tag的数据内容了,FileAttributes tag到此结束。数据可以对照着FileAttributes数据结构来看,结构比较长就不贴出来了,其中第4位是1,表明这个 flash中含有matadata,继续往后读2个字节 7F 13,按位取高10位=77。
Metadata
Field Type Comment
Header RECORDHEADER Tag type = 77
Metadata STRING XML Metadata
低6位全为1,所以说matadata是第一个长tag,长tag需要4个字节来表示数据长度,这些数据对实际分析没有什么作用,所以分析出数据长度就可以跳过了。
0x04寻找Actionscript代码
通过前面2个tag的分析,已经能够清楚的知道swf tag的固定格式以及取数据的方法了,那么我们定义的AS2中geturl函数到底存在哪里呢?继续读下2个字节:3f 03 => 03 3f ,取高10位0000001100 =>12,这个12是什么意思呢,查swf文档:
DoAction
Field Type Comment
Header RECORDHEADER Tag type = 12
Actions ACTIONRECORD [zero or more] List of actions to perform (see
following table, ActionRecord)
ActionEndFlag UI8 = 0 Always set to 0
注意ACTIONRECORD
Field Type Comment
ActionCode UI8 An action code
Length If code >= 0x80, UI16 The number of bytes in the
ACTIONRECORDHEADER, not
counting the ActionCode
现在可以确定ActionCode是包含在Actions ACTIONRECORD中,Actions ACTIONRECORD又是属于DoAction。判断低6位得知DoAction是长tag,继续读后面4个字节来确定DoAction的数据长度:1A 00 00 00 =>26。至此就可以判定我们之前建立的AS代码就包含在这26个字节中。接下来根据ACTIONRECORD的定义,1个字节代表ActionCode,继续读:83,查找swf文档:
Field Type Comment
ActionGetURL ACTIONRECORDHEADER ActionCode = 0x83
UrlString STRING Target URL string
TargetString STRING Target string
找到了我们定义的geturl函数,所以继续读下面2个字节16 00 =>00 16=>22,那么这22个字节就是geturl函数里的参数了,提取出来还原一下看看:
687474703a2f2f312e312e312e31005f626c616e6b00
http://1.1.1.1 _blank
最终通过对swf文件格式的分析,还原出了一段最简单的AS代码:
_getURL('http://1.1.1.1' '_blank')
_end0x05 还原带有变量的AS代码段
假设有如下代码段:
on (release)
{
var host = "http://10.1.5.16";
var url = host + "/sql/index.php";
getURL(url, "_blank");
}Geturl获取的是通过变量拼接组成的url。首先看一段数据:
88 32 00 05 00 68 6f 73 74 00 68 74 74 70 3a 2f 2f 31 30 2e 31 2e 35 2e 31 36 00 75 72 6c 00 2f 73 71 6c 2f 69 6e 64 65 78 2e 70 68 70 00 5f 62 6c 61 6e 6b 00
第一个字节:0x88
ActionConstantPool
ActionConstantPool creates a new constant pool, and replaces the old constant pool if one
already exists.
Field Type Comment
ActionConstantPool ACTIONRECORDHEADER ActionCode = 0x88
Count UI16 Number of constants to follow
ConstantPool STRING[Count] String constants
所有的变量会被预先存放在ConstantPool中,上面的数据还原后如下:
_constantPool "host" "http://10.1.5.16" "url" "/sql/index.php" "_blank"
接着往下读一个字节:96 = ActionPush,后两个字节04 00 =>00 04 一共要往后再读4个字节的数据,合并起来就是:
96 04 00 08 00 08 01
08代表ActionPush结构中的type 00代表ConstantPool中的第一个算素,01代表ConstantPool中第2个元素,还原就是:
_push "host" http://10.1.5.16
读下一个字节:3c
Field Type Comment
ActionDefineLocal ACTIONRECORDHEADER ActionCode = 0x3C
赋值操作:var host = http://10.1.5.16
继续读,push操作跟前面一样:
96 04 00 08 02 08 00
还原:
_push "url" "host"
继续读:1c
ActionGetVariable ACTIONRECORDHEADER ActionCode = 0x1C
url = host
96 02 00 08 03
_push "/sql/index.php"
47
ActionAdd2 ACTIONRECORDHEADER ActionCode = 0x47
url = host+"/sql/index.php"
3c
ActionDefineLocal
Var url = host+"/sql/index.php"
//96 02 00 08 02
_push "url"
//1c
_getVariable
//96 02 00 08 04
_push "_blank"
获取url _blank
//9a 01 00 00
_getURL2 flag 0
调用geturl2函数……
其中包含的一些actioncode具体可以查看swf文档,有很详细的操作说明,篇幅问题这里就不贴出来了。
0x06 总结
终于到总结了……呃,这篇文章只是比较简单的描述如何通过静态分析swf文件格式来提取出AS代码,举的例子也都比较简单,但实际分析过程中程序还需要考虑很多因素,包括载入swf tag字典,判断哪些tag是包含AS代码的,那些是Definition tags可以跳过的,当然,如果是想开发一个完整的SWFDecompiler,那么所有的tag都需要逐个分析。工作笔记难免有没说清楚和理解错误的地方,还望多多包涵。
0x07 代码示例
#!/usr/bin/php
文件大小
for ($i=0;$i>3;
echo "RECT field size:".$fieldsize."\r\n";
$needbytes = ceil($fieldsize*4/8)+1;
//echo $needbytes;
for($i=0;$i>6;
$low6 = substr(decbin($newfile),-6);
//echo decbin($low6)."\r\n";
if ($high10 == 69){
echo "Found FileAttribute Tag!\r\n";
}
echo "FileAttributeDataBytes is:".bindec($low6)."\r\n";
//---------------------FileAttribute-----------------------//
//---------------------FileAttributeData-------------------//
for($i=0;$i>6;
if ($high10 == 77){
echo "Metadata Type:".$high10."\r\n";
}
$bin = decbin($newmetatag);
$low6 = substr($bin,-6);
if ($low6 == 111111){
echo "Long Tag - Need 4 bytes\r\n";
}else{
echo "Tag type wrong\r\n";
}
for ($i=0;$i>6;
if ($high10 == 9){
echo "Found SetBackgroundColor!\r\n";
}
for ($i=0;$i>6;
if ($high10 == 12){
echo "Found First DoAction!\r\n";
}else{
for ($i=0;$i>6)."\r\n";
}
for ($i=0;$i
发表评论
-
html 特殊转义字符
2012-01-20 02:23 856html 特殊转义字符 2010年08月11日 HTM ... -
Notepad2 V4.1.24.62 免费版 是一个外观类似系统记事本的文本编辑工具
2012-01-20 02:23 784Notepad2 V4.1.24.62 免费版 是一个外观类似 ... -
简析HTML七种网页加密解密方法
2012-01-20 02:23 3967简析HTML七种网页加密解 ... -
IIS服务器排错指南及错误代码大全
2012-01-20 02:23 731IIS服务器排错指南及错误代码大全 2011年06月22日 ... -
游侠在线自由测试版正式发布啦!!!
2012-01-20 02:23 622游侠在线自由测试版正式发布啦!!! 2010年08月26日 ... -
介绍一些好玩的软件(有时间就更)
2012-01-19 10:12 723介绍一些好玩的软件(有时间就更) 2011年10月01日 ... -
英文有声读物网站(转贴)
2012-01-19 10:12 806英文有声读物网站(转贴) 2011年07月16日 国外 ... -
48个值得推荐的免费英文有声读物网站
2012-01-19 10:12 72648个值得推荐的免费英文有声读物网站 2011年09月02日 ... -
爱上绘本――盘点我和朗朗一年半的亲子阅读书目(自购书篇)
2012-01-19 10:12 775爱上绘本――盘点我和朗朗一年半的亲子阅读书目(自购书篇) 2 ... -
超右脑学习~那个小日本滴~
2012-01-19 10:12 548超右脑学习~那个小日本 ... -
MAX三百问(珍藏版)上
2012-01-17 02:53 626MAX三百问(珍藏版)上 2011年06月13日 安装篇 ... -
linux HoN 运行不流畅解决
2012-01-17 02:53 955linux HoN 运行不流畅解决 2011年02月13日 ... -
我们专业要用到的软件-AutoCAD系统要求,给即将买电脑的亲爱滴童鞋们点参考建议
2012-01-17 02:53 967我们专业要用到的软件-AutoCAD系统要求,给即将买电脑的亲 ... -
新萝卜家园 Ghost XP SP3 电脑城装机专用版 10.5
2012-01-17 02:53 776新萝卜家园 Ghost XP SP3 ... -
ActionScript 3 Flash大话设计模式(5)-工厂方法模式
2012-01-15 22:31 794ActionScript 3 Flash大话设计模式(5)-工 ... -
教学精品-3天学透Actionscript
2012-01-15 22:31 680教学精品-3天学透Actionsc ... -
在Flex/ActionScript3中实现单例
2012-01-15 22:30 786在Flex/ActionScript3中实现单例 2010年 ... -
ActionScript3.0 垃圾回收机制 2010-4-19 雨
2012-01-15 22:30 616ActionScript3.0 垃圾回收机制 2010-4-1 ...
相关推荐
flash游戏开发之 如何反编译.swf文件得到actionscript3 as3源代码.zip
总是会有人做这样的事情,不管是Java还是.Net,解析类的语言...darknet放出的 Flare让人们可以在Dos/Windows,Mac OS,Linux x86,Linux x86 64-bit,Solaris x86这些平台下,都可以将Flash的SWF反编译取出ActionScript。
ActionScript3代码规范 ActionScript3代码规范 ActionScript3代码规范
flex actionscript反编译工具
在一个国外的网站下载来的flash源码,可以学习一下actionscript代码产生动画的技巧。
可以有效防止市场上大多数swf反编译工具,保护你的代码和素材。 · 对SWF文件及内容加密,市面上大多数反编译工具难以破解 · 对Actionscript3.0脚本进行有效混淆 · 支持2.0版本SWF加密 · 针对不同应用场合,设计...
今天花了一些时间整理出来了Swf 文件与JavaScript通信的示例,在此贴出供大家参考。 在ActionScript3.0与JavaScipt通信的时候需要用到ExternalInterface类。 “ExternalInterface”类是外部API,在ActionScript和...
Action Script Viewer是一个SWF反编译应用程序,准确的说是一款调试、更新SWF文件的XML编辑器。支持AS1到AS3,能让你查看 SWF 文件里面的动作脚本;能让你取位图、音频、视频、字体等原始文件;能让你浏览 SWF 文件...
After learning how to install and becoming familiar with the basics of the Flex Builder 2 software, you will explore in depth how ActionScript 3.0 interacts with Flexs powerful XML-like design ...
swf反编译软件。actionscript源码查看,可以用于swf后缀的文件的反编译。一般拿来研究加密方式
NULL 博文链接:https://hintcnuie.iteye.com/blog/361696
ActionScript 3 For Adobe Flash CS4 Professional About this guide This guide provides a quick introduction to migrating to ...Migration cookbook: Shows how to do common tasks in ActionScript 3
ActionScript 3.0 source code AS源代码
就是一个简单的加载外部swf 为了做任务 弄点下载积分呐
flash actionscript3 纯AS3代码_资源加载进度条.rar
ActionScript 3.0基础教程书中所有的as3源代码
ActionScript反编译器允许将SWF文件转换为FLA(或Flex项目文件,具体取决于源代码),然后可以在其本机Flash或Flex环境中对其进行编辑。 4、ActionScript搜索 Action Script Viewer允许浏览选定的脚本以检查其结构。...
一个关于用ActionScript3.0的图片3D旋转代码!
FLASH中actionscript代码.pdf
查看您的SWF的核心文件直接在Flash反编译Trillix 在预览和播放Flash影片内置Flash播放器 编辑Flash对象,无须转换为FLA 预览编辑,保存更改之前的SWF文件 提取所有的Flash文件资源转化为各种格式 的SWF为FLA转换的...