|
吾爱游客
发表于 2022-9-16 22:24
申 请 I D:紫羽幻天
2、个人邮箱:894302300@qq.com
3、会点小程序逆向,libcocos2djsc和il2cpp的简单修改
问题:程序存档被加密,如何解密存档?
工具:IDA7.0,ida7.7绿色版,frida12.8.4
分析过程:
文件显示很像base64加密,用base64直接解密显示乱码,所以猜测在base64之前有过别的运算。
打开ida,待加载完成后,加载ida_with_struct.py,选择script.json和il2cpp.h以使代码易读
搜索base64的相关函数
[img][/img]
根据经验,像这种3个base64_xxx的就是base64函数,挨个点开看,发现第二个只有一个引用,是System_String_o *__cdecl EncryptDecipherTool__Encrypt_5036616,
[img][/img]
在他的运算下有类System_Security_Cryptography_RijndaelManaged_o,由此判断,其为aes加密(经验,RijndaelManaged貌似是专用的加密库)
[img][/img]
接下来就是用frida hook下该地址,打印出它的key值
因为我们无法判断什么时候程序加载il2cpp,所有要提前hook dlopen,在加载了il2cpp后再执行脚本
function hook_dlopen(){
var func=Module.findExportByName(null,"dlopen");
var find = false;
console.log('[+] dlopen '+ func.toString())
Interceptor.attach(func, {
onEnter: function (args) {
find = false;
this.so_path = Memory.readCString(args[0])
if (this.so_path.indexOf("libil2cpp.so") >= 0){
find = true;
console.log(this.so_path)
}
},
onLeave: function (retval) {
if(find){//find为true时加载attach_matched脚本
attach_matched(this.so_path)
}
}
});
}
il2cpp加载后,执行脚本
function attach_gold(so_path){
var func = get_func_by_offset("libil2cpp.so",0x4cda48)
console.log('[+] hook '+func.toString())
Interceptor.attach(func, {
onEnter: function (args) {
console.log('**********************')
var hookx=0;
if(hookx==0){
console.log('arg0',args[0])
console.log('arg1',args[1])
console.log(print_dump(args[1],50))
console.log(Memory.readUtf16String(args[0].add(0x0c)))
//add(0x0c)是在地址的指针基础上添加0x0c的偏移,从数据结构里面看
//readUtf16String是so层读取utf16字节的函数,读取utf8的是readUtf8String
console.log(Memory.readUtf16String(args[1].add(0x0c)))
}else{
console.log("find",JSON.stringify(this.context))
console.log(print_dump(this.context.r1,1000))
}
},
onLeave: function (retval) {
console.log(Memory.readUtf16String(retval))
}
});
}
hook后得到arg[1]的值是‘xxxxxx857fe56dcb0a3004eed8a2715d’
因为入参里只有未加密字符串和key,猜测用的是aes的ecb模式,找个在线网站,正确解密
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|