【Android安全-某江湖类手游资源解密过程】此文章归类为:Android安全。
某江湖类手游资源解密过程
免责声明:此文以学习研究为目的,切勿用于商业用途,否则,后果自负!
Part I - 脱壳
没啥可说的,直接丢 dump.bf 了事。
Part II - 过签
用 NP管理器 打开脱出来的 classes.dex,搜索 System;->exit
得到 9 条结果:
注意 org.cocos2dx.lua
字样,确定游戏采用 Cocos2d-x 引擎开发。
挨个点开看看上下文,发现 没有签名!!
字符串:
转为 Java 代码(对比 Smali,一目了然),来到 checkPackage()
函数:
没错,这就是我们要找的验签函数。当然,你可以直接注释掉验证过程,但这里要想把原来的包签名改成新包签名,就得知道新包的签名值。
重新打包,安装,然后请出 算法助手,hook 新包 getAppSignature()
函数:
运行新包直到闪退,拿到新签名值:
改好签名,一顿操作猛如虎,再次运行,又闪退。。。行吧,看来还有 Native 验证。
请出 IDA Pro 打开 libcocos2dlua.so,直接搜原包签名值改成新值:
再次打包,运行,好了,成功过签~
Part III - 解密
上节我们了解到游戏采用 Cocos2d-x 引擎开发,资源文件大概率采用 XXTEA 算法加密。在 IDA Pro 中搜索 xxtea
果然有所发现:
进入 xxtea_decrypt(...)
函数,没发现 key 的痕迹。查看交叉引用,发现如下几个函数:
挨个看看,发现 cocos2d::LuaStack::loadCai(...)
这个函数有点可疑:
静态分析有点难,那咱跑起来!打好断点,开始动调:
图片暂时省略,截图太麻烦了。。。
发现对 .lua 文件,解密分两步,第一步为 xorlua_encrypt
,第二步为 xxtea_decrypt
。
动调拿到 key 后,我们拿出 CyberChef 验证下:
结果显而易见,成了。。。
Part IV - IDAPython
一键设置动调断点,脚本:
1 2 3 4 5 6 7 8 9 10 11 | import idautils
for segment in idautils.Segments():
if 'libcocos2dlua.so' in idc.get_segm_name(segment):
base = idc.get_segm_start(segment)
print ( 'Load libcocos2dlua.so on {}' . format ( hex (base)))
offsets = ( 0x53DB28 , 0x62FCB4 , 0x62FE78 , 0x707FDC , 0x708098 , 0xB77698 , 0xB9CD28 )
for offset in offsets:
address = base + offset
add_bpt(address)
print ( 'Add bpt on {}' . format ( hex (address)))
break
|
Part IV - 解密脚本
太懒,只放关键函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import xxtea
def xor(data, key):
tmp_key = len (data) / / len (key) * key + key[: len (data) % len (key)]
tmp_data = b''
for i in range ( len (data)):
tmp_data + = (data[i] ^ tmp_key[i]).to_bytes(length = 1 , byteorder = 'little' , signed = False )
return tmp_data
def xxtea_decrypt(data, key):
result = xxtea.decrypt(data, key, padding = False )
result = result[: len (result) - 7 ]
return result
|
好吧,编辑文章太麻烦了,跳跃很大,将就看吧,此文宣布烂尾,呜呼哀哉。。。
最后于 5小时前
被zjphoenix编辑
,原因: 修改格式
更多【Android安全-某江湖类手游资源解密过程】相关视频教程:www.yxfzedu.com