反编译那个.swf的玩意儿,没啥特别高深的技巧,就是个体力活加上一点点耐心。我这回就是琢磨这个,把以前那些老项目里的玩意儿拆开看看,想着怎么能快点出结果。
我手头有个旧东西,一个Flash动画加点简单交互的玩意儿。本来想看看里面是怎么控制那个动画流程的,就直接找工具开搞。一开始我用了一个比较常见的反编译工具,就是那种直接把SWF拖进去就能看到文件结构和脚本代码的。
碰到这种混淆的玩意儿,光靠工具自动反编译出来一堆乱码是没用的。我得想办法还原它的逻辑结构。我发现,有些混淆虽然把名字改了,但代码的执行流程和结构还是保留的。
我主要采取了这么几个步骤:

光看静态代码是远远不够的,动态调试才是王道。我用的是Flash调试器,把它附加到正在运行的SWF进程上。
我主要用调试器来做两件事:
比如,我发现一个变量的值从0变成了1,然后紧接着SWF的某个图形元素就显示出来了,那我就能推断出这个变量可能就是控制显示状态的标志位。虽然名字还是乱码,但功能我已经摸清楚了。
这个阶段是最费时间的,但也是最关键的。我不会直接去修改反编译出来的ActionScript代码,因为那个工具修改起来很麻烦,而且重新打包可能出问题。

我的做法是,弄一个本地的文本文件,专门用来记录我的发现。
记录格式大概是这样:
a.b.c() -> 记录的新名字:TryLoginRequest()_root.d_123 -> 记录的新名字:UserToken这样,我就可以一边看代码,一边对照我的笔记来理解整个程序是怎么跑起来的。最终,就算我不能把所有代码都还原成人类可读的样子,至少能把核心的业务流程和数据流给我捋清楚。这对于学习或者维护老项目来说,效率就高多了。