jadx

  • 主页
  • 功能
    • dexapk文件中转换出java源代码的反编译器
  • 两种模式/版本
    • 命令行版本=command line versionjadx
    • 图形界面版本=GUI=graphical versionjadx-gui=JadxGUI
      • -> 注意:很多人往往把jadx-gui简称为jadx
      • 截图

下载jadx

jadx的release页面,可下载到最新版的jadx

比如此处是:jadx-1.2.0.zip

解压后,可以得到:

  • 命令行:jadx-1.2.0/bin/jadx
  • GUI图形界面:jadx-1.2.0/bin/jadx-gui

jadx_bin_gui

jadx使用说明

命令行:jadx

  • 命令行:jadx
    • 处理apk文件
    • 处理dex
      • 语法
          jadx -d output_folder your_dex_file.dex
        
      • 举例
        jadx-0.9.0/bin/jadx some_dex_file.dex -d .
        jadx-1.0.0/bin/jadx com.ishowedu.child.peiyin8392664.dex -d com.ishowedu.child.peiyin8392664_java
        
      • 详见:

GUI:jadx-gui

使用方式:双击bin/jadx-gui,即可打开界面

详见:jadx gui图形界面版

jadx-gui导出全部代码

文件 -> 全部保存

即可下载到:

  • 各种资源:resources
  • 源码:sources
    • 其中的sources,和文件 -> 另存为Gradle项目所导出的代码是一样的

其中就有我们希望的app的业务逻辑的代码:

jadx-gui打开的结构看出是否加固和是哪家的加固

对于某个安卓的apk,用jadx-gui打开不同版本的apk的效果是:

  • v1.5
  • v3.4.8
  • v3.6.9

-》

可以看出apk是否被加固以及用了何种加固方案:

  • v1.5:没有被加固
  • v3.4.8:加固方案 qihoo奇虎360
  • v3.6.9:加固方案 腾讯乐固legu

jadx的help帮助信息=语法参数

 bin/jadx --help

jadx - dex to java decompiler, version: 1.2.0

usage: jadx [options] <input files> (.apk, .dex, .jar, .class, .smali, .zip, .aar, .arsc)
options:
  -d, --output-dir                    - output directory
  -ds, --output-dir-src               - output directory for sources
  -dr, --output-dir-res               - output directory for resources
  -r, --no-res                        - do not decode resources
  -s, --no-src                        - do not decompile source code
  --single-class                      - decompile a single class
  --output-format                     - can be 'java' or 'json', default: java
  -e, --export-gradle                 - save as android gradle project
  -j, --threads-count                 - processing threads count, default: 4
  --show-bad-code                     - show inconsistent code (incorrectly decompiled)
  --no-imports                        - disable use of imports, always write entire package name
  --no-debug-info                     - disable debug info
  --no-inline-anonymous               - disable anonymous classes inline
  --no-replace-consts                 - don't replace constant value with matching constant field
  --escape-unicode                    - escape non latin characters in strings (with \u)
  --respect-bytecode-access-modifiers - don't change original access modifiers
  --deobf                             - activate deobfuscation
  --deobf-min                         - min length of name, renamed if shorter, default: 3
  --deobf-max                         - max length of name, renamed if longer, default: 64
  --deobf-rewrite-cfg                 - force to save deobfuscation map
  --deobf-use-sourcename              - use source file name as class name alias
  --deobf-parse-kotlin-metadata       - parse kotlin metadata to class and package names
  --rename-flags                      - what to rename, comma-separated, 'case' for system case sensitivity, 'valid' for java identifiers, 'printable' characters, 'none' or 'all' (default)
  --fs-case-sensitive                 - treat filesystem as case sensitive, false by default
  --cfg                               - save methods control flow graph to dot file
  --raw-cfg                           - save methods control flow graph (use raw instructions)
  -f, --fallback                      - make simple dump (using goto instead of 'if', 'for', etc)
  -v, --verbose                       - verbose output (set --log-level to DEBUG)
  -q, --quiet                         - turn off output (set --log-level to QUIET)
  --log-level                         - set log level, values: QUIET, PROGRESS, ERROR, WARN, INFO, DEBUG, default: PROGRESS
  --version                           - print jadx version
  -h, --help                          - print this help
Example:
  jadx -d out classes.dex

常见问题

Jadx中如何反混淆deobfuscation

此处暂时没有找到,反混淆前后对比效果明显的例子。

暂时只能随便找了个效果不明显的,用于解释如何开启和关闭反混淆。

如下:

不带反混淆:

都是a,b,c,d,j,等变量名

启用反混淆:

之前的gK,io等,就反混淆了:

变量名改为了:f23154a,f23155c,虽然反混淆后的效果很一般,但是至少比a,b,c更容易看懂一些。

jadx转换出错:java.lang.OutOfMemoryError

如果用jadx转换代码期间出错:

java.lang.OutOfMemoryError: GC overhead limit exceeded
    at jadx.core.dex.visitors.blocksmaker.BlockProcessor.computeDominators(BlockProcessor.java:189)
    at jadx.core.dex.visitors.blocksmaker.BlockProcessor.processBlocksTree(BlockProcessor.java:52)
    at jadx.core.dex.visitors.blocksmaker.BlockProcessor.visit(BlockProcessor.java:42)
    at jadx.core.dex.visitors.DepthTraversal.visit(DepthTraversal.java:27)
    at jadx.core.dex.visitors.DepthTraversal.lambda$visit$1(DepthTraversal.java:14)
    at jadx.core.dex.visitors.DepthTraversal$$Lambda$19/469590976.accept(Unknown Source)
    at java.util.ArrayList.forEach(ArrayList.java:1249)
    at jadx.core.dex.visitors.DepthTraversal.visit(DepthTraversal.java:14)
    at jadx.core.ProcessClass.process(ProcessClass.java:32)
    at jadx.api.JadxDecompiler.processClass(JadxDecompiler.java:292)
    at jadx.api.JavaClass.decompile(JavaClass.java:62)
    at jadx.api.JadxDecompiler.lambda$appendSourcesSave$0(JadxDecompiler.java:200)
    at jadx.api.JadxDecompiler$$Lambda$13/1425454633.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
...

且同时伴有:

  • CPU占用率很高
  • 内存消耗也很大
    • 比如此处JadxCLI占用了4G的内存
      • jadx占用4G内存

就是典型的:OOM=Out Of Memory的问题了。

解决办法,有两种:

  • 增加JVM最大内存
    • 逻辑:修改jadx脚本,增大-Xmx的值
    • 步骤:
      • 编辑jadx-0.9.0/bin/jadx,找到DEFAULT_JVM_OPTS的配置,修改其中-Xmx的值
      • 比如把此处的
        DEFAULT_JVM_OPTS='"-Xms128M" "-Xmx4g"'
        
      • 改为:
        DEFAULT_JVM_OPTS='"-Xms128M" "-Xmx6g"'
        
      • 即表示,把JVM最大内存,从之前的4G,增大到6G
      • 这样就运行jadx使用更多的内存,从而降低或消除OOM的问题了
  • 减少线程数
    • 逻辑:通过-j N,N=1/2之类,减少进程数,从而降低内存占用,减少OOM的概率
    • 步骤:
      • 在命令行运行jadx时,传递-j参数,指定线程数,比如
        jadx -d output_folder -j 1 your_apk.apk
        
    • 缺点
      • 处理速度会有所降低
        • 因为默认4线程处理,反编译等速度会比较快
        • 线程数减少后,反编译等速度可能会有所影响

说明:

  • 一般反编译小的不复杂的apkdex,不会遇到OOM问题
  • 反编译比较大型的,比较复杂的apkdex,才可能会遇到OOM

results matching ""

    No results matching ""