【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
|
好吧,编辑文章太麻烦了,跳跃很大,将就看吧,此文宣布烂尾,呜呼哀哉。。。
最后于 3小时前
被zjphoenix编辑
,原因: 修改格式
更多【Android安全-记录新手解密某江湖类手游资源过程】相关视频教程:www.yxfzedu.com