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

4,492 views

Published on

1 Comment
3 Likes
Statistics
Notes
  • 我们的这个混淆工具已经正式发布了:
    http://www.orandea.com/product?lang=cn
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
4,492
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
79
Comments
1
Likes
3
Embeds 0
No embeds

No notes for slide

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

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

×