Swf文件格式和abc代码混淆工具 黄珏坤

30
SWF 文文文文文 ABC 文文文文文文文文文 文文文 Tony Huang 文文文文文文文文文文文文

description

 

Transcript of Swf文件格式和abc代码混淆工具 黄珏坤

Page 1: Swf文件格式和abc代码混淆工具 黄珏坤

SWF 文件格式和 ABC 代码混淆工具的开发黄珏珅 ( Tony Huang )上海橙创数码科技有限公司

Page 2: Swf文件格式和abc代码混淆工具 黄珏坤

About me•上海橙创数码科技有限公司•网页游戏从业人员•我的博客▫http://www.greatony.com

•我的 Email 地址▫ [email protected]

Page 3: Swf文件格式和abc代码混淆工具 黄珏坤

小广告•我们公司正在▫为我们的网页游戏《战争艺术》寻找联合运营▫为我们的团队招募新的伙伴

AS3 工程师 C# 工程师

•如果你们感兴趣,就用 QQ 弹死我吧:▫17746369

•当然如果你不用 QQ ,也欢迎大家写信给我:▫ [email protected]

Page 4: Swf文件格式和abc代码混淆工具 黄珏坤

Agenda•出发点和目标•SWF 文件格式▫SWF 文件格式▫ABC 文件格式

•ABC 代码混淆工具的开发▫符号重命名▫插入无用的指令

Page 5: Swf文件格式和abc代码混淆工具 黄珏坤

出发点•游戏的客户端成为他们编写外挂的参考资料?•游戏的客户端实现的高性能算法被别人盗用?•游戏被破解后,广泛传播,却不能给自己带来合

理的收益?

•我们不能任由别人践踏我们的知识产权!!

Page 6: Swf文件格式和abc代码混淆工具 黄珏坤

目标•现在市场上主要两款主流的破解软件:

硕思闪客精灵 Action Script Viewer

Page 7: Swf文件格式和abc代码混淆工具 黄珏坤

目标•硕思闪客精灵 专业版 5.6•ActionScript Viewer 2010/6

•让他们统统见鬼去吧

Page 8: Swf文件格式和abc代码混淆工具 黄珏坤

目标

DEMO

Page 9: Swf文件格式和abc代码混淆工具 黄珏坤

从哪里入手•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

Page 10: Swf文件格式和abc代码混淆工具 黄珏坤

SWF 文件格式•众所周知,是 Flash Player 使用的内容格式•一种二进制的文件格式•支持压缩•对流式的内容做过优化

Page 11: Swf文件格式和abc代码混淆工具 黄珏坤

SWF 文件格式

Page 12: Swf文件格式和abc代码混淆工具 黄珏坤

SWF 文件头•签名▫FWS 或者 CWS

•压缩标志▫由签名的第一个字符来确定

F 代表未压缩的 SWF 文件 C 代表压缩过的 SWF 文件 使用了 zlib 的 deflate 压缩算法

•版本号•原始文件长度▫在压缩之前的 SWF 文件的大小,用以校验解压后的 SWF 文件

是否正确•动画的大小、帧率、帧数

Page 13: Swf文件格式和abc代码混淆工具 黄珏坤

SWF 的 Tag•Tag 就是数据块▫一张图片▫一个图形▫一些参数▫一个 ABC 文件▫等等……

•今天我们主要讨论的是 ABC 的代码混淆,所以不去讨论其他 TAG 的特点

Page 14: Swf文件格式和abc代码混淆工具 黄珏坤

看看 SWF 文件里面都有些什么?

DEMO

Page 15: Swf文件格式和abc代码混淆工具 黄珏坤

ABC 文件格式

* 参考文档: avm2_overview.pdf section 4 page 18

版本号 常量池

元数据• 方法描述•元数据•类描述•脚本

方法体

Page 16: Swf文件格式和abc代码混淆工具 黄珏坤

ABC各部分关系

常量池

元数据 方法体

Page 17: Swf文件格式和abc代码混淆工具 黄珏坤

ABC各部分关系 ( 常量池)

常量池

整形常量

无符号整形常量

双精度浮点常量

字符串常量

命名空间常量

命名空间集合常量

Multiname 常量

Page 18: Swf文件格式和abc代码混淆工具 黄珏坤

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;

}

Page 19: Swf文件格式和abc代码混淆工具 黄珏坤

上面的代码会产生什么样的编译结果?

DEMO

Page 20: Swf文件格式和abc代码混淆工具 黄珏坤

DEMO – Release 编译

Page 21: Swf文件格式和abc代码混淆工具 黄珏坤

DEMO – Debug 编译

包含了 Debugfile, Debugline, Debug 指令如:Debug 1, v, 0, 36Debug 1, stringValue, 1, 37表明 local1 的名字是 v , local2 的名字是stringValue

参数名和本地变量的名字全部都暴露了

Page 22: Swf文件格式和abc代码混淆工具 黄珏坤

符号重命名•安全▫由于大家引用的只是一个索引,所以修改了符号的

名字以后不会造成程序不能正常执行▫需要注意一些会使用反射来访问的符号▫需要注意和真正的字符串常量有重叠的部分

•有效▫由于符号的名字和 avm 的运行没有关系,可以将名

字全部都换成非法的字符( as3 不支持的类名)

Page 23: Swf文件格式和abc代码混淆工具 黄珏坤

符号重命名

•找到所有的类名•剔除所有对外暴露的类名•剔除所有被 pushstring 指令引用的字符串

•将相应的字符串常量重命名成非法字符

Page 24: Swf文件格式和abc代码混淆工具 黄珏坤

符号重命名的效果

DEMO

Page 25: Swf文件格式和abc代码混淆工具 黄珏坤

插入无用指令• 任何命令式的语言中, if语句都是最常用的• 所以我们只要拿 if下手就能够实现目标了

• 测试代码:

return (v > 100) ? 1 : 0;

Page 26: Swf文件格式和abc代码混淆工具 黄珏坤

插入无用指令•编译结果

Getlocal1Pushbyte 100Ifngt label0Pushbyte 1ReturnvalueLabel0:Pushbyte 0Returnvalue

•如果变成这样:

Getlocal1Pushbyte 100Ifngt Label0Jump RealPushbyte 0Setlocal0Real:Pushbyte 1ReturnvalueLabel0:Pushbyte 0Returnvalue

效果相当于:this = 0;

Page 27: Swf文件格式和abc代码混淆工具 黄珏坤

插入无用指令的效果

DEMO

Page 28: Swf文件格式和abc代码混淆工具 黄珏坤

再次小广告•我们公司正在▫为我们的网页游戏《战争艺术》寻找联合运营▫为我们的团队招募新的伙伴

AS3 工程师 C# 工程师

•如果你们感兴趣,就用 QQ 弹死我吧:▫17746369

•当然如果你不用 QQ ,也欢迎大家写信给我:▫ [email protected]

Page 29: Swf文件格式和abc代码混淆工具 黄珏坤

Q/A

Page 30: Swf文件格式和abc代码混淆工具 黄珏坤

谢谢