免责声明:此文以学习研究为目的,切勿用于商业用途,否则,后果自负!
Part I - 脱壳
没啥可说的,直接丢nop.gs了事。
Part II - 过签
打开脱出来的classes.dex
,搜System;->exit
得到 9 条结果:
注意org.cocos2dx.lua
字样,确定游戏采用Cocos2d-x
引擎开发。
挨个点开看看上下文,发现没有签名!!
字符串:
转为Java
代码,来到checkPackage()
函数:
没错,这就是我们要找的验签函数。当然,你可以直接注释掉验证过程,但这里要想把原来的包签名改成新包签名,就得知道新包的签名值。
重新打包安装,然后请出算法助手hook新包getAppSignature()
函数:
运行新包直到闪退,拿到新签名值:
改好签名,一顿操作猛如虎,再次运行,又闪退。。。行吧,看来还有Native
验证。
用IDA打开libcocos2dlua.so
,直接搜原包签名值改成新值:
再次打包,运行,好了,成功过签~
Part III - 解密
上节了解到游戏采用Cocos2d-x
引擎开发,资源大概率采用XXTEA
算法加密。
在IDA中搜索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 - 解密脚本(Python)
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
|
[注意]APP应用上架合规检测服务,协助应用顺利上架!
最后于 2024-7-14 15:32
被zjphoenix编辑
,原因: 修改格式