public class MainActivity extends AppCompatActivity {
Button bn ;
EditText show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_2);
show = (EditText)findViewById(R.id.show);
bn = (Button)findViewById(R.id.bn);
bn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show.setText("bn 按钮被点击了!!!");
}
});
}
}
第一步:
确定findViewById()这个方法的是哪个类的;由于这些组件当app一打开就被加载好了;我们要找到那个类,可以在terminal里面输入命令Java.enumerateLoadedClassesSync()枚举所有已加载的类
;以—no-pause注入才行;
找到对应的类之后;就应该寻找组件id;这个例子中的登陆按钮id为“btn_login”
//访问内部类的属性
var btn_login_id = Java.use("com.dodonew.online.R$id").btn_login.value;//获取组件id
ps:在练习这个注入时,以—no-pause
方式
[Redmi 6A::platexx.boxxoota]-> Process crashed: Illegal instruction
解决方法:
function main() {
Java.perform(function () {
console.log("--------------start hooking--------------");
function showStack() {
var log = Java.use("android.util.Log");
var Throwable = Java.use("java.lang.Throwable");
console.log(log.getStackTraceString(Throwable.$new()))
}
var btn_login_id = Java.use("com.dodonew.online.R$id").btn_login.value;
console.log("btn_login_id", btn_login_id);
var appCompatActivity = Java.use("android.support.v7.app.AppCompatActivity");
appCompatActivity.findViewById.implementation = function (a) {
if(a == btn_login_id){
showStack();
console.log("appCompatActivity.findViewById: ", a);
}
return this.findViewById(a);
}
})
}
setTimeout(main, 1000);