最近在破解一款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方法:

让xxtea_key自己说出来_其他

 

 2. 修改so文件:

让xxtea_key自己说出来_其他_02

 

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

让xxtea_key自己说出来_其他_03

 

非常遗憾,使用工具重新打回apk包失败了。 那么换种思路:

使用keka压缩工具成zip,然后修改为apk吧, 然后重新签名

让xxtea_key自己说出来_其他_04

 

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

重新签名:

让xxtea_key自己说出来_其他_05

 

然后安装到模拟器中。

4, 打开android studio选择连接的模拟器看输出日志。

运行程序崩了。且没有keyCode输出。 表示很意外。

使用ida反编译:

让xxtea_key自己说出来_其他_06

 

 使用hopper反编译:

让xxtea_key自己说出来_其他_07

 

 同一个二进制反编译出的结果不一样。

=======================================

打破砂锅问到底之后, 我真正理解了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));

让xxtea_key自己说出来_其他_08

 

 

0x0050f3d8是方法地址。

输出结果:58 e9 fa

故修改指令: 

让xxtea_key自己说出来_其他_09

 

 反汇编结果:

让xxtea_key自己说出来_其他_10

 

 应该调用__android_log_write@PLT 而不是__android_log_write。 

现在重新保存,打包apk. 运行在,android studio中看结果

让xxtea_key自己说出来_其他_11

 

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