剖析 SWF 文件结构 探秘 AVM 运行原理

13
剖剖 SWF 剖剖剖剖 剖剖 AVM 剖剖剖剖 ——By laan 2009.12.22 http://www.laaan.cn

description

剖析 SWF 文件结构 探秘 AVM 运行原理. ——By laan 2009.12.22 http://www.laaan.cn. Why. 1. 明白自己在做什么. 2. 更底层的了解一些现象 堆栈不平衡、类型错误 error list. 3. 优化你的程序. 4. 加密和破解. 5. 重构虚拟机 —— 如果你足够 NX 的话. SWF 文件结构. Just Flashplayer9++. Tag ID. Head. 1.FWS|CWS 2.Player Version 3.File Length - PowerPoint PPT Presentation

Transcript of 剖析 SWF 文件结构 探秘 AVM 运行原理

Page 1: 剖析 SWF 文件结构 探秘 AVM 运行原理

剖析 SWF 文件结构探秘 AVM 运行原理

——By laan 2009.12.22http://www.laaan.cn

Page 2: 剖析 SWF 文件结构 探秘 AVM 运行原理

Why

1. 明白自己在做什么

2. 更底层的了解一些现象堆栈不平衡、类型错误 error list

3. 优化你的程序

4. 加密和破解

5. 重构虚拟机——如果你足够 NX 的话

Page 3: 剖析 SWF 文件结构 探秘 AVM 运行原理

SWF 文件结构Just Flashplayer9++

Head

Tag

Tag

Tag

1.FWS|CWS2.Player Version3.File Length4.Frame Size(Stage size * 20)

5.Frame Rate6.Frame Count

1.FWS|CWS2.Player Version3.File Length4.Frame Size(Stage size * 20)

5.Frame Rate6.Frame Count

Tag ID

Tag Length

Tag Data

Page 4: 剖析 SWF 文件结构 探秘 AVM 运行原理

Head Data

1.FWS|CWS2.Player Version3.File Length4.Frame Size5.Frame Rate6.Frame Count

1.FWS|CWS2.Player Version3.File Length4.Frame Size5.Frame Rate6.Frame Count

Page 5: 剖析 SWF 文件结构 探秘 AVM 运行原理

TagFileAttributes Tag as3 GPU network

Metadata Tag 携带信息

DoABC Tag

ShowFrame Tag

EndTag 携带数据,加密

SymbolClassTag

Protect Tag 防止导入

ScriptLimitTag 递归深度 脚本运行时间

SetBackgroundColor Tag 设置背景

Page 6: 剖析 SWF 文件结构 探秘 AVM 运行原理

DoABC Tag

Tag ID

Tag Length

Tag Data

82

name

Abc

72 TagHaxe 加密

AVM2Actionscript Virtual MachineAVM2Actionscript Virtual Machine

Page 7: 剖析 SWF 文件结构 探秘 AVM 运行原理

AVM2

1. ABC data (Actionscript Byte Code)

3. 运行原理

2. ABC 数据结构

4. 指令

Page 8: 剖析 SWF 文件结构 探秘 AVM 运行原理

Class Test {

private var a:String;

private const BIG:uint = 50;

private function test():void{ trace(doStr()); function doStr():String { return “NULL” } }

}

Class Test {

private var a:String;

private const BIG:uint = 50;

private function test():void{ trace(doStr()); function doStr():String { return “NULL” } }

}

ABC 数据结构ScriptScript

ClassClass

InstanceInstance

TraitTrait

MethodMethod

Method Body

Method Body

pccodepccode

结构由大到小

Medthod TraitMedthod Trait

Slot/Const TraitSlot/Const Trait

Class TraitClass Trait

Function TraitFunction Trait

Page 9: 剖析 SWF 文件结构 探秘 AVM 运行原理

AVM2 运行原理ABC

LoadLoad LinkLink VerifyVerify ExecuteExecute

Load: 加载 ABC 数据到内存并解析,得到所有数据单元Script,Class,Instance,Trait,Strings, …

Link: 各单元之间的关系建立比如 Class 与 Instance , Method 与 MethodBody

Verify: 检查各 abc 数据的正确性 。要是不检查正确性, player 可以做很多坏事分支检查,堆栈检查,比如一个 MethodBody 被链接到两个 Method 上

Execute: 开始执行 ABC 数据。官方:最后一个 script 结构的 init 方法Actually :文档类所在 Script 结构的 init 方法

Page 10: 剖析 SWF 文件结构 探秘 AVM 运行原理

Call Method

MethodBody

MethodBody Stack

Scope

pccodes

Local data

Call

MethodMethod 0 getlocal0 1 pushscope 2 pushnull 3 coerce_s 4 setlocal1 5 pushstring 7 setlocal1 8 getlocal1 9 pushstring …

0 getlocal0 1 pushscope 2 pushnull 3 coerce_s 4 setlocal1 5 pushstring 7 setlocal1 8 getlocal1 9 pushstring …

Page 11: 剖析 SWF 文件结构 探秘 AVM 运行原理

程序优化从 pccode 层面来程序优化…

1. 程序运行时间的消耗在哪儿?2. 局部变量3.Dynamic 会快还是会慢?4.Swich 还是 if else ,是个问题5.Try catch 的优化

1. 程序运行时间的消耗在哪儿?2. 局部变量3.Dynamic 会快还是会慢?4.Swich 还是 if else ,是个问题5.Try catch 的优化

1. 属性、方法访问时的搜索2. 分支跳转1. 属性、方法访问时的搜索2. 分支跳转局部变量一般情况下是不会编译到 swf 中去。所以无需考虑其长度比如 var theLengthOf Array:uint

局部变量一般情况下是不会编译到 swf 中去。所以无需考虑其长度比如 var theLengthOf Array:uintLookupswitch 指令的特殊结构。Lookupswitch 指令的特殊结构。动态调用会消耗更多的搜索时间。动态调用会消耗更多的搜索时间。

保存局部变量名称…保存局部变量名称…

Page 12: 剖析 SWF 文件结构 探秘 AVM 运行原理

Where should we go next?

1. 各自回工位

2. 学习更多SWF文件格式官方文档下载》》

AVM2 官方说明文档下载》》

Page 13: 剖析 SWF 文件结构 探秘 AVM 运行原理

感谢• 感谢 CCAV• 感谢 Adobe 提供这么优秀的产品• 感谢肖大侠的协助• 非常感谢各位抽空来接受折磨