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

谢谢!

#1 楼

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

res/values中,您可以使用public.xml中的名称(或类似名称,例如publics.xml或name.xml)找到ID。就是这样。

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

评论


为什么有人给我-1?在res / values中,有很多xml。只需打开它们,您将找到所有ID。

–迷雾笼罩
16 May 25'3:59



谢谢。除了JEB,是否还有其他工具(最好是免费的)可以通过映射提取此xml文件?

–user1118764
16年5月25日在6:35

@ user1118764我已经说过apktool也可以做到这一点。

–迷雾笼罩
16年5月25日在8:02



我已经使用apktool来获取资源,但是我只看到提供字符串名称和值的XML文件,而不是字符串名称与资源ID之间的映射。

–user1118764
16年5月25日在8:36

@ user1118764那里有很多XML文件,只需打开它们即可。您可以使用计算器将ID转换为HEX,然后在这些文件中进行搜索。

–迷雾笼罩
16年5月25日在8:39

#2 楼

关云超的答案是正确的。例如,我最近解压缩了一个应用程序(zaka.com.amperemeter-1.apk,是的,它是zaka.com,不是应该的com.zaka)。改善Google翻译所造成的不良德语翻译。 br />
unzip/procyon/gluapps/Ampere/meter/Activity/MainActivity.java:240
    return this.getString(2131099670)


还,procyon给了我一个R.java,它的名字就是这个数字:
从反编译中获取R.java源代码。如果没有,apktool d zaka.com.amperemeter-1.apk会在smali文件中为您提供几个具有相同编号的文件,以十六进制表示:

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


这些基本上与反编译的Java文件。此外:

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


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

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


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