image.png

    1. public class MainActivity extends AppCompatActivity {
    2. Button bn ;
    3. EditText show;
    4. @Override
    5. protected void onCreate(Bundle savedInstanceState) {
    6. super.onCreate(savedInstanceState);
    7. setContentView(R.layout.layout_2);
    8. show = (EditText)findViewById(R.id.show);
    9. bn = (Button)findViewById(R.id.bn);
    10. bn.setOnClickListener(new View.OnClickListener() {
    11. @Override
    12. public void onClick(View v) {
    13. show.setText("bn 按钮被点击了!!!");
    14. }
    15. });
    16. }
    17. }

    第一步:
    确定findViewById()这个方法的是哪个类的;由于这些组件当app一打开就被加载好了;我们要找到那个类,可以在terminal里面输入命令Java.enumerateLoadedClassesSync()枚举所有已加载的类 ;以—no-pause注入才行;
    image.png

    找到对应的类之后;就应该寻找组件id;这个例子中的登陆按钮id为“btn_login”
    image.png

    1. //访问内部类的属性
    2. var btn_login_id = Java.use("com.dodonew.online.R$id").btn_login.value;//获取组件id

    image.png

    ps:在练习这个注入时,以—no-pause 方式
    image.png
    [Redmi 6A::platexx.boxxoota]-> Process crashed: Illegal instruction

    解决方法:
    image.png

    1. function main() {
    2. Java.perform(function () {
    3. console.log("--------------start hooking--------------");
    4. function showStack() {
    5. var log = Java.use("android.util.Log");
    6. var Throwable = Java.use("java.lang.Throwable");
    7. console.log(log.getStackTraceString(Throwable.$new()))
    8. }
    9. var btn_login_id = Java.use("com.dodonew.online.R$id").btn_login.value;
    10. console.log("btn_login_id", btn_login_id);
    11. var appCompatActivity = Java.use("android.support.v7.app.AppCompatActivity");
    12. appCompatActivity.findViewById.implementation = function (a) {
    13. if(a == btn_login_id){
    14. showStack();
    15. console.log("appCompatActivity.findViewById: ", a);
    16. }
    17. return this.findViewById(a);
    18. }
    19. })
    20. }
    21. setTimeout(main, 1000);