一、目标
之前我们介绍过 某酒店App sign、appcode签名解析(一) 带壳分析 r0tracer。
带壳分析也是迫不得已,谁不希望零距离接触呀。
App升级了 5.3.3,我们的工具也升级了。
今天的新朋友是 BlackDex
https://github.com/CodingGay/BlackDex
- 脱壳
- 延时Hook
二、步骤
BlackDex脱壳
- 安装BlackDex
- 在显示的进程列表中选择 com.platexx.boxxoota
- 是的,壳已经脱好了,脱壳后的文件在 /sdcard/Android/data/top.niunaijun.blackdexa32/dump/com.platexx.boxxoota
分析下
根据上次的分析结果,赶紧去到 com.besxxxhotel.app.whnetcomponent.utils.SignUtil 看看。
热泪盈眶呀,看到源代码的感觉真好。
啥也不说了,hook它。
var signCls = Java.use("com.besxxxhotel.app.whnetcomponent.utils.SignUtil");
console.log(TAG + "signCls: " + signCls);
signCls.getSignString.implementation = function(a1,a2,a3,a4,a5,a6){
var result = this.getSignString(a1,a2,a3,a4,a5,a6);
console.log(TAG + "a1 = " + a1);
console.log(TAG + "a2 = " + a2);
console.log(TAG + "a3 = " + a3);
console.log(TAG + "a4 = " + a4);
console.log(TAG + "a5 = " + a5);
console.log(TAG + "a6 = " + a5);
console.log(TAG + "sign rc = " + result);
return result;
}
signCls.getAppCode.implementation = function(a1,a2,a3,a4){
var result = this.getAppCode(a1,a2,a3,a4);
console.log(TAG + "a1 = " + a1);
console.log(TAG + "a2 = " + a2);
console.log(TAG + "a3 = " + a3);
console.log(TAG + "a4 = " + a4);
console.log(TAG + "AppCode rc = " + result);
return result;
}
signCls.decodeASCII.implementation = function(a){
var result = this.decodeASCII(a);
console.log(TAG + a.entrySet().toArray());
console.log(TAG + "decodeASCII: " +result);
return result;
}
挂上心爱的frida跑一下。
[Redmi 6A::platexx.boxxoota]-> Process crashed: Illegal instruction
怎么会挂呢,没道理呀,我们是好朋友呀。上一个版本都还愉快的玩耍过?
再试试老版本,一样crash
延时Hook
深呼吸,冷静一下。
. 老版本也Crash,说明不是新版本升级了防护策略
. spawn模式下会Crash,attach模式下正常
那就好办了,spawn模式下我们可以加个延时试试。
function main() {
Java.perform(function () {
var threadef = Java.use('java.lang.Thread');
var threadinstance = threadef.$new();
// ...... xxxHook code ......
});
}
setTimeout(main, 1000);
// setImmediate(main);
这次没问题了,
三、总结
分析脱壳软件的时候,可以考虑hook 壳代码里面的 attachBaseContext getApplicationContext 函数来找到hook真实代码的时机。
frida被搞的时候记得试试 XcubeBase
尼采说过,杀不死你的东西会让你变得更加强大,但他没说清楚的是,那东西差点杀死你。