安卓逆向 36 硬编码的定位

1. TextView

控件id -> 在代码中方便的获取控件
控件内容、控件大小(常用单位dp)、字体、字体颜色、字号(常用单位sp)

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        System.out.println("MainActivity  onCreate 333");
        System.out.println(MyApplication.mInfoMap.get("name"));

        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
        // R 文件在当前不存在  编译后产生
        setContentView(R.layout.activity_main);
        // R.id.sample_text  对应app->main->res-> layout->activity_main.xml中TextView的id
        TextView tv  = findViewById(R.id.sample_text);
        tv.setText("hengdi");

        // Example of a call to a native method
//        TextView tv = binding.sampleText;
//        tv.setText(stringFromJNI());
    }

2. strings.xml

Hello World!
在开发中,一般字符串会写在app->main->res-> values ->strings.xml 这个文件中,然后代码中引用文件中的字符串

应用:

  • strings.xml

    
      Hookdemo
      welcome hengdi
      Hello
    

    在activity_main.xml 的 android:text 中调用

    在MainActivity.java中直接调用strings.xml 中的str_name

      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          System.out.println("MainActivity  onCreate 333");
          System.out.println(MyApplication.mInfoMap.get("name"));
    
          binding = ActivityMainBinding.inflate(getLayoutInflater());
          setContentView(binding.getRoot());
          // R 文件在当前不存在  编译后产生
          setContentView(R.layout.activity_main);
          //
          TextView tv  = findViewById(R.id.sample_text);
          tv.setText(R.string.str_name);
    
    //        setContentView(R.layout.activity_main);
    //
    //        TextView tv  = findViewById(R.id.sample_text);
    //        tv.setText(.str_name);
    
          //tv.setText(R.layout.);
    
          // Example of a call to a native method
    //        TextView tv = binding.sampleText;
    //        tv.setText(stringFromJNI());
      }

    此时运行,打开jadx。反编译刚刚的apk。

  • 在路径:
    资源文件-> res-> layout -> activity_main.xml 中可以看到android:text="@string/Hello" 。 是和我们源代码一样的。
  • 在 resources.arsc -> res -> values -> strings.xml 中可以找到和我们源码strings.xml 中一致的几个值。
  • 在 MainActivity.java中,

    public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          System.out.println("MainActivity  onCreate 333");
          System.out.println(MyApplication.mInfoMap.get("name"));
          ActivityMainBinding inflate = ActivityMainBinding.inflate(getLayoutInflater());
          this.binding = inflate;
          setContentView(inflate.getRoot());
          setContentView(R.layout.activity_main);
          ((TextView) findViewById(R.id.sample_text)).setText(R.string.str_name);
      }
    
    
    
    按住ctrl,点击R.string.str_name,跳转后,如下,这个情况下,我们无法知道str_name的实际值是什么。这种为硬编码
    
    public static final int str_name = 2131624037;
    
  • 在jeb中,setText(0x7FE80104)的值直接就是一个硬编码,打开resouces -> values ->public.xml。 搜索这个硬编码的值,可以找到对应如下内容:

    因为是string 类型,因此可以在strings.xml搜索 str_name 中找到。

你可能感兴趣的:(android)