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