使用dex2jar将apk里的dex反编译为jar之后,然后使用jd-gui阅读反编译后的代码是逆向apk的常规操作。
但在jar包里的java代码中,字符串资源都是以ID的形式存在的,如:
this.c.getString(2131034120)
分析这些ID对应的到底是什么字符串,对于我们快速了解这个程序很有帮助。
找到ID对应的字符串要分两步进行:
- 找到ID对应的资源名
- 找到资源名对应的字符串
根据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>