免责声明:本篇文章仅用来学习交流,请勿用于商业用途,如因违反规定产生任何法律纠纷,本人概不负责。假如本文影响到官方任何利益,请联系文章底部作者微信告知,本人会在第一时间将文章删除,感谢~


# 记录下某 j光新闻apk 的逆向,技术点包括 root 检测,脱壳及静态分析, so 层加密分析。

  1. # 抓包查看接口

    • 打开 app 发现有 root 检测,可以使用 frida 调用过 root 的脚本,这里我用 objection 提供的指令过 root 检测,方便快捷。

    • 使用 objection 如下指令在启动阶段 hookroot 检测,然后抓包分析接口

      objection -g appname explore --startup-command "android root disable"

    • 经过查看几个接口分析应该是 signaccount 参数,抓包分析不细说了,网上可以百度教程

  2. # 接下来就可以拿着参数去静态分析

    • 美滋滋打开 jadx ,发现有加固,看文件名是 360 的壳

    • 用葫芦娃大佬的 frida_dexdump 直接脱,之前文章有讲

    • 脱完用 jadx 打开,可以直接搜到 root 的弹窗位置

      这里还有个坑,高版本有不知名的 bugV1.3.3 打开报错, V1.3.2 打开不能搜索, V1.2.0V1.3.0 可以打开,新版本纵然有新鲜功能,但还是老版本稳定,可以少掉好多头发。。。

    • 搜了下 signaccount ,最后定位到下面函数位置

    • 然后继续追进函数看,这里用 bnew 了一个 a 对象,然后用调用了 a 对象的 a 函数

    • 跟进 b 类,发现下面的两个函数都是空的,难道没壳脱干净? 其实这里是 interface 抽象类,一般是在其他地方继承此类,可以理解为重载。

    • 我直接搜了一下类名 e.b.b.a.a.b , 发现有两个重载,追进去看到函数名,就能大概确定就是我们要找的函数,而且是个 native 函数, so 文件是 wtf

  3. # 使用 IDA 分析 so 层逻辑

    • apk 包里拿出 libwtf.so ,用 ida 打开,直接确定 -> 确定 -> 确定。。。到下图的界面

    • 点击右上角的 Exports , 查看是否有我们需要的导出函数,搜索 java ,刚好就是 java 层看到的两个函数 getSigngetFinalDeviceId .

    • 双击 getsign 函数,进入汇编代码界面然后一顿骚操作 >> F5 >> Hide casts >> 替换JNIEnv ; 就可以看到下图的伪 C 代码,逻辑很清晰

  4. # 逻辑理清之后,直接上 frida hook 最后一次 md5 加密的函数, so 层加密根据偏移地址进行 hook ,参考之前 frida 教程

    console.log("so start:")
    var address = Module.findBaseAddress("libwtf.so").add(0x1690+1);
    console.log("func address:", address)
    Interceptor.attach(address, {
        onEnter: function (args) {
            console.log("params1", Memory.readCString(args[0]));
        },
        onLeave: function (retval) {
            console.log("here???", retval)
        }
    })

  5. # 分析到这里已经结束了,有经验的师傅一眼就看出来 account 其实就是随机的 UUID ,去 java 代码验证无误。

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

渣渣文 微信支付

微信支付

渣渣文 支付宝

支付宝