使用dex2jar将apk里的dex反编译为jar之后,然后使用jd-gui阅读反编译后的代码是逆向apk的常规操作。

但在jar包里的java代码中,字符串资源都是以ID的形式存在的,如:

this.c.getString(2131034120)

分析这些ID对应的到底是什么字符串,对于我们快速了解这个程序很有帮助。

找到ID对应的字符串要分两步进行:

  1. 找到ID对应的资源名
  2. 找到资源名对应的字符串

根据ID找资源名

根据jar包中是否包含R.class类,这个过程分为两类。

包含R.class

如果用jd-gui打开jar包后,在左边的类列表中能看到R.class类。

那么我们直接在R.class中就可以找到ID与资源名的对应,形如:

public static final class string {
    public static final int app_name = 2131034112;
    public static final int hint_sn = 2131034113;
    public static final int hint_username = 2131034114;
    public static final int info = 2131034115;
    public static final int menu_settings = 2131034116;
    public static final int register = 2131034117;
    public static final int registered = 2131034118;
    public static final int sn = 2131034119;
    public static final int successed = 2131034120;
    public static final int title_activity_main = 2131034121;
    public static final int unregister = 2131034122;
    public static final int unsuccessed = 2131034123;
    public static final int username = 2131034124;
  }

也就能根据ID找到对应的资源名。

不包含R.class

如果用jd-gui打开jar包后,在左边的类列表中没有找到R.class类。

那么我们就要去XML文件中找ID和资源名的对应关系了。

要阅读XML文件,直接将apk后缀名改为zip并解压是不行的。解压后虽然能得到XML文件,但XML文件的内容是二进制格式的,不适合直接阅读。

我们需要使用apktool对apk进行反编译,命令如下:

apktool.bat d apk路径

反编译之后,会生成一个目录,目录名和apk名相同。这个目录里的XML就都是可理解的了。

此时我们来到反编译后的\res\values目录,找到public.xml文件,在这个文件里就可以找到ID和资源名的对应关系了,形如:

<public type="string" name="abc_font_family_title_material" id="0x7f060020" />
<public type="string" name="app_name" id="0x7f060021" />
<public type="string" name="no" id="0x7f060022" />
<public type="string" name="two_fish" id="0x7f060023" />
<public type="string" name="what_else" id="0x7f060024" />
<public type="string" name="yes" id="0x7f060025" />
<public type="dimen" name="abc_alert_dialog_button_bar_height" id="0x7f070000" />

这种方法更为普遍,就算jar包里由R.class也可以使用这种方法。

根据资源名找字符串

资源名对应的字符串需要在XML文件中找,所以需要对XML文件进行解码。

与上面一样,使用apktool对apk进行反编译:

apktool.bat d apk路径

然后,我们还是来到反编译后的\res\values目录下,这次是找strings.xml文件,在这里面就能找到资源名对应的字符串了,形如:

<string name="app_name">FindMyDex</string>
<string name="no">"NO~ You don't get me~ T_T"</string>
<string name="two_fish">I have a male fish and a female fish.</string>
<string name="what_else">What else?</string>
<string name="yes">Yes! You got me! :)</string>