如果我们用传统
findViewById这个组件去获取怎么获取呢?
解答:
然后ctrl+点击进去找到系统文件,就可以看到它是属于
他是属于
package androidx.appcompat.app;底下的
AppCompatActivity类文件的。
于是我们hook代码就这样写
Java.perform(function (){
function showstack(){
var log=Java.use("android.util.Log");
var throwable = Java.use("java.lang.Throwable");
var stackTraceString = log.getStackTraceString(throwable.$new());
console.log(stackTraceString);
}
var appCompatActivity= Java.use("androidx.appcompat.app.AppCompatActivity");
appCompatActivity.findViewById.overload().implementation= function (a){
// showstack();
//这里a是字节数字,所以要用JSON.stringify(a)来打印
console.log("控件id:",a)
var result=this.findViewById(a);
// console.log("xxxx",result);
return result;
}
});
直接用frida -UF -l kongjianHook.js -o log.txt去执行,但是出现问题就是
控件是在文件前就执行了的,所以会报错
解决方案就是枚举法 Java.enumerateClassLoadersSync()直接输入这个神奇代码
但是 有可能不会跳出提示或者报错,只要重启一下手机或者电脑重新来一下就 可以了
这个是不对的,敲错了,已加载过的类
Java.enumerateLoadedClassesSync
所以就要把这里进行替换android.support.v7.app.AppCompatActivity
当然启动也要不一样了
frida -Uf com.dodonew.online -l kongjianHook.js -o log.txt
这里f是启动包名,
刚启动 的时候时候要 改成
frida -Uf com.dodonew.online -l kongjianHook.js -o log.txt --no-pause
可是我手机系统问题,我这里只要直接输入
frida -Uf com.dodonew.online -l kongjianHook.js -o log.txt来 启动就可以了
不需要后面加--no-pasue,这个意思启动后进行停留然后启动脚本
通过adb里面Automator Viewer
然后得到控件id
去jadx查找控件id是多少,根据id找到相应东西
代码再进行改写成
Java.perform(function (){
function showstack(){
var log=Java.use("android.util.Log");
var throwable = Java.use("java.lang.Throwable");
var stackTraceString = log.getStackTraceString(throwable.$new());
console.log(stackTraceString);
}
var btn_login_id = Java.use("com.dodonew.online.R$id").btn_login.vaule;
console.log("控件id",btn_login_id);
var appCompatActivity= Java.use("android.support.v7.app.AppCompatActivity");
appCompatActivity.findViewById.implementation= function (a){
if(a==btn_login_id){
showstack();
//这里a是字节数字,所以要用JSON.stringify(a)来打印
console.log("控件id:",a)
var result=this.findViewById(a);
}
// console.log("xxxx",result);
return result;
}
});