[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/