将 Android 资源 ID 映射到资源字符串

逆向工程 反编译 安卓 静态分析 爪哇
2021-06-27 02:29:03

我正在尝试对 Android 应用程序进行逆向工程。我试过使用几个反编译器,虽然我得到的 java 源代码的准确度不同,但我无法将资源 ID 转换为资源字符串。在 Java 源代码中,我得到的只是 32 位资源 ID,这对我来说毫无意义。有没有办法从这个资源 ID 中获取资源字符串?我在任何反编译代码中都​​没有找到任何 R.java。

谢谢!

2个回答

使用apktool您可以反编译程序的资源。您也可以使用 JEB 查看资源 ID。

在 中res/values,您可以使用 public.xml(或类似的东西,例如 publics.xml 或 name.xml)中的名称找到 id。而已。

PS:在搜索之前,您需要将 32 位资源 ID 转换为 HEX。

关云超的回答是正确的。

例如,我最近解压了一个应用程序(zaka.com.amperemeter-1.apk,是的,它是 zaka.com,而不是 com.zaka,因为它应该是)以改进由 google translate 完成的糟糕的德语翻译。

解压缩 .apk,在 .dex 上使用 dex2jar,在生成的 jar 上使用 procyon,例如:

unzip/procyon/gluapps/Ampere/meter/Activity/MainActivity.java:240
    return this.getString(2131099670)

另外,procyon 给了我一个 R.java,它有这个数字的名字:

unzip/procyon/gluapps/Ampere/meter/R.java:909
    public static final int Usb_plug_type = 2131099670;

所以你真的应该从反编译中得到一个 R.java 源代码。如果你不这样做,apktool d zaka.com.amperemeter-1.apk给你几个具有相同数字的文件,以十六进制表示,在 smali 文件中:

work/smali/gluapps/Ampere/meter/R$string.smali:20
   .field public static final Usb_plug_type:I = 0x7f060016
work/smali/gluapps/Ampere/meter/Activity/MainActivity.smali:477
    const v1, 0x7f060016

这些与反编译的java文件基本相同。此外:

work/res/values/public.xml:473
    <public type="string" name="Usb_plug_type" id="0x7f060016" />

这是映射到语言相关文件中实际翻译的字符串的键:

work/res/values-de/strings.xml:25
    <string name="Usb_plug_type">USB</string>

因此,对于普通的 apk,如果您正确使用 unzip/dex2jar/decompiler/apktool,一切都应该在那里。如果没有,最好提供指向该 apk 的链接,因为您的链接可能会发生一些奇怪的事情,但除非您给我们机会查看您的特定 apk,否则无法确定。