SWF加密之隐藏密钥篇
程序员文章站
2022-07-10 09:52:00
本片博文介绍的加密方式为最基础的隐藏密钥的加密方式,当然目前来说这样的加密方式也是可以被破解的,也只是防君子不能放小人,加密最终极的办法还是混淆。(在swf文件个公开的情况下,如果adobe不...
本片博文介绍的加密方式为最基础的隐藏密钥的加密方式,当然目前来说这样的加密方式也是可以被破解的,也只是防君子不能放小人,加密最终极的办法还是混淆。(在swf文件个公开的情况下,如果adobe不提供支持,大部分情况下对swf的加密都是徒劳的),本篇只是对swf加密方式的一个整理,分享一种思路。如果您是swf加密高手很期待和您交流,
密钥隐藏
破环swf标准文件头是最简单也是最常用的方法。 向swf的二进制文件的文件头写入无意义的数据,这样就可以导致破解软件无法正常解析swf。
如图所示,向core.swf的ByteArray开始位置写入无意义的数据,
这样做的原理是Swf文件的前几位表示这个swf的版本信息,以及解析swf需要的参数数据,把它修改为无意义的数据,反编译程序自然也就无法解析了, 当然如果你这样做了之后,也会造成在运行时flashPlayer无法解析core.swf,
正所谓加密和解密是必定会是同时存在的一对好基友。所以我们就需要在core.swf加载好之后把破环的文件头还原回来,你就需要如一个正常的loader.swf来加载被加密的swf,并且把加载的swf文件头还原回来。如下代码
由于总所周知的原因,这样做只能防君子不能防小人,只是增加了破解者一点点工作量而已,破解者不能直接反编译core.swf、但是他可以破解loader.swf来找到解密代码(如上图红框的数字7是明文存在在loader.swf里的),来还原core.swf的文件头。然后继续用反编译软件进行反编译,
参考资料 (摘自不知出处的地方)
SWF文件头
所有的SWF文件均以以下头部开始:
SWF文件头
上述方法仅仅只能防止一些对swf不了解的外行人,
如上图红框的数字7是明文存在在loader.swf里的。 那现在的思路就很清晰了,要做的就是把好个明文的数字7给隐藏起来,达到让破解者无法还原core.swf文件头。由于swf文件格式是公开的,毫无保密性,所以任何用AS实现的加密算法都是耍流氓(没用的),那我们有没有办法用其他方法来隐藏数字7呢。答案是有的:
有2种方法
1.alchemy
Alchemy 能够编译C/C++代码为AS3字节码(运行在AVM2上)能够运行在Flash或者Flex平台,并且Adobe宣传Alchemy能够为计算密集型任务提升性能(但是比原生C/C++慢),
介绍完毕,我可以看到adobe把alchemy吹的神呼其神,事实上好像确实不错^_^。但是我们今天要用到的不是alchemy执行C/C++代码飘逸的效率,而是利用alchemy暂时(我只能说暂时,鬼知道以后asv会不会也能把alchemy给还原成C)无法被反编译的特性,有点旁门左道了,我想adobe捣鼓alchemy的初衷肯定不是让开发者用来加密自己的swf。但谁让adobe把swf格式公开了呢(这里扯个淡,任何东西都可能是双刃剑,破解使开发的劳动成果被瞬间复制的同时也间接间或一部分成就了flash的遍地开花,山寨起来容易啊,在天朝山寨才是王道,个人观点仅供参考,不要纠结flash真正火的原因),
如上图为alchemy的一个HelloWorld的示例程序,你可以在C(alcnemy)返回我们解密用到的数字7,或者你觉得用数字其不放心。可以用个公式算一个数字出来返回。Alchemy的性能,我想再复杂的运算都是轻松搞定的。
如上图所示。 我仅仅写了个helloworld的程序。Alchemy就给我编译出几百个AS类来(截图只是一部分),你能找出还原算法在哪个文件里面吗。反正我是找不出,
还原时你要做的就是。 把alchemy编译的swc放到工程库里,执行如下代码,用返回的数字来欢迎core.swf的文件头。
二:Pixel Bender
Pixel Bender是Adobe开发的一种编程语言,用户可以使用该语言创建自定义滤镜、效果和混合模式,以用于Flash、AE(After Effects)和Photoshop。
Pixel Bender与硬件无关,可高效地运行于各种GPU和CPU体系结构之上。Pixel Bender开发人员通过编写Pixel Bender代码来创建滤镜。 欲知道详情请点击度娘
和alchemy一样。Adone 捣鼓Pixel Bender的初衷肯定也不是让开发者用来加密自己的程序。但是没办法,被adobe逼的呀、
如图所示,你可以在pixelBender的返回值里,返回我们还原core.swf需要的用到的数字7。
用pixelBneder解密的过程过程可能有点复杂,不能直接调用方法并返回值。需要监听渲染成功事件。
如图fuckNum(罪过粗口了)就是我们的还原core.swf文件头需要用到的数字了
=======================================
好了。回到开始,以上介绍的加密方式目前来说都是可以被破解的,只增加了点破解的难度,加密最终极的办法还是混淆。这里只是对swf加密方式的一个整理,分享一种思路。如果您是swf加密高手很期待和您交流
密钥隐藏
破环swf标准文件头是最简单也是最常用的方法。 向swf的二进制文件的文件头写入无意义的数据,这样就可以导致破解软件无法正常解析swf。
如图所示,向core.swf的ByteArray开始位置写入无意义的数据,
这样做的原理是Swf文件的前几位表示这个swf的版本信息,以及解析swf需要的参数数据,把它修改为无意义的数据,反编译程序自然也就无法解析了, 当然如果你这样做了之后,也会造成在运行时flashPlayer无法解析core.swf,
由于总所周知的原因,这样做只能防君子不能防小人,只是增加了破解者一点点工作量而已,破解者不能直接反编译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不了解的外行人,
如上图红框的数字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真正火的原因),
如上图为alchemy的一个HelloWorld的示例程序,你可以在C(alcnemy)返回我们解密用到的数字7,或者你觉得用数字其不放心。可以用个公式算一个数字出来返回。Alchemy的性能,我想再复杂的运算都是轻松搞定的。
如上图所示。 我仅仅写了个helloworld的程序。Alchemy就给我编译出几百个AS类来(截图只是一部分),你能找出还原算法在哪个文件里面吗。反正我是找不出,
还原时你要做的就是。 把alchemy编译的swc放到工程库里,执行如下代码,用返回的数字来欢迎core.swf的文件头。
二:Pixel Bender
Pixel Bender与硬件无关,可高效地运行于各种GPU和CPU体系结构之上。Pixel Bender开发人员通过编写Pixel Bender代码来创建滤镜。 欲知道详情请点击度娘
和alchemy一样。Adone 捣鼓Pixel Bender的初衷肯定也不是让开发者用来加密自己的程序。但是没办法,被adobe逼的呀、
如图所示,你可以在pixelBender的返回值里,返回我们还原core.swf需要的用到的数字7。
用pixelBneder解密的过程过程可能有点复杂,不能直接调用方法并返回值。需要监听渲染成功事件。
如图fuckNum(罪过粗口了)就是我们的还原core.swf文件头需要用到的数字了
=======================================
上一篇: 现在的新站该怎么生存?