app so newSign 参数分析破解

android 逆向 21 / 38

仅供学习研究 。请勿用于非法用途,本人将不承担任何法律责任。

前言

某物 newSign 参数分析

charles 抓包

就是这个 newSign, 一个 hash

反编译分析

全局搜索一下,

打开 jeb 搜索一下这个类,jeb 分析比较方便一点,进入 RequestUtils.c 函数

这里调用了 RequestUtils.f, AESEncrypt.encode 函数

RequestUtils.f 函数是标准的 md5

AESEncrypt.encode 函数调用了 NCall.IL 函数

NCall.IL 函数是在 GameVMP, so 里,实际上真正的加密逻辑是在 libJNIEncrypt.so 文件里,也就是上上图的 encodeByte 函数,俺也没搞懂里面的逻辑是啥,本想分析下 GameVMP.so 的,但是奈何里面对抗 ida 手段有点多,没搞定就直接放弃了(哪位老哥了解的,还望不杏赐教)

so 分析

分析下 libJNIEncrypt.so

在导出窗口里可以看到函数也不多,其中就有 aes 函数,符号都没去,加密方式是 aes-128-ebc-pkcs#5,因为 so 的对抗不好处理,就是用 frida hook 看看,输入输出

frida hook

function hook() {
    var javaString = Java.use('java.lang.String');
    var AESEncrypt = Java.use('com.duapp.aesjni.AESEncrypt');

    AESEncrypt.encode.overload('java.lang.String').implementation = function (a) {
        console.log('AESEncrypt.encode.a: ', a);

        var res = this.encode(a);

        console.log('AESEncrypt.encode.res: ', res);

        return res;
    }

    AESEncrypt.encodeByte.implementation = function (a, b) {
        console.log('AESEncrypt.encodeByte.a: ', a);
        console.log('AESEncrypt.encodeByte.a: ', javaString.$new(a));
        console.log('AESEncrypt.encodeByte.b: ', b);

        var res = this.encodeByte(a, b);
        console.log('AESEncrypt.encodeByte.res: ', res);

        return res;
    }
}

function hookSo1() {
    var AESBase = Module.findExportByName('libJNIEncrypt.so', 'AES_128_ECB_PKCS5Padding_Encrypt')

    Interceptor.attach(AESBase, {
        onEnter: function (args) {
            console.log('-------------参数 1-------------');
            console.log(hexdump(args[0]));
            console.log('-------------参数 2-------------');
            console.log(hexdump(args[1]));
        },
        onLeave: function (retValue) {
            console.log('-------------返回-------------');
            console.log(hexdump(retValue));
        }
    })
}

function main() {
    Java.perform(function () {
        hook();
        hookSo1();
    })
}

setImmediate(main);

// frida -UF -l hook.js

以上是 hook 代码,手机开启抓包,启动 hook 脚本,随便点点

AESEncrypt.encodeByte 函数的参数一,是请求的 params,参数二目前不知道是啥

返回值是 aes 的加密结果,前面 java 层分析到,最后还有个 md5 验证一下

上面分别是 charles 抓的包,跟 cyberchef 运算的结果相同,那就确定了标准的 md5

再来看看 libJNIEncrypt.so -> AES_128_ECB_PKCS5Padding_Encrypt 函数,参数一是 url params,参数二长度是 16 个字节,猜测是 aes-key

返回的结果正是 aes 加密的结果,使用 cyberchef 验证一下

正是标准的 aes 解密结果也是相同的

最后

分析结束,本想着拿这个 app 来练练 ida 动态调试的,没想遇到了很多对抗 ida 的手段,甚是烦恼啊,哪位大佬有这方面的经验,希望可以留言,在下愿意付费请教

6 条评论
本文作者:
本文链接: https://www.qinless.com/?p=745
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 qinless 的博客!
100

6 条评论

白白嫩嫩

大佬 那个so为什么不是GameVMP 现在知道了吗

回复

会爬山的小脑虎

@白白嫩嫩 没研究了,

回复

嗄嗄

charles抓不到包,python执行报400 😭

回复

会爬山的小脑虎

@嗄嗄 抓包你可以装个 xposed 插件,屏蔽 ssl,python 400 应该是参数问题

回复

疯子

分析的真不错, 跟着大佬学知识

回复

发表评论

返回顶部