吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8069|回复: 44
收起左侧

[Android 原创] 记对某安卓Unity3D音游的逆向

  [复制链接]
rsjw 发表于 2022-8-30 11:00
本帖最后由 rsjw 于 2022-8-30 17:08 编辑

0x00 背景

在打某个单机音游时手残打不过一关
不能透露包名

0x01 解包

Unity脚本后处理的两种方式 Mono / IL2CPP,将C#脚本转为中间语言il,所以关键的脚本都在其中。

使用 APKTOOL 解包之后,在 lib/arm64-v8a 下发现了 libil2cpp.so,说明这个用了 il2cpp。

a.png

用 IDA 打开之后无从下手,按照 il2cpp 的方式,需要先找到元数据 Metadata。

打开 assets\bin\Data\Managed\Metadata 目录,但是惊讶地发现只有一个 game.dat,而且不是 global-metadata.dat。为了方便,决定直接从内存里找。global-metadata_dump 就是从内存中 DUMP metadata 的工具,原理是识别 Metadata 特殊的文件头,效果十分好。

安装 Frida 和安卓虚拟机,连接好之后使用 global-metadata_dump,得到正确的 global-metadata.dat,再使用 il2cppDumper 成功恢复 Assembly-CSharp.dll 等。

a.png

a.png

0x02 逆向

使用 il2cppdumper 自带的功能将 dump 出的信息用py脚本导入 IDA 中。

初心是想研究一下存档文件,文件看上去是这样子的:

a.png

编码显然是 Base64,但是解码后乱七八糟,说明有什么特殊的编码/加密方法。

是用 UnityEngine::PlayerPrefs 生成的,于是来到这个函数,使用 jump to xref

a.png

a.png

看上去应该和 SaveManagement 有关系,

a.png

改好之后发现加密在这个 Encrypt 函数:

现在使用 DnSpy 导入 DLL:

a.png

a.png

反复研究之后,发现这是先都转化成 UTF-16,然后使用 C# 自带的 DESCryptoServiceProvider 加密,然后再转成 Base64 的。经过查阅资料,默认方式为 CBC,PAD 是 PAD_PKCS5。
问题就在于找到这个密码了。根据以上规则,C# 默认方式一定需要恰好4个英文字符。

a.png

刚好是四个大写字母。

0x03 验证

经过这一遭,我写了一个丑陋的 Python 代码。

import pyDes, base64
DES_SECRET_KEY = "????".encode("utf_16_le")
def Dec(base64_str):
    base64_str = base64_str.replace("%2B", "+")
    base64_str = base64_str.replace("%2F", "/")
    base64_str = base64_str.replace("%3D", "=")
    des_obj = pyDes.des(DES_SECRET_KEY, pyDes.CBC, DES_SECRET_KEY, padmode=pyDes.PAD_PKCS5)
    s = des_obj.decrypt(base64.b64decode(base64_str))
    return s.decode("utf-16")

def Enc(s):
    s = s.encode('utf_16_le')
    des_obj = pyDes.des(DES_SECRET_KEY, pyDes.CBC, DES_SECRET_KEY, padmode=pyDes.PAD_PKCS5)
    base64_str = base64.b64encode(des_obj.encrypt(s))
    base64_str = base64_str.decode()
    base64_str = base64_str.replace("+","%2B")
    base64_str = base64_str.replace("/","%2F")
    base64_str = base64_str.replace("=","%3D")
    return base64_str

raw = input()
print(Dec(raw))

果然成功了。

a.png

不过改完之后立马就索然无味了。

0x04 Patch

我还有些想法,想放宽游戏中的判定时间:

a.png

ARM 的架构使得 IDA 不支持直接修改汇编指令。所以要自己计算 HEX,用这个 网站 改了数据。
具体来说,如果像我一样不熟悉,网站不能自动识别部分格式的命令,可以导入 HEX 转出来汇编再编辑。
重新打包签名安装之后:果然奏效了。

a.png

免费评分

参与人数 12威望 +2 吾爱币 +111 热心值 +12 收起 理由
烧饼丶收割者 + 1 我很赞同!
sywee + 1 用心讨论,共获提升!
zhaoduck + 1 + 1 用心讨论,共获提升!
mmuu1987 + 1 + 1 我很赞同!
zpzwz + 1 + 1 谢谢@Thanks!
CrazyNut + 3 + 1 用心讨论,共获提升!
minboss + 1 + 1 热心回复!
qtfreet00 + 2 + 100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
kingty_x + 1 + 1 索然无味,贤者模式
yuweb + 1 + 1 热心回复!
kingzswang + 1 + 1 感谢您的宝贵建议,我们会努力争取做得更好!
chinawolf2000 + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

RandomUsername 发表于 2022-11-19 11:30
注册就是为的这篇帖子,感谢
但是±80ms还不够宽吗(
飞龙project 发表于 2022-12-23 20:14
使用存档解密的脚本,发现解不出来任何字符串,这是为什么?还有在对name进行解密时会报错
[Python] 纯文本查看 复制代码
UnicodeDecodeError: 'utf-16-le' codec can't decode bytes in position 32-33: illegal UTF-16 surrogate
icjhao 发表于 2022-8-30 12:36
 楼主| rsjw 发表于 2022-8-30 12:38
某一个音乐游戏
skywalker0123 发表于 2022-8-31 20:31
不会是Phigros吧
GJH588 发表于 2022-8-31 20:37
这个没点基础的人很难看懂,不错的分析
xixicoco 发表于 2022-8-31 23:18
楼主厉害的额
hesqiang 发表于 2022-9-1 10:00
感谢分享
p1b234 发表于 2022-9-1 13:11
打个标签,正好学习。先进收藏夹。
JasonMiracle 发表于 2022-9-4 21:33
感谢分享,学习一下
JasonMiracle 发表于 2022-9-5 00:15
学习楼主的思路
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-26 17:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表