安卓逆向 36 硬编码的定位

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

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); System.out.println("MainActivityonCreate 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("MainActivityonCreate 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("MainActivityonCreate 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。 搜索这个硬编码的值,可以找到对应如下内容:

    【安卓逆向 36 硬编码的定位】因为是string 类型,因此可以在strings.xml搜索 str_name 中找到。

    推荐阅读