Swf文件格式和abc代码混淆工具 黄珏坤
-
Upload
flash -
Category
Technology
-
view
4.648 -
download
0
description
Transcript of Swf文件格式和abc代码混淆工具 黄珏坤
SWF 文件格式和 ABC 代码混淆工具的开发黄珏珅 ( Tony Huang )上海橙创数码科技有限公司
About me•上海橙创数码科技有限公司•网页游戏从业人员•我的博客▫http://www.greatony.com
•我的 Email 地址▫ [email protected]
小广告•我们公司正在▫为我们的网页游戏《战争艺术》寻找联合运营▫为我们的团队招募新的伙伴
AS3 工程师 C# 工程师
•如果你们感兴趣,就用 QQ 弹死我吧:▫17746369
•当然如果你不用 QQ ,也欢迎大家写信给我:▫ [email protected]
Agenda•出发点和目标•SWF 文件格式▫SWF 文件格式▫ABC 文件格式
•ABC 代码混淆工具的开发▫符号重命名▫插入无用的指令
出发点•游戏的客户端成为他们编写外挂的参考资料?•游戏的客户端实现的高性能算法被别人盗用?•游戏被破解后,广泛传播,却不能给自己带来合
理的收益?
•我们不能任由别人践踏我们的知识产权!!
目标•现在市场上主要两款主流的破解软件:
硕思闪客精灵 Action Script Viewer
目标•硕思闪客精灵 专业版 5.6•ActionScript Viewer 2010/6
•让他们统统见鬼去吧
目标
DEMO
从哪里入手•SWF 的文件格式▫http://www.adobe.com/content/dam/Adobe/en/devnet/swf/
pdf/swf_file_format_spec_v10.pdf•ABC 的文件格式•AVM 虚拟机的工作方式▫http://www.adobe.com/content/dam/Adobe/en/devnet/
actionscript/articles/avm2overview.pdf
SWF 文件格式•众所周知,是 Flash Player 使用的内容格式•一种二进制的文件格式•支持压缩•对流式的内容做过优化
SWF 文件格式
SWF 文件头•签名▫FWS 或者 CWS
•压缩标志▫由签名的第一个字符来确定
F 代表未压缩的 SWF 文件 C 代表压缩过的 SWF 文件 使用了 zlib 的 deflate 压缩算法
•版本号•原始文件长度▫在压缩之前的 SWF 文件的大小,用以校验解压后的 SWF 文件
是否正确•动画的大小、帧率、帧数
SWF 的 Tag•Tag 就是数据块▫一张图片▫一个图形▫一些参数▫一个 ABC 文件▫等等……
•今天我们主要讨论的是 ABC 的代码混淆,所以不去讨论其他 TAG 的特点
看看 SWF 文件里面都有些什么?
DEMO
ABC 文件格式
* 参考文档: avm2_overview.pdf section 4 page 18
版本号 常量池
元数据• 方法描述•元数据•类描述•脚本
方法体
ABC各部分关系
常量池
元数据 方法体
ABC各部分关系 ( 常量池)
常量池
整形常量
无符号整形常量
双精度浮点常量
字符串常量
命名空间常量
命名空间集合常量
Multiname 常量
Demo 程序
private function getFriendlyValue(v:int): String {var stringValue : String = v.toString();
if (v < 0) return "negative: " + stringValue;if (v > 100) return "large: " + stringValue;return "normal: " + stringValue;
}
上面的代码会产生什么样的编译结果?
DEMO
DEMO – Release 编译
DEMO – Debug 编译
包含了 Debugfile, Debugline, Debug 指令如:Debug 1, v, 0, 36Debug 1, stringValue, 1, 37表明 local1 的名字是 v , local2 的名字是stringValue
参数名和本地变量的名字全部都暴露了
符号重命名•安全▫由于大家引用的只是一个索引,所以修改了符号的
名字以后不会造成程序不能正常执行▫需要注意一些会使用反射来访问的符号▫需要注意和真正的字符串常量有重叠的部分
•有效▫由于符号的名字和 avm 的运行没有关系,可以将名
字全部都换成非法的字符( as3 不支持的类名)
符号重命名
•找到所有的类名•剔除所有对外暴露的类名•剔除所有被 pushstring 指令引用的字符串
•将相应的字符串常量重命名成非法字符
符号重命名的效果
DEMO
插入无用指令• 任何命令式的语言中, if语句都是最常用的• 所以我们只要拿 if下手就能够实现目标了
• 测试代码:
return (v > 100) ? 1 : 0;
插入无用指令•编译结果
Getlocal1Pushbyte 100Ifngt label0Pushbyte 1ReturnvalueLabel0:Pushbyte 0Returnvalue
•如果变成这样:
Getlocal1Pushbyte 100Ifngt Label0Jump RealPushbyte 0Setlocal0Real:Pushbyte 1ReturnvalueLabel0:Pushbyte 0Returnvalue
效果相当于:this = 0;
插入无用指令的效果
DEMO
再次小广告•我们公司正在▫为我们的网页游戏《战争艺术》寻找联合运营▫为我们的团队招募新的伙伴
AS3 工程师 C# 工程师
•如果你们感兴趣,就用 QQ 弹死我吧:▫17746369
•当然如果你不用 QQ ,也欢迎大家写信给我:▫ [email protected]
Q/A
谢谢