Project SEKAI 逆向(2): Frida动态调试及取API AES KEY/IV
- 分析variant:世界計劃 2.6.1 (Google Play 台服)
0. 版本更新
毕竟美服的数据库滞后好几个版本号…
换到台服之后版本号(2.4.1->2.6.1)有变化,同时上一篇所说的metadata
加密手段也换了
- 同样,拉取一份修复过的dump分析,可见:
metadata
加载部分不再进行全局加解密,观察二进制也可以发现:
2.4.0解密后metadata
2.6.1源metadata
多出来8字节?
- 加载部分出入不大,尝试删掉8字节直接分析
- 卡在读string这一块;到
Il2CppGlobalMetadataHeader.stringOffset
检查一下
- 果然有混淆;这部分应该是明文,而unity的例子中开始应该是
mscrolib
- 而so中il2cpp对metadata的使用却没加多余步骤;推测这部分在加载时进行了原地解密
1. metadata 动态提取
- 和上一篇记录的
il2cpp.so
提取步骤如出一辙,这里不再多说
- 比对apk的和dump出来的二进制:
果然string部分明朗了;继续dump
- 成功!带信息进ida;而非常戏剧化的事情是:
混淆没了。
果然是非常pro-customer的版本更新啊(确信)
2. frida-gadget 注入
WSA上注入各种碰壁,不过实体机上即使无Root也可以通过frida-gadget
修改apk注入
之前用过改dex的方式尝试过,并不成功;挑一个运行时会加载的.so下手:
注: 后面目标lib换成了libFastAES.so
,截图尚未更新
拿apktool打包后签名即可安装到真机
注: 我的frida跑在WSL上,拿 Windows 机器的adb做后端在 Win/Linux 机器配置分别如下
adb.exe -a -P 5555 nodaemon server
export ADB_SERVER_SOCKET=tcp:192.168.0.2:5555
3. IL2CPP 动态调用 runtime
接下来就可以直接调用runtime的东西了
- 回顾上文,貌似API业务逻辑只加了一套对称加密(AES128 CBC);这里同样如此
总结:
APIManager
为单例实例APIManager.get_Crypt()
取得Crypt
,其aesAlgo
即为.NET标准的AesManaged
综上,简单写一个脚本:
import "frida-il2cpp-bridge";
Il2Cpp.perform(() => {
Il2Cpp.domain.assemblies.forEach((i)=>{
console.log(i.name);
})
const game = Il2Cpp.domain.assembly("Assembly-CSharp").image;
const apiManager = game.class("Sekai.APIManager");
Il2Cpp.gc.choose(apiManager).forEach((instance: Il2Cpp.Object) => {
console.log("instance found")
const crypt = instance.method<Il2Cpp.Object>("get_Crypt").invoke();
const aes = crypt.field<Il2Cpp.Object>("aesAlgo");
const key = aes.value.method("get_Key").invoke();
const iv = aes.value.method("get_IV").invoke();
console.log(key);
console.log(iv);
});
});
输出如下:
- 测试解密
测试脚本如下:
from Crypto.Cipher import AES
def unpad(data):
padding_len = data[-1]
return data[:-padding_len]
def decrypt_aes_cbc(data, key, iv):
cipher = AES.new(key, AES.MODE_CBC, iv)
return unpad(cipher.decrypt(data))
payload = open('payload','rb').read()
key = b"g2fcC0ZczN9MTJ61"
iv = b"msx3IV0i9XE5uYZ1"
plaintext = decrypt_aes_cbc(payload, key, iv)
print(plaintext)
不清楚序列化格式是什么,可能是protobuf;还是在下一篇继续调查吧
SEE YOU SPACE COWBOY…
References
https://lief-project.github.io/doc/latest/tutorials/09_frida_lief.html