Android Apk反编译这里一站解决

反编译apk这里一站解决所有问题

  • 传统反编译Android的三件套
    • apk_tool
    • dex2_jar
    • jd-gui
  • dex2java转换报错
  • jd-gui反解class或者jar的时候出现问题
  • 反编译后id全都是数值了怎么办
  • 反编译后如何进行全局搜索
    • 使用Android studio
    • 使用jd-GUI
    • 使用jd-GUI生成源码
    • 使用fernflower封装的框架生成源码
  • 总结

传统反编译Android的三件套

我们常规进行反编译,一般要用到3个工具,大多数博客放的资源都是比较久的版本,使用旧的版本工具可能会遇到很多问题,比如,旧的jd-gui有可能会导致一些字节码反编译不出来。旧的dex2jar会在转换.dex文件的时候出错,等类似问题,都可以通过更新到最新版本来解决。我这里直接贴上三个工具的官方链接,遇到问题的同学先尝试把所有软件工具版本都更新到最新的。避免多走很多弯路。

apk_tool

下载链接:
https://ibotpeaches.github.io/Apktool/
功能:
将apk拆解开,如果通过直接解压apk的方式,AndroidManifest.xml,values,等一些文件会乱码无法正常查看。
使用方式:

java -jar apk_tool.x.x d demo.apk -o 目标位置

dex2_jar

下载链接:
https://sourceforge.net/projects/dex2jar/
功能:
将dex文件转换为jar包
使用方式:

// 1.进入dex2jar目录下
// 2.执行
d2j-dex2jar.bat classes.dex
// 3.默认将jar包输出到当前目录下,默认名称classes-dex2jar.jar

jd-gui

下载链接:
https://jd-gui.apponic.com/
功能:
将jar或者class反解为可供我们阅读的代码
使用方式:
打开后直接将jar包拖入编辑区,或者选择file->open文件查看。

dex2java转换报错

使用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
  • 编译完成
    编译完成后的程序将输出到dex-tool\build\distributions目录下,解压即可使用。

jd-gui反解class或者jar的时候出现问题

很可能在反编译一些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

如图:
Android Apk反编译这里一站解决_第1张图片
原因是jd-gui版本过久,会出现这个问题,从前面的链接下载最新版本的jd-gui就可以解决。

如果还是有部分代码存在这个问题,可以尝试尝试利用AndroidStudio自带的反编译器进行反编Jar包,内部FernFlower来实现的反编译工作,相对来讲,反编译的能力更加强大。但是可读性不是很高,各有利弊吧。但是对于在jd-GUI上连反编译都反编译不出来的部分代码,只能用这种方式了。起码能反编译出来出代码了,可读性差就是慢慢啃呗。

  1. 使用as新建一个demo

  2. 将刚刚使用dex2jar转换完成的jar包放入libs目录
    Android Apk反编译这里一站解决_第2张图片

  3. 右键刚刚复制进来的jar包,选择Add As Library
    Android Apk反编译这里一站解决_第3张图片
    完成以上操作就开一点开jar查看代码了。

反编译后id全都是数值了怎么办

因为系统在编译后,会将说有的资源文件都转为数值类型。建立喝文件的索引。我们反编译后看到的结果就成了数值。
如下:

      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进制,再进行查找即可。

反编译后如何进行全局搜索

有的小伙伴可能会有对反编译后的文本全局搜索的需求。

使用Android studio

因为class只是根据jar包动态生成的在Android studio并没有建立索引以及拥有全局搜索的功能。官方解释是因为建立索引的过程对性能消耗过大。所以就没这个功能。

使用jd-GUI

在jd-gui中倒是有对反编译的源码进行全局搜索这个功能,并且也建立了索引,ctrl+shift+s就可以调出全局搜索框。但我整了半天愣是没整明白怎么开始搜索。有整明白的小伙伴可以留言告诉我一下。
Android Apk反编译这里一站解决_第4张图片

我只好转换策略,我们就把class导出为java源码用grep进行全文搜索吧。

使用jd-GUI生成源码

  1. 点击窗口菜单ctrl+alt+s将整个jar转为源码压缩包然后保存到本地。(ctrl+s可以只将当前浏览的class转为java源文件保存到本地)
  2. 等待进度条走完,找到.zip包解压即可。
    Android Apk反编译这里一站解决_第5张图片

使用fernflower封装的框架生成源码

  1. 执行命令
    java -cp “参数一” org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true 参数二 参数三
    参数一 D:\Program Files\Android\Android Studio\plugins\java-decompiler\lib\java-decompiler.jar
    默认我们的Android studio 的安装目录下有个plugins文件夹,这里面是安装的有史以来你对Android studio安装的插件。我们进入这个文件夹找到一个名为java-decompiler的文件夹。进入这个文件夹下面的lib文件夹会看到一个文件。上面这个地址就是这个文件的全路径。
    参数二 D:\Desktop\temp\android-fby\newd2j\dex-tools-2.1-SNAPSHOT\duo- dex2jar.jar
    这个是要解析的jar包路径
    参数三 .
    这个是你解析完输出的位置 .就是当前所在目录。

例如:

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 .
  1. 等待结果
    接下来就是等待执行结束了,执行过程中如果jar包很大或者比较复杂的话,有可能会卡住很久不动,但是这种情况是没有问题的,耐心的等就行了。我就等了3个小时才差不多全都解析执行完。执行完会在一个指定的输出目录有一个.jar后缀的文件,直接解压,里面包含的是.java后缀的源文件。

总结

看来逆向是一个需要掌握知识比较杂的技能,每个工具都有自己的长处和短处,跟人一样,各有所长,各有所短,要互相结合着互补的用,才能实现我们想要的目的。我会不断更新本篇博客。来分享反编译过程中遇到的各种问题。

还遇到什么问题欢迎留言。我们一起探讨。
欢迎加入技术qq群:571606384

你可能感兴趣的:(反编译,android,反编译)