注意:本教程只用于学习交流 请勿利用其行不法之事 分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。

app名字:联不通
加固:梆梆企业版

工欲善其事必先利其器
工具:
Sunny(抓包)
jadx-gui (反编译)
Jeb (反编译)
IDA (反编译)
unidbg (so模拟引擎)
frida (hook)

抓包

2.png

1.png

可以看见 请求数据和返回数据均已加密

脱壳后定位到以下位置
经过分析得知 调用 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 调用
报错
3.png

补环境 再次运行
报错
4.png

继续补
5.png

接着补
6.png
ok 出结果了 继续看解密
7.png

补环境
8.png

插播一条广告 专治各种不服yzm 注册连接:点我直达

11.png

继续补
9.png

继续补
10.png
ok 出结果了

算法还原

可以用unidbg 还原 或者DFA攻击 获取最终秘钥 以后有时间在研究吧

学习交流【qq 1158184029】

最后修改:2024 年 07 月 16 日
如果觉得我的文章对你有用,请随意赞赏