首页
社区
课程
招聘
[原创]某江湖类手游资源解密记录
发表于: 2024-6-4 22:41 3963

[原创]某江湖类手游资源解密记录

2024-6-4 22:41
3963

免责声明:此文以学习研究为目的,切勿用于商业用途,否则,后果自负!

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
 
#result, data, key -- type of bytes
#make sure len(data) >= len(key)
def xor(data, key):
    tmp_key = len(data)//len(key)*key + key[:len(data)%len(key)] #equalize lengths of data and 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
 
#result, data, key -- type of bytes
#fix bug in xxtea
def xxtea_decrypt(data, key):
    result = xxtea.decrypt(data, key, padding=False)
    result = result[:len(result) - 7] #xxtea库貌似有Bug,不加此句报错!
    return result

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2024-7-14 15:32 被zjphoenix编辑 ,原因: 修改格式
收藏
免费 4
支持
分享
最新回复 (11)
雪    币: 2
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
为什么直接找system->exit函数呢
2024-6-5 08:42
0
雪    币: 510
活跃值: (540)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
mb_artypltt 为什么直接找system->exit函数呢
程序闪退,需要调用系统函数。
2024-6-5 08:46
0
雪    币: 2
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
那请问是因为脱壳后无法正常运行,还是因为模拟器中闪退?
2024-6-5 08:51
0
雪    币: 510
活跃值: (540)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
mb_artypltt 那请问是因为脱壳后无法正常运行,还是因为模拟器中闪退?
脱壳
2024-6-5 09:03
0
雪    币: 2
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
好的,谢谢,学到很多
2024-6-5 09:06
0
雪    币: 510
活跃值: (540)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
mb_artypltt 好的,谢谢,学到很多
互相学习
2024-6-5 09:10
0
雪    币: 8
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8

应该更新了,最新核心lua代码,dump下来加密了, 前缀sb  开头还骂人

上传的附件:
2024-9-12 13:04
0
雪    币: 510
活跃值: (540)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
mb_arpkwetv 应该更新了,最新核心lua代码,dump下来加密了, 前缀sb  开头还骂人
一直是这样的,魔改版luajit,已经解开了
2024-9-13 16:59
0
雪    币: 211
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
zjphoenix 一直是这样的,魔改版luajit,已经解开了
这不再来一期,搞爆他
2024-9-14 16:58
0
雪    币: 510
活跃值: (540)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
那么一下下 这不再来一期,搞爆他
发文太麻烦了,抛砖引玉,大家参悟
2024-9-14 17:41
0
雪    币: 19
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
zjphoenix 一直是这样的,魔改版luajit,已经解开了
这游戏貌似直接dump下来的脚本文件一直都是有问题的吧
12小时前
0
游客
登录 | 注册 方可回帖
返回
//