让xxtea_key自己说出来
最近在破解一款cocos2dx-js游戏,想看看js代码, 发现so文件中的xxtea key 是加密过的, 常规思路我想到是动态调试。
使用ida工具和jeb工具,发现只要一断点到关键地方, 就自动崩了, 搞的要吐血。 只要不调试,程序是可以正常跑的。
经过几天的断断续续的奋战, 决定换一种思路,让xxtea key自己在控制台输出。 使用方法:__android_log_write
使用hopper 修改so文件的xxtea_decrpt方法,
xxtea_decrypt:
0056bd84 push {fp, lr} ; DATA XREF=xxtea_decrypt@PLT+8, xxtea_decrypt@GOT
0056bd88 mov fp, sp
0056bd8c add r1, pc, #0xc ; "keyCode"
0056bd90 mov r0, #0x4
0056bd94 bl __android_log_write@PLT ; __android_log_write
0056bd98 mov r0, #0x0
0056bd9c pop {fp, pc}
; endp
aKeycode_56bda0: // aKeycode
0056bda0 db "keyCode", 0
保存后,重新打包apk, 运行。
实操截图:
1. 某游戏的xxtea_decrypt方法:

2. 修改so文件:

3. 保存替换原始so后,重新打包。

非常遗憾,使用工具重新打回apk包失败了。 那么换种思路:
使用keka压缩工具成zip,然后修改为apk吧, 然后重新签名

将压缩的zip文件重命名为: debug-xxtea.apk
重新签名:

然后安装到模拟器中。
4, 打开android studio选择连接的模拟器看输出日志。
运行程序崩了。且没有keyCode输出。 表示很意外。
使用ida反编译:

使用hopper反编译:

同一个二进制反编译出的结果不一样。
=======================================
打破砂锅问到底之后, 我真正理解了BL指令。
BL指令固定4个字节。 前三个字节是相对地址,第4个字节是BL指令字节码EB
相对地址是指相对的是当前方法结束指令地址的。 本人写了一个转换工具。参数是你想要调用的方法的地址。
let cur0 = 0x00654e78;// 当前方法结束地址
function getHEX(a) {
if (a >= 16) {
return a.toString(16);
}
return '0' + a.toString(16);
}
function getAddr(dst) {
let arr = [], a = 0;
let dif = dst - cur0;
if (dif >= 0) {
a = dif / 4;
} else {
let start = 0x1000000;
a = start - (-dif) / 4;
}
arr.push(getHEX(a & 0xff));
a >>= 8;
arr.push(getHEX(a & 0xff));
a >>= 8;
arr.push(getHEX(a & 0xff));
return arr.join(' ');
}
console.log(getAddr(0x0050f3d8));

0x0050f3d8是方法地址。
输出结果:58 e9 fa
故修改指令:

反汇编结果:

应该调用__android_log_write@PLT 而不是__android_log_write。
现在重新保存,打包apk. 运行在,android studio中看结果

非常好,结果xxtea key的结果出来了。

浙公网安备 33010602011771号