首页
社区
课程
招聘
[求助]打开某页游SWF文件,也找到了关于FB的加密代码。
2017-11-8 20:48 4853

[求助]打开某页游SWF文件,也找到了关于FB的加密代码。

2017-11-8 20:48
4853
但是, 看不懂AS语言。。。有懂的大牛,帮看下
这加密过程是怎样的。。。
多谢!附件里有完整的SWF文件。
上面图片里是名为“encrypt”的AS代码。
encrypt代码位置是在 gameframe.swf/动作/crypto/Encrypt
ClientPacket代码位置是在 gameframe.swf/动作/communicate/packet/ClientPacket

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 0
打赏
分享
最新回复 (6)
雪    币: 39
活跃值: (158)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
syskeylbz 2017-11-9 16:17
2
0
我只懂c++  lua  还有一点php  ,凑合着看你截图的算法(encode和decode)流程好像是  makey  设置  keybuff[4]  还原成c++应该是
for(int  i  =  0;  i  <  4;  i  ++)
{
              KeyBuff[i]  =  (((SelfSalt  ^  TargetSalt)  +  SelfSalt  +  8654)  &  255  <<  (i  <<  3)  )  >>  (i  <<  3)
}
然后后面的encode和decode 加解密都是用 一个数组里每个字节  异或  KeyBuff , 所以关键还是得到这个KeyBuff,至于里面的 获取 随机数是干嘛的,截图里面没调用到, 从截图上看我只得到这么多信息了, 不知道能不能帮助到你.
雪    币: 225
活跃值: (597)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
WYYZCAYQ 2017-11-9 22:23
3
0
@syskeylbz      看你的讲解,我比之前明白了很多。谢谢!
1,makesalt(制造随机数salt)函数里面有一句var  _loc_2:*=MathRandom()*_loc_1.time
我百度没搜到后面.time是什么意思。。。这个".time"的意思在这里又很重要。。。只找到
"对象.gettime"返回的是把"1970/1/1"与“上一句代码(new  date())获取的时间“作差的差值,
并以毫秒来表示。这里的_loc_1.time如果是这个意思,就是返回一个时间差,然后和
MathRandom()返回值相乘,得到一个由”当前时间“和”mathrandom随机数“决定的数。
这个数就是makesalt()函数的返回值。然后根据代码第9行(才发现AS代码前面有行数标识
。。。),确定selfsalt的值。是这样吗。。。
2,代码第37行,出现了param1变量,并且把param1的值赋值给targetsalt,然后获得了
selfsalt  和targetsalt,执行makekey()制造密钥。param1的值是怎么得到的。。这个SWF文
件有很多AS代码文件,虽然英文名字都把功能写得很清楚,但是我不知道怎么去看这个
param1是作为什么意义传进这个settargetsalt()函数。。。
3,你上面的给的式子我看了,代码制造的密钥keybuff[]是一个4个元素的数组。代码第44行
到第62行,我只看到一个把param1字节数组的长度值赋值给_loc_4。之后从param1的0号
元素开始,执行
param1[0]=param1[0]  ^  keybuff[0%4]
param1[1]=param1[1]  ^  keybuff[1%4]
直到对param1字节数组里的每个元素完成加密。
那么总结下,就是需要知道param1是个什么值。。。这个我无从下手。。还需要知道mathrandom()
的值,这个是返回一个0到1的随机数,该不会每次发封包,都执行一次mathrandom(),生成一个新的
随机数,然后生成一个新的KEY和keybuff[],然后对明文加密把。。。。。或者加载flash页游,只执行
一次mathrandom(),生成一个key。这个KEY不会改变,直到退出flash页游。下次加载flash,重新执行
mathrandom(),生成新KEY。或者这里的mathrandom()有其他意义?。。。。。。
我有一个猜想,param1里面存的是”封包里面需要加密的明文字段“。代码第39行,把要加密的明文数值
赋值给targetsalt,之后执行makekey()函数,用    "明文数值"    与  "mathrandom()和当前时间决定的selfsalt"
进行运算,决定keybuff[]。之后再把param1(需要加密的明文)转成字节数组,在encode函数里,按顺序把明文
的每8位,与对应的keybuff数组元素进行运算,完成对明文的加密。这是我的猜想,不知道是不是正确。。。
如果前面分析得不错的话,只要知道下面3个,就能知道加密方式。
1,mathrandom的值。是没加载一次flash,都生成一个mathrandom()的值,并且在flash关闭前这个值不会变。
2,第22行那个".time"后缀的意义。是和".gettime"一样,取当前时间与1970年1月1日的时间差(时间差以毫秒表
示)。。。?
3,param1的值和逻辑意义(有关于系统时间或者其它的逻辑意义)。
花了几个小时整理,希望我有表达清楚我想说的。。。。
附件里有GameFrame.swf,里面除了这个AS代码,还有其它的,其它的我只看到有个名为"lientpocket"的代
文件对加密可能有用。
能不能帮看看。。。。。我是真的完全不知道怎么去跟那个param1变量的来源。。。
我在悬赏区也开了贴子,有偿。谢谢了!
雪    币: 39
活跃值: (158)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
syskeylbz 2017-11-10 10:50
4
0
param1这个参数是什么意思需要结合具体调用情景来猜,  比如,哪里调用了encode函数就会传param1参数,然后你向上找param1值来源.
GameFrame.swf  我不知道用什么工具分解出这么多源码文件,我双击打开就是用音频播放器打开了,  所以我只能从你给的截图来分析
雪    币: 225
活跃值: (597)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
WYYZCAYQ 2017-11-10 13:45
5
0
我搜索字符串,找到了另外有个位置并且只有那一个位置调用了settargetsalt()函数,在那传入了param1。往上看,怎么构成param1的值的,看不懂额。。
还有调用encode()函数的地方也搜索到了,是clientpacket文件代码里的某行(Encrypt.encode(param1);),我试着在调用encode()函数的代码前面,找param1的来源,结果只找到public  function  Clientpacket(param1:bytearray)代码。。。说明param1是在调用Clientpacket()函数的地方传入的把?。。。我继续搜索Clientpacket....
然后找到很多代码,几乎都是关于clientpacketTypes的,不过看到一句  this.writebytes(new  clientpacket(param1))  看不懂。。。。不知道接下来怎么去跟了。。
我搞不定这个。。。。。。目的是找到param1的来源,确定它是怎么得的,它的逻辑意义是什么。

用硕思闪客精灵可以反编译swf文件。可以看到SWF里的图片,还有动作AS代码。这个SWF文件本身没加密,直接可以用硕思闪客软件打开,看到AS代码了。
能帮看看吗。。我弄了几天了,不会。。。自己也努力在思考,还是解决不了。。。
雪    币: 51
活跃值: (346)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
白菜大叔 2017-11-23 09:12
6
0
这个swf你光用反编译软件看代码没用的,按照它的代码去解密也解不了的,有隐藏的强制转换,反编译软件没搞出来就是。其实逻辑你都找对了。
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
徐心化千古 2017-12-13 23:22
7
0
,,
游客
登录 | 注册 方可回帖
返回