注意:本教程只用于学习交流 请勿利用其行不法之事 分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。
app名字:联不通
加固:梆梆企业版
工欲善其事必先利其器
工具:
Sunny(抓包)
jadx-gui (反编译)
Jeb (反编译)
IDA (反编译)
unidbg (so模拟引擎)
frida (hook)
抓包
可以看见 请求数据和返回数据均已加密
脱壳后定位到以下位置
经过分析得知 调用 s4 = JMEncryptBoxByRandom.encryptToBase64(s3, 2); 返回加密结果
该so是ijiami的一款sdk 从名字看应该是白盒aes算法
unidbg模拟执行
搭台子 代码
zglt(){
emulator = AndroidEmulatorBuilder.for64Bit().setProcessName("com.sinovatech.unicom.ui").build(); // 创建模拟器实例
final Memory memory = emulator.getMemory(); // 模拟器的内存操作接口
memory.setLibraryResolver(new AndroidResolver(23)); // 设置系统类库解析
try {
vm = emulator.createDalvikVM(TempFileUtils.getTempFile("/zglt/base.apk")); // 创建Android虚拟机
} catch (IOException e) {
throw new RuntimeException(e);
}
vm.setJni(this);
vm.setVerbose(true); // 设置是否打印Jni调用细节
DalvikModule dm = null;
try {
dm = vm.loadLibrary(TempFileUtils.getTempFile("/zglt/libJMEncryptBox.so"), true);
} catch (IOException e) {
throw new RuntimeException(e);
}
dm.callJNI_OnLoad(emulator);
frida hook 明文
{"orderCache":"{\"commonActivityState\":\"1\",\"commonId\":\"xxxxx\",\"eleActivityState\":\"0\",\"eleAmount\":\"0\"}","toolExpand":"{\"toolActivityId\":\"\",\"toolActivityState\":\"0\",\"toolCode\":\"ZL\",\"toolId\":\"ZL\"}","fromToolExpand":"{\"toolActivityId\":\"\",\"toolActivityState\":\"0\",\"toolCode\":\"ZFB\",\"toolId\":\"ZFB\"}","tradeOrderNo":"xxxxxxx","commReqHeader":{"commonReqExtendStr":"xxxxx","trace_id":"xxxxxx","tokenId":"","payUid":"xxxxxx","appVer":"11.0601","iMei":"","channel":"225","rptId":"","userTokenId":"xxxxxx","did":"xxxxx","mac":"02:00:00:00:00:00"}}
unidbg 调用
报错
补环境 再次运行
报错
继续补
接着补
ok 出结果了 继续看解密
补环境
插播一条广告 专治各种不服yzm 注册连接:点我直达
继续补
继续补
ok 出结果了
算法还原
可以用unidbg 还原 或者DFA攻击 获取最终秘钥 以后有时间在研究吧