[frida]注入/rpc模块

背景

注入:用于调试,找接口。

rpc:向程序提供接口。

注入

Java.perform(function () {
    var EncryptNativeUtils = Java.use('com.***.***.EncryptNativeUtils');
    var JString = Java.use('java.lang.String');
    // 这里的[B 表示byte][]
    EncryptNativeUtils.encodeByHmac.overload("int", "[B").implementation = function (v1, v2) {
        var result = this.encodeByHmac(v1, v2);
        // 将byte[]转化成字符串
        var sign = JString.$new(Java.array('byte', result));
        return result;
    }

    EncryptNativeUtils.parseNovel.overload("[B", "java.lang.String").implementation = function (v1, v2) {
        var result = this.parseNovel(v1, v2);
        var content = JString.$new(Java.array('byte', result));
        console.log(JString.$new(Java.array('byte', v1)));
        console.log(v2)
        return result;
    };

    var aos = Java.use('e.a0.s');
    aos.J.overload("java.lang.String", "java.lang.String").implementation = function (v1, v2) {
        var result = this.J(v1, v2);
        if (v1 == 'USER_TOKEN') {
            console.log(result);
        }
        return result;
    };
});

rpc

写这个模块的时候还有点小插曲,我发现驼峰命名在frida中会不生效,一直提示方法不存在,后来改成全小写就正常了;下划线命名也会找不到方法。

rpc主要是向python提供接口,等注入调试完后就可以根据注入结果去写接口了,有了接口就能跑脚本。

rpc.exports = {
    decryptchapter(amd5, encode) {
        var content = '';
        Java.perform(function () {
            var EncryptNativeUtils = Java.use('com.***.***.EncryptNativeUtils');
            var JString = Java.use('java.lang.String');
            var base64 = Java.use('android.util.Base64');
            var a5 = base64.decode(amd5, 0);

            var decode = EncryptNativeUtils.parseNovel(a5, encode);
            // 需要注意parseNovel返回的是byte[]类型,引用传递过程中会报错,使用toString()等方法进行深拷贝传值
            content = JString.$new(Java.array('byte', decode)).toString();
        });
        return content;
    }
}

[frida]注入/rpc模块
http://blog.icy8.cn/posts/6981/
作者
icy8
发布于
2021年9月4日
许可协议