我们常规进行反编译,一般要用到3个工具,大多数博客放的资源都是比较久的版本,使用旧的版本工具可能会遇到很多问题,比如,旧的jd-gui有可能会导致一些字节码反编译不出来。旧的dex2jar会在转换.dex文件的时候出错,等类似问题,都可以通过更新到最新版本来解决。我这里直接贴上三个工具的官方链接,遇到问题的同学先尝试把所有软件工具版本都更新到最新的。避免多走很多弯路。
下载链接:
https://ibotpeaches.github.io/Apktool/
功能:
将apk拆解开,如果通过直接解压apk的方式,AndroidManifest.xml,values,等一些文件会乱码无法正常查看。
使用方式:
java -jar apk_tool.x.x d demo.apk -o 目标位置
下载链接:
https://sourceforge.net/projects/dex2jar/
功能:
将dex文件转换为jar包
使用方式:
// 1.进入dex2jar目录下
// 2.执行
d2j-dex2jar.bat classes.dex
// 3.默认将jar包输出到当前目录下,默认名称classes-dex2jar.jar
下载链接:
https://jd-gui.apponic.com/
功能:
将jar或者class反解为可供我们阅读的代码
使用方式:
打开后直接将jar包拖入编辑区,或者选择file->open文件查看。
使用2.0版本的dex2jar转换dex包的时候可能会报错
d2j-dex2jar.bat classes.dex
dex2jar classes.dex -> .\classes-dex2jar.jar
Detail Error Information in File .\classes-error.zip
Please report this file to http://code.google.com/p/dex2jar/issues/entry if possible.
这种情况直接去github下载最新代码库,并使用gradle编译出最新版本。即可解决这个问题。
github链接: https://github.com/pxb1988/dex2jar
gradlew.bat assemble
很可能在反编译一些jar和dex的时候会遇到反编译出的部分方法体全部都是注释状态的字节码的问题。
// Byte code:
// 0: aload_0
// 1: getfield 48 com/android/dialer/main/impl/MainActivity:l Lgca;
// 4: ifnonnull +1502 -> 1506
// 7: aload_0
// 8: getfield 50 com/android/dialer/main/impl/MainActivity:n Z
// 11: ifeq +1484 -> 1495
// 14: aload_0
如图:
原因是jd-gui版本过久,会出现这个问题,从前面的链接下载最新版本的jd-gui就可以解决。
如果还是有部分代码存在这个问题,可以尝试尝试利用AndroidStudio自带的反编译器进行反编Jar包,内部FernFlower来实现的反编译工作,相对来讲,反编译的能力更加强大。但是可读性不是很高,各有利弊吧。但是对于在jd-GUI上连反编译都反编译不出来的部分代码,只能用这种方式了。起码能反编译出来出代码了,可读性差就是慢慢啃呗。
因为系统在编译后,会将说有的资源文件都转为数值类型。建立喝文件的索引。我们反编译后看到的结果就成了数值。
如下:
switch (i) {
default:
illegalArgumentException = new IllegalArgumentException();
this("Invalid theme.");
throw illegalArgumentException;
case 2:
gca2.b.setTheme(2132083127);
break;
case 1:
gca2.b.setTheme(2132083126);
break;
}
gca2.b.setContentView(2131624201);
我们可以通过apk_tools分解出的apk文件,找到res/values/public.xml文件,所有的映射关系全都在这个文件中展示。记得把数值转成16进制,再进行查找即可。
有的小伙伴可能会有对反编译后的文本全局搜索的需求。
因为class只是根据jar包动态生成的在Android studio并没有建立索引以及拥有全局搜索的功能。官方解释是因为建立索引的过程对性能消耗过大。所以就没这个功能。
在jd-gui中倒是有对反编译的源码进行全局搜索这个功能,并且也建立了索引,ctrl+shift+s就可以调出全局搜索框。但我整了半天愣是没整明白怎么开始搜索。有整明白的小伙伴可以留言告诉我一下。
我只好转换策略,我们就把class导出为java源码用grep进行全文搜索吧。
例如:
java -cp "D:\Program Files\Android\Android Studio\plugins\java-decompiler\lib\java-decompiler.jar" org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true D:\Desktop\temp\android-fby\newd2j\dex-tools-2.1-SNAPSHOT\duo- dex2jar.jar .
看来逆向是一个需要掌握知识比较杂的技能,每个工具都有自己的长处和短处,跟人一样,各有所长,各有所短,要互相结合着互补的用,才能实现我们想要的目的。我会不断更新本篇博客。来分享反编译过程中遇到的各种问题。
还遇到什么问题欢迎留言。我们一起探讨。
欢迎加入技术qq群:571606384