SWF加密之隐藏密钥篇

标签:
swf加密密钥alchemypixelbender混淆it |
密钥隐藏
破环swf标准文件头是最简单也是最常用的方法。 向swf的二进制文件的文件头写入无意义的数据,这样就可以导致破解软件无法正常解析swf。
http://s12/middle/731fdd2bgc66d6cc2b92b&690
如图所示,向core.swf的ByteArray开始位置写入无意义的数据,
这样做的原理是Swf文件的前几位表示这个swf的版本信息,以及解析swf需要的参数数据,把它修改为无意义的数据,反编译程序自然也就无法解析了, 当然如果你这样做了之后,也会造成在运行时flashPlayer无法解析core.swf,
http://s16/bmiddle/731fdd2bgc66d6815a94f&690
由于总所周知的原因,这样做只能防君子不能防小人,只是增加了破解者一点点工作量而已,破解者不能直接反编译core.swf、但是他可以破解loader.swf来找到解密代码(如上图红框的数字7是明文存在在loader.swf里的),来还原core.swf的文件头。然后继续用反编译软件进行反编译,
参考资料 (摘自不知出处的地方)
SWF文件头
SWF文件头
字段 |
类型 * |
说明 |
签字标识 |
UI8 |
标识字符: “F”表示未压缩 “C”表示已压缩(版本6或后续版本) |
签字标识 |
UI8 |
此标识通常为“W” |
签字标识 |
UI8 |
此标识通常为“S” |
版本 |
UI8 |
单字节文件版本数(例如,0x06表示版本6) |
文件长度 |
UI32 |
整个文件的字节长度 |
帧尺寸 |
RECT |
单位帧的尺寸 |
帧率 |
UI16 |
每秒的帧数,其16个位是按照8.8的格式表示的 |
帧数 |
UI16 |
影片的总帧数 |
* 此类型在基本数据类型一节中定义 |
文件头部是由一个三字节的标识符开始,为0x46、0x57、0x53(“FWS”)或者0x43、0x57、0x53(“CWS”)其中之一。“FWS”标识符说明该文件是未压缩的SWF文件,“CWS”标识符则说明该文件前8个字节之后(即文件长度字段之后)的全部数据为开源的标准ZLIB方式压缩。
上述方法仅仅只能防止一些对swf不了解的外行人,
http://s16/bmiddle/731fdd2bgc66d6815a94f&690
如上图红框的数字7是明文存在在loader.swf里的。 那现在的思路就很清晰了,要做的就是把好个明文的数字7给隐藏起来,达到让破解者无法还原core.swf文件头。由于swf文件格式是公开的,毫无保密性,所以任何用AS实现的加密算法都是耍流氓(没用的),那我们有没有办法用其他方法来隐藏数字7呢。答案是有的:
有2种方法
1.alchemy
介绍完毕,我可以看到adobe把alchemy吹的神呼其神,事实上好像确实不错^_^。但是我们今天要用到的不是alchemy执行C/C++代码飘逸的效率,而是利用alchemy暂时(我只能说暂时,鬼知道以后asv会不会也能把alchemy给还原成C)无法被反编译的特性,有点旁门左道了,我想adobe捣鼓alchemy的初衷肯定不是让开发者用来加密自己的swf。但谁让adobe把swf格式公开了呢(这里扯个淡,任何东西都可能是双刃剑,破解使开发的劳动成果被瞬间复制的同时也间接间或一部分成就了flash的遍地开花,山寨起来容易啊,在天朝山寨才是王道,个人观点仅供参考,不要纠结flash真正火的原因),
http://s3/bmiddle/731fdd2bgc66d673bdc92&690
如上图为alchemy的一个HelloWorld的示例程序,你可以在C(alcnemy)返回我们解密用到的数字7,或者你觉得用数字其不放心。可以用个公式算一个数字出来返回。Alchemy的性能,我想再复杂的运算都是轻松搞定的。
如上图所示。 我仅仅写了个helloworld的程序。Alchemy就给我编译出几百个AS类来(截图只是一部分),你能找出还原算法在哪个文件里面吗。反正我是找不出,
还原时你要做的就是。 把alchemy编译的swc放到工程库里,执行如下代码,用返回的数字来欢迎core.swf的文件头。
http://s1/bmiddle/731fdd2bgc66d67df4ed0&690
二:Pixel Bender
Pixel Bender与硬件无关,可高效地运行于各种GPU和CPU体系结构之上。Pixel Bender开发人员通过编写Pixel Bender代码来创建滤镜。 欲知道详情请点击度娘
和alchemy一样。Adone
捣鼓Pixel
Bender的初衷肯定也不是让开发者用来加密自己的程序。但是没办法,被adobe逼的呀、
http://s2/bmiddle/731fdd2bgc66d6816fe61&690
如图所示,你可以在pixelBender的返回值里,返回我们还原core.swf需要的用到的数字7。
用pixelBneder解密的过程过程可能有点复杂,不能直接调用方法并返回值。需要监听渲染成功事件。
http://s14/bmiddle/731fdd2bgc66d69ea3e0d&690
http://s5/bmiddle/731fdd2bgc66d6a1286a4&690
如图fuckNum(罪过粗口了)就是我们的还原core.swf文件头需要用到的数字了
=============================================================================================