Android 反编译神器jadx的使用

一、前言

今天介绍一个非常好用的反编译的工具 jadx 。jadx 的功能非常的强大,对我而言,基本上满足日常反编译需求。

jadx 优点:

  1. 图形化的界面。
  2. 拖拽式的操作。
  3. 反编译输出 Java 代码。
  4. 导出 Gradle 工程。

这些优点都让 jadx 成为我反编译的第一选择,它可以处理大部分反编译的需求,基本上是我反编译工具的首选。

接下来我们就来看看,jadx 如何使用吧。

二、使用 jadx

2.1 安装 jadx

jadx 本身就是一个开源项目,源代码已经在 Github 上开源了。

Jadx Github :

github.com/skylot/jadx

有兴趣可以直接 clone 源代码,然后本地自己编译。但是多数情况下,我们是需要一个编译好的版本。编译好的版本,可以在 sourceforge 上下载到。

sourceforge 下载 jadx。

sourceforge.net/projects/ja…

直接下载最新版就可以了,现在的最新版是 jadx-0.6.1 。下载好解压之后,你会获得这样的目录结构:

jadx-pathjadx-path

对于 Mac 或者 Linux,使用 jadx-gui ,Windows 下就需要使用 jadx-gui.bat 了,双击可以直接运行,如果有安全警告,忽略它就可以了。(后文主要以 Mac 环境为讲解,Windows 下的大部分操作都是类似的)

2.2 使用 jadx

前面提到,直接双击 jadx-gui 就可以直接运行。运行之后,会启动一个 terminal ,在这里你可以看到你所有操作的输出,错误日志也会输出在这里。

打开之后,你可以选择一个 apk、dex、jar、zip、class、aar 文件,可以看到 jadx 支持的格式还是挺多的,基本上编译成 Java 虚拟机能识别的字节码,它都可以进行反编译。除了选择一个文件,还可以直接将 apk 文件,拖拽进去,这一点非常好用。

我随便找了一个手边的 Apk ,丢进去,看看反编译后的效果。

jadx-runjadx-run

这里面就是反编译后的代码了,对于 apk 而言,一些 xml 的资源,也一并被反编译还原回来了,非常的方便。

三、jadx 的优点

jadx 使用起来非常的方便,而提供的 gui 程序,也很好用。下面开始介绍 jadx-gui 程序的一些好用的技巧。

3.1 强大的搜索功能

jadx 提供的搜索功能,非常强大,而且搜索速度也不慢。

你可以点击 Navigation -> Text Search 或者 Navigation -> Class Search 激活它,更方便的还是快捷键,我本机的快捷键是 control + shift + f,这个就因人而异了。

text-searchtext-search

jadx 的搜索,支持四种维度,Class、Method、Field、Code,我们可以根据我们搜索的内容进行勾选,范围最大的就是 Code ,基本上就是文本匹配搜索。这里反编译的 Apk 集成了支付宝支付,所以能搜到 alipay 的内容。

3.2 直接搜索到引用的代码

有时候找到关键代码了,还想看看在哪些地方调用或者引用了它。

jadx 也提供了这方面的支持,找到我们需要查看的类或者方法,选中点击右键,选择 Find Usage。

find-Usagefind-Usage

之后,它就会帮你搜索出,在这个项目中,哪些地方引用了它。

usage-searchusage-search

点击就可以直接跳转过去,非常的方便。

3.3 deobfuscation

一般 Apk 在发布出去之前,都是会被混淆的,这基本上国内 App 的标配。这样一个类,最终会被混淆成 a.b.c ,方法也会变成 a.b.c.a() ,这样其实非常不利于我们阅读。我们很难看到一个 a.java 的文件,就确定它是哪一个,还需要根据包名来区分。

而 deobfusation 功能,可以为它们其一个特殊的名字,这样它在这个项目中,名字就唯一了,方便我们识别和搜索。

这个功能可以在 Tools -> deobfusation 中激活。

接下来来看看它的效果。

deo-beforedeo-before

开启 deobfusation 之后的效果如下:

deo-afterdeo-after

可以看到,a 变成了 p003a。不知道这样看你觉得有方便一些吗?

3.4 一键导出 Gradle 工程

虽然,jadx-gui 可以直接阅读代码,还是很方便的。但是毕竟没有我们常见的编辑器来的方便。而正好 jadx 还支持将反编译后的项目,直接导出成一个 Gradle 编译的工程。

可以通过 File -> Save as gradle project 来激活这个功能。

save-gradlesave-gradle

最终输出的目录,是可以直接通过 Android Studio 打开的。

gradle-projectgradle-project

不过虽然 AS 可以直接打开它,但是大多数情况下你是编译不起来的。但是这样的功能,主要是为了借助 AS 强大的 IDE 功能,例如方法跳转、引用搜索等等,让我们阅读起来更方便。

四、jadx 的错误处理

jadx 在使用过程中,也会有一些错误情况,这里总结一些比较常见的错误。

4.1 inconsistent code

有时候有代码,反编译的不完整,你会看到 JADX WARNING : inconsistent code 标志的错误。

incon-beforeincon-before

这一段代码,就已经不是 Java 的代码了,不利于我们的阅读。而 jadx 为了应对这样的情况,可以尝试开启 Show inconsistent code 开关。你可以在 File -> Preferences 中找到它。

show-preshow-pre

开启 inconsistent code 之后,我们再来看看这段代码,就感觉亲切了。

code2code2

这样处理的代码,大部分为伪代码,可能会有错误的地方,具体问题具体分析吧。

Preferences 中,还有很多开关,有兴趣的可以自行摸索一下。

4.2 反编译错误或者卡顿

jadx 反编译一些小的 Apk,一点压力都没有,但是对于一些比较重的 Apk,一般 Apk 大于 50MB 的,你都可能遇到使用 jadx 反编译的时候卡死的问题。

如果你看了 terminal 中 Log 输出,你应该可以发现,实际上它是因为 OOM 引起的。

oomoom

官方对于这样因为内存不足引发的问题,也提供了一些解决方案。

1、减少处理的线程数。

jadx 为了加快编译的效率,所以是使用多线程处理的,而多个线程会耗费跟多的内存。所以减小反编译时候的线程数,是一个有效的方法。

如果使用命令行的话,可以使用 -j 1 参数,配置线程数为 1,不配置的话,默认线程数为 4。

而使用 jadx-gui 的话,可以在 Preferences 中,通过配置 Processing threads count 来配置线程数。

2、修改 jadx 脚本

直接编辑 ./bin 目录下的 jadx 脚本,配置找到 DEFAULT_JVM_OPTS ,将它设置为 DEFAULT_JVM_OPTS="-Xmx2500M" ,就可以配置当前使用的内存大小。

如果是 Windows 系统,你需要编辑 jadx.bat 文件。

3、使用命令行命令

如果以上方式都不好用,在没有更好的办法的情况下,你可以直接使用命令行,通过 jadx 的命令进行放编译。并将线程数配置为 1 ,这样虽然慢一些,但是多数情况下,是可以正常输出反编译后的代码的。

举个例子:

jadx -d out -j 1 classes.dex

更过命令,可以通过 jadx -h 命令进行查看。

jadx-helpjadx-help

仔细看看 jadx 命令配置的参数,基本上都可以在 Preferences 中,找到对应的配置项,相互对照理解一下,应该不难发现它的使用方式。

五、总结

jadx 确实非常的好用,到这里基本上已经把它的使用,都讲解清楚了。

你在反编译的过程中,使用 jadx 有没有碰到什么问题?还有什么更好的工具推荐,可以在留言区给我留言,我们一起讨论一下。


作者:承香墨影
链接:https://juejin.im/post/5a1bcc0151882540f363460b
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 4
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: jadx是一款开源的Java反编译工具,可以将已编译的Java代码转换为可读性较高的源代码。它支持将Android APK、DEX和JAR文件进行反编译,并以可视化界面展示转换后的代码。 jadx具有简单易用的特点,使用者只需选择目标文件,然后点击反编译按钮即可开始转换过程。转换后的代码可以直接在IDE中进行查看、编辑和调试。相比其他反编译工具,jadx输出的源代码结构清晰,保留了类、方法、变量和注释等重要信息,使得开发者能更容易理解和修改源码。 此外,jadx还提供了一些额外的功能,如搜索功能、搜索结果高亮显示、导出代码等。这些功能进一步增强了开发者对源代码的理解和控制能力。 jadx的开源性质使得它具有高度的可扩展性和灵活性。用户可以自己定制特定的转换策略或添加额外的功能,满足自己的需求。 总而言之,jadx是一款方便、强大的Java反编译工具,可帮助开发者更好地理解和分析已编译的Java代码。无论是逆向工程、故障诊断还是学习他人代码,jadx都是一个非常有用的工具。 ### 回答2: Jadx是一个用于反编译Java代码的工具。它可以将Java字节码文件(.class文件)转换回可读性较高的Java源代码。 Jadx具有以下一些主要功能: 1. 完整支持Java 8:Jadx可以处理Java 8及更高版本的代码,包括使用Lambda表达式、方法引用和其他新特性编写的代码。 2. 用户友好的界面:Jadx提供了一个简洁直观的用户界面,使得使用该工具变得非常容易。用户可以轻松地导入需要反编译的.class文件,然后立即查看源代码。 3. 多平台支持:Jadx可在Windows、Linux和macOS等多种操作系统上运行,因此可以满足不同用户的需求。 4. 高质量的源代码输出:Jadx生成的源代码质量很高,经过反编译的代码结构清晰,易于理解和修改。 5. 快速的反编译速度:Jadx的反编译过程很快,可以在几秒钟内完成大部分工作。 6. 适用于安全审计:Jadx可用于检查编译后的代码的安全性,帮助开发人员发现潜在的安全问题。 总之,Jadx是一款强大且易于使用的Java反编译工具,可以帮助开发人员或安全专家分析和理解Java代码,尤其是处理第三方库或闭源代码时非常有用。 ### 回答3: jadx是一款流行的Java反编译工具,用于将Java字节码文件转换回可读的源代码。它可以帮助开发人员或安全研究人员分析、理解和修改已编译的Java应用程序。 使用jadx时,只需将目标Java应用程序的字节码文件(.class文件或.jar文件)加载到工具中,jadx会将字节码还原为原始的Java源代码。这使得开发人员可以查看和分析程序的逻辑、算法以及底层实现。 jadx具有用户友好的界面,可以将源代码以层次结构的方式进行显示,以便更好地理解和导航代码。它还提供了搜索和过滤功能,让用户可以根据关键字或特定的代码细节来查找和浏览源代码。 jadx工具还支持将反编译的源代码导出为可供其他IDE使用的格式,如Eclipse或IntelliJ IDEA。这让开发人员可以在自己熟悉的开发环境中继续分析和修改代码。 总的来说,jadx是一款功能强大且易于使用的Java反编译工具,它为开发人员和安全研究人员提供了分析、修改和理解Java应用程序的有力工具。无论是用于学习、调试还是安全评估,jadx都是值得推荐的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值