目录

1. 前言   1.1

2. 概述   1.2

3. 安卓背景知识   1.3

1. 安卓基本框架   1.3.1

2. apk编译打包流程   1.3.2

3. 破解apk的流程   1.3.3

4. 相关知识   1.3.4

1. apk文件   1.3.4.1

2. dex文件   1.3.4.2

3. 安卓虚拟机   1.3.4.3

1. Dalvik   1.3.4.3.1

2. ART   1.3.4.3.2

4. smali   1.3.4.4

4. 安卓加密技术   1.4

1. 为何要加密加固   1.4.1

2. 加密技术历史   1.4.2

3. 加密方案概述   1.4.3

1. 代码混淆   1.4.3.1

1. ProGuard   1.4.3.1.1

2. Obfuscator-LLVM   1.4.3.1.2

2. 花指令   1.4.3.2

3. VMP   1.4.3.3

4. 加壳加固   1.4.3.4

1. 常见加固技术对比   1.4.3.4.1

2. 常见加固服务提供商   1.4.3.4.2

5. 安卓破解技术   1.5

1. 如何反混淆   1.5.1

2. 如何去壳脱壳   1.5.2

1. 如何判断哪家加固方案   1.5.2.1

3. 如何从apk破解出java源码   1.5.3

1. 破解apk概述   1.5.3.1

2. 一步: apk->java   1.5.3.2

3. 两或三步: app->dex->jar->java   1.5.3.3

1. 1. app导出dex   1.5.3.3.1

2. 2.1 dex转java   1.5.3.3.2

3. 2.2.1 dex转换出jar   1.5.3.3.3

4. 2.2.2 jar转换出java   1.5.3.3.4

6. 常见安卓破解工具   1.6

1. 从app导出dex   1.6.1

1. FDex2   1.6.1.1

2. DumpDex   1.6.1.2

3. drizzleDumper   1.6.1.3

4. DexExtractor   1.6.1.4

5. InDroid   1.6.1.5

6. DexHunter   1.6.1.6

7. FART   1.6.1.7

2. dex转jar   1.6.2

1. dex2jar   1.6.2.1

2. Enjarify   1.6.2.2

3. Dedexer   1.6.2.3

3. 反编译器   1.6.3

1. 常见反编译器对比   1.6.3.1

1. JD-GUI vs Luyten   1.6.3.1.1

2. JD-GUI vs CFR vs Procyon vs Jadx   1.6.3.1.2

1. 总结和结论   1.6.3.1.2.1

2. 常见反编译器   1.6.3.2

1. jadx   1.6.3.2.1

2. CFR   1.6.3.2.2

3. JD-GUI   1.6.3.2.3

4. Procyon   1.6.3.2.4

1. Luyten   1.6.3.2.4.1

5. Krakatau   1.6.3.2.5

6. Fernflower   1.6.3.2.6

7. GDA   1.6.3.2.7

8. Dare   1.6.3.2.8

9. JAD   1.6.3.2.9

4. 其他破解类工具   1.6.4

1. 反汇编器   1.6.4.1

2. apktool   1.6.4.2

3. IDA   1.6.4.3

4. radare2   1.6.4.4

5. 安卓XML破解   1.6.4.5

1. AXMLPrinter2   1.6.4.5.1

5. 其他辅助类工具   1.6.5

1. 二进制编辑   1.6.5.1

1. 010editor   1.6.5.1.1

2. EverEdit   1.6.5.1.2

2. apk分析   1.6.5.2

1. ClassyShark   1.6.5.2.1

2. APK Analyzer   1.6.5.2.2

3. SmaliViewer   1.6.5.2.3

3. 动态分析和调试   1.6.5.3

1. AndBug   1.6.5.3.1

2. redexer   1.6.5.3.2

3. Fino   1.6.5.3.3

6. 其他综合类工具   1.6.6

1. ByteCode Viewer   1.6.6.1

2. Android Decompiler   1.6.6.2

3. decompile-apk   1.6.6.3

4. Android-Crack-Tool For Mac   1.6.6.4

5. Android逆向助手   1.6.6.5

6. AndroidKiller   1.6.6.6

7. Androguard   1.6.6.7

8. AFE   1.6.6.8

7. 其他相关工具   1.6.7

1. 安卓Hook框架   1.6.7.1

1. XPosed框架   1.6.7.1.1

2. Cydia Substrate   1.6.7.1.2

1. Android-OpenDebug   1.6.7.1.2.1

2. Introspy-Android   1.6.7.1.2.2

3. frida   1.6.7.1.3

2. 安卓模拟器   1.6.7.2

1. 夜神安卓模拟器   1.6.7.2.1

3. 文件浏览器   1.6.7.3

7. 附录   1.7

1. 参考资料   1.7.1

安卓应用的安全和破解

- 最新版本： v2.7

- 更新时间： 20210819

简介

总结安卓应用的安全措施和如何出于研究目的去破解安卓应用，其中介绍好多代的加密技术发展历史，包括常见的代码混淆，自我校验，dex文件变形，dex文件隐藏、so保护等等。总结了安卓的编译和反编译的基本流程和逻辑。整理了加密和解密，反编译，加固，脱壳等相关的工具和技术。典型的反编译流程包括，如何从apk反编译得到java源代码，如何从apk转换出dex文件，如何从dex文件转换出jar文件，如何从jar文件转换出java源代码等等原理和详细步骤。且总结了和安卓反编译、逆向工程、分析等相关的各种工具和软件，包括好用的jadx、Procyon、FDex2、DumpDex、dex2jar、jd-gui、apktool等常用破解工具。

源码+浏览+下载

本书的各种源码、在线浏览地址、多种格式文件下载如下：

Gitbook源码

- crifan/android_app_security_crack: 安卓应用的安全和破解

如何使用此Gitbook源码去生成发布为电子书

详见：crifan/gitbook_template: demo how to use crifan gitbook template and demo

在线浏览

- 安卓应用的安全和破解 book.crifan.com

- 安卓应用的安全和破解 crifan.github.io

离线下载阅读

- 安卓应用的安全和破解 PDF

- 安卓应用的安全和破解 ePub

- 安卓应用的安全和破解 Mobi

版权说明

此电子书教程的全部内容，如无特别说明，均为本人原创和整理。其中部分内容参考自网络，均已备注了出处。如有发现侵犯您版权，请通过邮箱联系我  admin 艾特 crifan.com ，我会尽快删除。谢谢合作。

鸣谢

感谢我的老婆陈雪的包容理解和悉心照料，才使得我 crifan 有更多精力去专注技术专研和整理归纳出这些电子书和技术教程，特此鸣谢。

更多其他电子书

本人 crifan 还写了其他 100+ 本电子书教程，感兴趣可移步至：

crifan/crifan_ebook_readme: Crifan的电子书的使用说明

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-09-08 10:07:38

概述

之前有接触过安卓的apk应用程序的破解，现在去整理一下其中涉及到的各种安卓的安全技术和相应的破解技术。

不准把技术用于非法用途

警告⚠️：相关破解技术仅限于技术研究使用，不准用于非法目的，否则后果自负。

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:46

安卓背景知识

在介绍安卓的安全技术和破解技术之前，需要先去了解相关的背景知识。

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

安卓基本框架

为了更好的理解，安卓破解相关知识和工具，先要了解安卓的基本框架，以及每一层中都是什么东西：

安卓的基本架构

- 内核层：

- 支持多进程和多线程的Linux内核

- 每个应用程序都有自己的Linux ID，并在单独的进程中运行

- 具有相同ID的两个应用程序可以彼此交换数据。

- 系统运行层

- 主要包括一些 开源类库 以及 Android运行时环境

- 其中 Dalvik 虚拟机中运行的应用程序格式为 dex 的 二进制文件

- 应用框架层

- 具有Java接口的应用程序框架

- 主要组成

- Android NDK

- Android SDK

- 应用层

- 预安装一些核心应用程序

后续的很多破解工具，则是针对 Dalvik 虚拟机和dex文件去破解的。

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

apk编译打包流程

APK打包流程

apk 打包流程图= apk 产生过程：

和

和 安卓编译流程：

具体的解释是：

- 资源处理

- 这一过程中主要

- 使用appt工具进行资源文件的处理

- 分析AndroidManifest.xml中的资源文件

- 生成R.java和resources.arsc文件

- aidl工具负责处理aidl文件

- 生成对应的java接口文件

- 代码编译

- 将上一过程中产生的R.java、java接口文件以及工程源代码一起通过Java Compiler编译成.class文件，打成Jar包

- 这部分可以加入代码混淆）

- 比如用 ProGuard

- 然后与第三方库的Jar包一起通过dx工具转换成.dex文件

- 注：如果apk的方法数超过了65535，会生成多个dex文件

- 反编译的话需要对这多个dex文件均进行转换Jar包处理

- 通过apkbuilder工具将aapt生成的resources.arsc、classes.dex（可能多个）、其他的资源一块打包生成未经签名的apk文件。

- 添加签名

- 通过Jarsigner对生成的未签名的apk进行签名。

- 再通过zipalign对签名后的apk进行对其处理，使apk中所有资源文件距离文件起始偏移为4字节的整数倍，从而在通过内存映射访问apk文件时会更快。

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

破解apk的流程

简述安卓apk的产生过程：

- java源代码

- java编辑器  编译

- class文件

- dx 工具转换和打包压缩

- 加上 第三方的，其他的库文件

- dex文件

- apkbuilder打包

- 加上 其他资源文件resources.arsc，其他库等

- （未签名的）apk文件

- jarsigner去签名 + zipalign去处理

- （已签名的）apk文件

- 可以用于发布和上架各种安卓应用市场

- 供普通用户下载安装试用

-》想要破解安卓apk，也就是反向操作了：

- 从apk（安装后的运行期间的app）反向（用hook机制去dump）导出dex文件

- 如果是普通加固

- 用FDex2等工具是可以成功导出dex的

- 如果是各家收费的高级的加固方案

- 估计就比较困难了

- 从dex文件反编译出jar包（内部就是各种class了）

- 有的dex反编译会出现各种错误

- 估计是加固的方案比较高级导致的

- 有的dex反编译没有出错

- 如果又是我们希望的包含了app业务逻辑的代码

- 那后续就可以完美的破解得到程序的java源代码了

- 从jar包反编译出java源代码

- 即可查看和导出全部的java源代码了

- 注意：

- 当前如果之前混淆了代码

- 最后此处得到的也是混淆后的代码

- 不容易看出原始代码的业务逻辑

- 说明

- 此过程和之前的编译对应，所以严格的叫法就是所谓的：

- 反编译=decompile

- 对应工具才叫做：decompiler

- 反编译器=解码器=逆编译程序

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

相关知识

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

apk文件

- apk = android Application PacKage = APK

- apk文件是什么：是安卓app的安装文件

- 本质：（apk文件其实就是个）zip压缩包

- 意味着

- 可以用解压缩工具把apk当做zip文件一样去解压

- 解压后，得到一堆安卓相关文件

- 可以在 apktool 等工具破解和修改了安卓文件后，再重新用压缩文件工具或 apktool 等工具，重新打包为 apk 文件

apk内容结构

内容入口

含义解释

AndroidManifest.xml

二进制xml文件，提供设备运行应用程序所需的各种信息

classes.dex

以dex格式编译的应用程序代码

resources.arsc

包含预编译应用程序资源的二进制XML文件

res/

此文件夹中包含未编译到resources.arsc文件中的资源

assets/

此文件夹包含应用程序的原始资产，由AssetManager提供对这些资产文件的访问

META-INF/

它包含MANIFEST.MF文件，该文件存储有关JAR内容的元数据。APK的签名也存储在此文件夹中

lib/

该文件夹包含已编译的代码，例如本地代码库

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:46:32

dex文件

什么是dex文件

简答：

- dex  =  Dalvik EXecutable format = dex文件 = dex格式

- dex 之于 Android ，类似于 class 之于 Java

- 注：java的class文件内部是Java的字节码(Java bytecode)

- dex = Dalvik EXecutable

- 相关： dex文件 = dex字节码

- dex 反汇编后是： Smali代码

- 即：Android（虚拟机中的dex文件）反汇编（后的）代码： Smali

- 文档

- dex格式

- Dalvik 可执行文件格式 | Android 开源项目 | Android Open Source Project

- https://source.android.com/devices/tech/dalvik/dex-format

- 字节码

- Dalvik 字节码 | Android 开源项目 | Android Open Source Project

- https://source.android.com/devices/tech/dalvik/dalvik-bytecode

详解：

安卓系统中，用 Dalvik虚拟机 ( DVM = Dalvik Virtual Machine )去把 java 源码编译为 dex 可执行文件(Dalvik Executable)。

而dex文件中保存的就是：编译后了的安卓程序代码文件

Dex文件内部格式

1. File Header

2. String Table

3. Class List

4. Field Table

5. Method Table

6. Class Definition Table

7. Field List

8. Method List

9. Code Header10. Local Variable List

相关工具

Android自带 dexdump ：用来反编译 dex 文件

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:45:50

安卓虚拟机

- 历史背景

- Android

- 代码语言： Java

- Java 的虚拟机是： JVM

- Android：出于性能考虑，没用 JVM ，用了自己的虚拟机 VM

- 安卓虚拟机 = Android虚拟机 = Android VM

- 旧： Android < 5.0 ： Dalvik

- Dalvik VM = DVM

- 概述

- Dalvik 是 google 专门为 Android 操作系统设计的一个虚拟机，经过深度的优化。虽然Android上的程序是使用java来开发的，但是Dalvik和标准的java虚拟机JVM还是两回事

- 新： Android >= 5.0 ： ART

- ART = Android RunTime

- 资料

- 官网

- Android Runtime (ART) 和 Dalvik | Android 开源项目

- https://source.android.com/devices/tech/dalvik

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:45:21

Dalvik

- Dalvik  =  Dalvik VM  =  DVM

- JVM  vs  DVM

- 编译流程对比

- JVM：

- 基础 ：基于栈帧 Stack-based

- ·文件格式·： java字节码 = java bytecode

- 效率：相对低

- DVM：

- 基础 ：基于寄存器 Register-based

- 文件格式 ：dex

- 效率： DVM 效率比 JVM 高

- 速度更快，占用空间更少

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:47:09

ART

- ART = Android RunTime

- 是什么：Android的新一代的VM虚拟机

- 用于替代旧的：Dalvik

- 特点

- 预先编译 AOT

- 垃圾回收方面的优化

- 开发和调试方面的优化

- 支持采样分析器

- 支持更多调试功能

- 优化了异常和崩溃报告中的诊断详细信息

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:41:50

smali

- Smali

- 是什么：一种 汇编语法 / 汇编文件

- 一种语法： Smali语法

- 来源：是 Dalvik 的 VM 的字节码，即 dex 文件中的 bytecode = 二进制数据 ，反汇编后得到的：Smali代码

- 语法：一种宽松式的Jasmin/dedexer语法

- 它实现了 .dex 格式所有功能（注解，调试信息，线路信息等）

- 对应文件叫： Smali文件

- 举例

- java源码： int x = 42

- Dalvik编译后的，dex中 二进制数据 = bytecode = 字节码 ： 13 00 2A 00

- 二进制，人类很难读懂

- 用 baksmali 反汇编后的，smali代码： const/16 v0, 42

- smali代码，人类基本可读

- 学习Smali的用途

- 分析Apk：静态分析，不够

- 需要动态分析，涉及Smali

- 修改Apk逻辑：修改Smali代码，重新编译打包Apk

- Android逆向基础：掌握Smali

- 能阅读 smali 代码对进行 android 逆向十分重要

- 官网

- JesusFreke/smali: smali/baksmali

- https://github.com/JesusFreke/smali

- smali / baksmali

- GitHub

- JesusFreke/smali: smali/baksmali

- smali/baksmali is an assembler/disassembler for the dex format used by dalvik, Android's Java VM implementation

- 针对dex

- smali ： assembler = 汇编器

- smali语言 = 汇编语言

- baksmali ： disassembler = 反汇编器

- 安卓系统里的Java虚拟机（Dalvik）所使用的一种 .dex 格式文件的反汇编器

Smali基本语法

- 官网文档

- TypesMethodsAndFields · JesusFreke/smali Wiki

- https://github.com/JesusFreke/smali/wiki/TypesMethodsAndFields

数据类型 Types

Smali

Java

备注

v

void

只能用于返回值类型

Z

boolean

B

byte

S

short

C

char

I

int

J

long

F

float

D

double

Lpackage/name;

对象类型

L 表示这是一个对象类型， package/name 表示该对象所在的包， ； 表示对象名称的结束

Lpackage/name/ObjectName;  相当于 java 中的 package.name.ObjectName;

[类型

数组

[I 表示一个 int 型 数组， [Ljava/lang/String 表示一个 String 的对象   数组`

寄存器

- 官网文档

- Registers · JesusFreke/smali Wiki

- https://github.com/JesusFreke/smali/wiki/Registers

- Java中变量都是存放在内存中的

- Android为了提高性能，变量都是存放在寄存器中的

- 寄存器为32位，可以支持任何类型

- 寄存器

- 类型

- 本地寄存器

- 用v开头数字结尾的符号来表示

- 举例

- v0, v1, v2

- 参数寄存器

- 用p开头数字结尾的符号来表示

- 举例

- p0,p1,p2

- 注意

- 在 非static 方法中，p0代指this，p1为方法的第一个参数

- 在 static 方法中，p0为方法的第一个参数

- 说明

- 指定有多少寄存器是可用

- .registers ：指定了方法中寄存器的总数

- .locals ： 表明了方法中非参寄存器的总数，出现在方法中的第一行

Smali代码示例

const/4 v0, 0x1 //把值0x1存到v0本地寄存器

iput-boolean v0,p0,Lcom/aaa;->IsRegisterd:Z //把v0中的值赋给com.aaa.IsRegistered，p0代表this，相当于this.Isregistered=true

成员变量？ Fields

- 格式

.field public/private [static][final] varName:<类型>

- 指令

- 获取指令

- iget, sget, iget-boolean, sget-boolean, iget-object, sget-object

- 操作指令

- iput, sput, iput-boolean, sput-boolean, iput-object, sput-object

- array的操作是aget和aput

Smali代码示例

sget-object v0,Lcom/aaa;->ID:Ljava/lang/String;

- 获取ID这个String类型的成员变量并放到v0这个寄存器中

iget-object v0,p0,Lcom/aaa;->view:Lcom/aaa/view;

- iget-object比sget-object多一个参数p0，这个参数代表变量所在类的实例。这里p0就是this

const/4 v3, 0x0

sput-object v3, Lcom/aaa;->timer:Lcom/aaa/timer;

- 相当于java代码

this.timer = null;

.local v0, args:Landroid/os/Message;

const/4 v1, 0x12

iput v1,v0,Landroid/os/Message;->what:I

- 相当于java代码

args.what = 18;

- 其中args为Message的实例

方法/函数 Methods

- 函数定义格式

.method public/private [static][final] methodName()<类型>

.end method

- 函数类型

- direct method = private方法

- virtual method  = 其余的方法

- 函数调用

- 格式

invoke-指令类型 {参数1, 参数2,...}, L类名;->方法名

- 包含

- invoke-direct

- invoke-virtual

- invoke-static

- invoke-super

- invoke-interface

- 函数返回结果

- 要用指令move-result或move-result-object来保存函数返回的结果

Smali代码示例：

.method private ifRegistered()Z

.locals 2            // 本地寄存器的个数

.prologue

const/4 v0, 0x1      //v0赋值为1

if-eqz v0, :cond_0   //判断v0是否等于0，等于0则跳到cond_0执行

const/4 v1, 0x1      //符合条件分支

:goto_0              //标签

return v1            //返回v1的值

:cond_0              //标签

const/4 v1, 0x0      //cond_0分支

goto :goto_0         //跳到goto_0执行

.end method

const-string v0, "NDKLIB"

invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V

- 相当于java代码

System.loadLibrary("NDKLIB")

const-string v0, "Eric"

invoke-static {v0}, Lcmb/pbi;->t(Ljava/lang/String;)Ljava/lang/String;

move-result-object v2

- 表示将方法 t 返回的 String对象 保存到 v 2中

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:49:00

安卓加密技术

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

为何要加密加固

- 安卓应用主要基于Java开发

- 极易被破解

- 造成影响

- 代码或关键接口暴露

- 甚至被别人加入广告，病毒等二次打包发布

- 给公司和用户均带来巨大的风险

- 应对破解的最便捷有效的方式

- 加固

- 通过加固可以在一定程度上达到反编译和防止被二次打包的效果

- 其他一些原因

- 处于学习目的，想要了解、分析、学习某个安卓app的内部设计和代码逻辑

- 所以需要反编译和破解

- 所以防止别人破解要加密和加固

但是加固也有些缺点：

- 加固后对应用的影响

- 体积

- 变大（一些）

- 启动速度

- 变慢（一些）

- 效率（略）降低

- 兼容性

- 部分方案加固后，会导致无法正常某些平台的正常运行

- 使用成本

- 有些加固方案需要收费

- 影响部分应用市场的上架

- 有部分的市场会拒绝加壳后的应用上架

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

加密技术历史

下面整理安卓的加密技术的历史发展。

用人类历史发展的阶段去类比解释如下：

原始社会时期

主要方式： 代码混淆

奴隶社会时期

主要方式：  自我校验

封建社会时期

主要方式：  dex文件变形

资本主义社会时期

1. Dex保护

1. 隐藏dex文件

- 既然dex文件中包含了核心逻辑，那么把dex隐藏，再通过另外的方式加载起来，是不是就能达到保护dex的目的了呢?于是这成为一些第三方加固产品保护应用的方式。

- 他们通过加密甚至压缩(早期是不存在压缩的，只是单纯的加密)方式把dex转换为另外一个文件。而被加固后的apk里面的dex则是那些第三方加固产品用来启动和加载隐藏dex的入口，也就是壳。

- 感觉小花生v3.6.9 和 康美通 v.4.4.0就是这类？

- 总之是看不到dex文件

2. 对dex文件进行变形

- 这里所说的变形，不同于封建社会时期提到的变形。这种办法不隐藏dex，而是让dex保留在外面，但是当破解者去分析这个dex的时候，会发现dex里面的内容是不完整的。

3. 对dex结构进行变形

- 此类方法是比较复杂的，了解dex结构的人应该很清楚，dex结构中包含DexClassDef、ClassDataItem、DexCode，这些是dalvik虚拟机运行一个dex必不可少的部分，特别是DexCode，DexCode包含了虚拟机运行的字节码指令。

- 部分第三方加固产品开始尝试这种方式，他们的保护方案中可能抽取了DexCode中的部分，然后对字节码指令添加nop，或者连ClassDataItem和DexCode一同抽取，或者对上面提到的三个部分都做处理。抽取完之后，还要做修正、修复等工作，总之很烦锁。因为dex运行时有很多关于dex的校验，即使校验通过还有一些偏移问题。

- Dex都被抽取修改后为什么还能运行呢?那是因为在运行之前或者运行之中对这个内存中的dex做修正。修正工作也很复杂，一般选择在运行之前做修正，这样可以减少很大的工作量，甚至可能还需要借助hook来帮忙。

2. So保护

1. 修改Elf头、节表

- 相关工具：

- 010 Editor

- IDA

2. 选择开源加壳工具

- 最常用的：

- UPX壳

- 支持arm架构的ELF加固

3. 进程防调试、或增加调试难度

- 调试一个进程首先要ptrace这个进程

- 防止进程被ptrace

社会主义时期

- 之前遗留问题

1. 隐藏dex遗留的问题

- 破解办法：

- 实现自定义rom

- 利用Inject原理将目标进程注入,代码进行hook系统函数来达到脱壳的目的

- FDex2，DumpDex感觉就是用的这个机制？

2. Dex结构变形带来的弊端

- 安卓5.0新增了ART

- ART可以直接将dex编译为本地指令运行

- Dex结构变形遗留的问题很明显

- 兼容性

- ART模式下的编译问题

3. ELF简单修改遗留问题

4. UPX方面的劣势

- 虽然upx是最为so加壳的首选，但是upx代码逻辑复杂，很难达到定制，特别是让它同时支持多种架构

- -》基于上述原因一些第三方加固产品只是简单的利用upx加壳，并修改一些数据。不过很容易被有upx经验的人识破并脱壳

- 新防护技术

- llvm混淆

- 据说是新的llvm混淆，效果非常好，可以实现，即使被破解后，也很难看懂代码

- VMP

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

加密方案概述

下面整理一下常用的安卓的加密技术和方案：

- 代码混淆

- 常用（Android自带的） ProGuard

- 加固

- 发展历史

- 目前加固技术基本都发展到第三代

- 前2代的加固技术破解难度不大，基本被淘汰

- 第三代加固技术，由于各加固服务商加固原理大致相同

- 第三代加固技术主要有2种方式：

- 对源apk整体做一个加固，放到指定位置，运行的时候再解密动态加载

- 对apk加固的破解，叫做：脱壳=去壳

- == Dex Method代码动态解密

- 对so进行加固，在so加载内存的时候进行解密释放

- 对so的加固的破解，叫做：so库反编译

- == So代码膨胀混淆

另外参考这里的总结：

- 鉴于现在很多破解脱壳方案，都是基于 Hook 框架，去从安卓app中导出dex文件

- 典型的hook框架

- XPosed ：从根上Hook了Android Java虚拟机

- Cydia ：支持jni和java层的HOOK功能

- 再去从dex中转换出java代码

- 而各大安卓厂商意识到了，如果只是代码用Java写，代码运行在Java层，则被破解和被篡改的概率很大

- 所以很多都把重要代码放到 JIN 层了

- 比如：

- 微信 的 数据库的连接操作

- 不过从破解的技术角度说

- 你 加壳  -》 我 脱壳

- 你把操作放在 so  -> 我就用 IDA 调试

- 你有反调试(检测？) -> 我就绕过去

- 当然这样会增加破解难度

- 对于普通技术不行的，还是可以防得住的

- 但是对于高手，有一定毅力和能力，还是可以破解的

如何防护安卓的安全

- 首要的：加强业务逻辑

- api接口通讯

- 全部接口都实现https

- 且做证书绑定 ssl pinning

- 其次：加强安全防破解技术

- 代码

- 代码混淆

- 首选：Obfuscator-LLVM

- 其次：ProGuard

- 其他防护

- VMP

- 给dex（中的核心逻辑）做VMP

- 给SO库（中的核心逻辑）做VMP

- 加壳

- 用第三方加壳服务或自己实现

- 第三方加壳服务商

- 腾讯乐固legu

- 360加固保

- 网易易盾

- 等

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-07-01 18:38:25

代码混淆

- 混淆 = 代码混淆

- 含义：把原先的代码通过变量替换（成a,b,c等）方式，使得代码不可读，很难读

- 目的：增加破解人员读懂原先代码逻辑的难度

下面详细介绍安卓代码混淆的技术方案：

- ProGuard

- Obfuscator-LLVM

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

ProGuard

ProGuard的作用

- 压缩=Shrinking

- 移除未被使用的类、属性、方法等，并且会在优化动作执行之后再次执行（因为优化后可能会再次暴露一些未被使用的类和成员

- 优化=Optimization

- 优化字节码，并删除未使用的结构

- 混淆=Obfuscation

- 将类名、属性名、方法名混淆为难以读懂的字母，比如a,b,c等，增大反编译难度

ProGuard的输出文件说明

- dump.txt ：说明 APK 中所有类文件的内部结构

- mapping.txt ：提供原始与混淆过的类、方法和字段名称之间的转换和对应关系

- seeds.txt ：列出未进行混淆的类和成员

- usage.txt ：列出从 APK 移除的代码

注意事项

- 有些库，混淆后，导致代码不可用

- 所以有些好的库，专门支持了ProGuard

- 举例

- okhttp

- GitHub

- https://github.com/square/okhttp

- If you are using R8 or ProGuard add the options from okhttp3.pro

- R8 proguard - OkHttp

- 有些库不够好，需要自己额外处理

- 举例

- PermissionGen

- https://github.com/lovedise/PermissionGen

- 某人：打包混淆以后就废了，需要自己加配置，避免部分模块被混淆，才勉强可用

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

Obfuscator-LLVM

- Obfuscator-LLVM = O-llvm

- 功能特性

- 指令替换

- 参数： -mllvm -sub

- 文档：Instructions Substitution

- Bogus控制流

- 参数： -mllvm -bcf

- 文档：Bogus Control Flow

- 控制流扁平化 = 控制流平坦化

- 参数： -mllvm -fla

- 文档：Control Flow Flattening

- 函数注解

- 文档：Functions annotations

- 应用

- 市场上一些加固厂商(比如360加固宝、梆梆加固)会使用改进的Obfuscator-LLVM对它们so文件中的一些关键函数采用Obfuscator-LLVM混淆，增加逆向的难度

- 简单一点的是，用Obfuscator-LLVM混淆native代码，膨胀so并插入花指令

- 文档

- Github

- obfuscator-llvm/obfuscator

- https://github.com/obfuscator-llvm/obfuscator

- Home · obfuscator-llvm/obfuscator Wiki

- https://github.com/obfuscator-llvm/obfuscator/wiki

- 最新版

- obfuscator-llvm/obfuscator at llvm-4.0

- https://github.com/obfuscator-llvm/obfuscator/tree/llvm-4.0

相关：llvm

- LLVM = Low Level Virtual Machine

- 概述：a open source toolkit for the construction of highly optimized compilers, optimizers, and runtime environments

- 其下很多子项目

- LLVM Core

- LLVM总体架构

- Clang

- LLDB

- libc++ 和 libc++ ABI

- compiler-rt

- MLIR

- OpenMP

- polly

- libclc

- klee

- LLD

- 官网

- http://www.llvm.org/

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

花指令

- 加花  =  花指令

- 名称：

- 花指令

- 又称：

- 垃圾指令

- 指令 其实就是 字节

- = Junk Bytes = JunkBytes

- 垃圾代码 = Junk Code = JunkCode

- 把 花指令 加到代码中的动作： 加花

- 起源： 花指令 这个词来源于汇编语言

- 含义：在真实代码中插入一些（ 垃圾 的、 无用 的） 代码 / 指令 / 字节 ，但又不会改变程序的原始逻辑，确保原有程序的正确执行

- 目的：反汇编工具在反汇编时会出错，导致反汇编工具失效，提高破解难度

- 隐藏掉不想被逆向工程的代码块(或其它功能)的一种方法，使得程序无法很容易地反编译，即使被反编译后，也难以理解程序内容， 达到混淆视听的效果，增加破解和逆向的难度

- 主要思想

- 当花指令跟正常指令的开始几个字节被反汇编工具识别成一条指令的时候，才可以使得反汇编工具报错

- 插入的花指令都是一些随机的但是不完整的指令

- 特点

- 花指令必须要满足两个条件

- 在程序运行时，花指令是位于一个永远也不会被执行的路径中

- 这些花指令也是合法指令的一部分，只不过它们是不完整指令而已

- 实现思路

- 在每个要保护的代码块之前插入无条件分支语句和花指令

- 实际案例

- Dalvik Bytecode Obfuscation on Android中，插入fill-array-data-payload花指令，导致反编译工具失效

- 现存服务提供商

- 举例

- 网易易盾的：安卓dex加花保护

- 相关背景

- 反汇编工具常用算法

- 线性扫描算法

- 逻辑：依次按顺序逐个地将每一条指令反汇编成汇编指令

- 结果：容易把花指令错误识别，导致反汇编出错

- 举例

- 指令

- 反汇编后出错

- 递归扫描算法

- 逻辑：按顺序逐个反汇编指令

- 如果某个地方出现了分支，就会把这个分支地址记录下来，然后对这些反汇编过程中碰到的分支进行反汇编

- 结果：反汇编能力更强

- 总结

- 常用Android逆向工具中的反汇编算法

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-07-01 18:37:06

VMP

新出的安卓加密技术，叫做： VMP

- VMP

- 名称： VMP = Virtual Machine Protection = 虚拟机保护 = 虚拟软件保护技术 = 代码虚拟化

- 是什么：（安卓）代码加固领域的技术

- 背景和起源

- 俄罗斯的著名软件保护软件 VmProtect=虚拟机保护

- 主页：VMProtect Software Protection

- 以此为开端引起了软件保护壳领域的革命，各大软件保护壳都将虚拟机保护这一新颖的技术加入到自己的产品中

- 为什么（要指令虚拟化）？

- 软件保护壳的发展阶段

- 第一阶段

- 当壳完成解密目标代码时，它将不会再次控制程序，被保护程序的明文将在内存中展开。在此之前，壳可以调用一切系统手段来防治黑客的调试与逆向

- 第二阶段

- 可以实现分段式的加解密，壳运行完毕后，并不会消失而仍然会在程序运行到某个点时再次启动

- 第三阶段

- 其实最简单的解释是，将被保护的指令使用一套自定义的字节码(逻辑上等价)来替换掉程序中原有的指令，而字节码在执行的时候又由程序中的解释器来解释执行，自定义的字节码只有自己的解释器才能识别，也是因为这一点，基于虚拟机的保护相对其他保护而言要更加难分析

- 核心原理

- 代码虚拟化 = 基于 Dalvik 的解释器实现自己定义的指令

- 说明

- 将程序代码编译为虚拟机指令即虚拟代码(自己定义的代码集)，通过虚拟CPU解释并执行的一种方式

- 自定义一套虚拟机指令和对应的解释器，并将标准的指令转换成自己的指令，然后由解释器将自己的指令给对应的解释器

- 举例

- x86或arm体系架构的标准汇编指令（mov、add、pop等），已变成了自定义加密汇编指令（xchg、db、dq等）

- 图解

- 运行机制

- 运行流程

- 加固端

- 解释器

- 缺点

- 存在一定兼容性问题

- 会降低代码执行效率

- 应用

- 说明

- 由于兼容性和效率等问题，所以VMP一般只用于关键函数

- 根据保护的内容，可以分

- DEX 的 VMP

- SO 的 VMP

- 多数VMP的实现都是：直接把 smali 翻译成 c 实现

- 举例

- 爱加密

- 所说的第四代vmp是先提取dex中的虚拟指令集，将dex中提取指令的方法清空，并将方法修改为native方法；然后通过爱加密自定义指令替换规则，替换提取的指令并保存到其他文件中

- 通付盾

- 实现了自定义指令集和自定义虚拟机运行环境的动态代码保护方案

- 产品

- 通付盾安全虚拟机 PayegisVM 3.0

- 虚拟机

- 背景：VMP的核心要点是，设计一个虚拟机，实现自定义指令的功能

- 包含几大模块

- VM 虚拟机核心

- VM 编译器

- 如何设计一个编译器?

- 编译器工作流程

- 1.反汇编ARM

- 2.生成中间代码

- 3.处理定位

- 4.生成opcode

- VM 链接器

- VM 各种stub

- 想实现一个基于虚拟机的保护壳，涉及内容

- 随机VCode与Handle的关系映射

- Handle混淆与乱序

- 代码变形

- 重定位

- 资料

- 网上某个开源实现

- GitHub主页

- eaglx/VMPROTECT: Obfuscation method using virtual machine.

- https://github.com/eaglx/VMPROTECT

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

加壳加固

安卓加密安全技术中，除了基本的代码混淆外，更多的是采用加固技术。

下面详细介绍加固的常见技术和方案。

- 加固 = 应用加固

- 含义：给原有应用，加了层保护壳

- 目的：使得别人即使反编译安卓应用得到了的jar包，也看不到原始的项目的源码

加固 的英文说法

对于安卓apk的加固的英文说法：

- 自己暂时用： harden

- 被加固了的（apk）就叫： hardened

- 加壳过程叫做： pack  =  packing

- 加壳的动作叫做： packer

- 其他叫法： shelling

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-08-19 17:17:37

常见加固技术对比

常见Android APK的五代加固技术比较：

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

常见加固服务提供商

市面上有很多家公司、厂家提供了免费或收费的加固方案：

各家加固方案的总结和对比

此处先列出：

总体效果对比

- 体积（体积小的为优）： 360 > 腾讯 > 爱加密 > 阿里 > 梆梆

- 兼容性：  阿里 > 腾讯 > 360 = 梆梆 > 爱加密

- 启动速度（时间短为优）：  阿里 > 爱加密 > 360 = 梆梆 > 腾讯

- 漏洞：  腾讯 > 爱加密 > 360 > 梆梆 > 阿里

实现原理对比

引用别人总结的（截至2015年）各家加固方案的技术原理，供参考：

- 360：基本上是把原始的 dex 加密存在了一个 so 中，加载之前解密

- 阿里：把一些 class_data_item 和 code_item 拆出去了，打开 dex 时会修复之间的关系。同时一些 annotation_off 是无效的的来防止静态解析

- 百度：把一些 class_data_item 拆走了，与阿里很像，同时它还会抹去 dex 文件的头部；它也会选择个别方法重新包装，达到调用前还原，调用后抹去的效果。我们可以通过对 DoInvoke  ( ART )和 dvmMterp_invokeMethod  ( DVM )监控来获取到相关代码

- 梆梆和爱加密：与360的做法很像，梆梆把一堆 read 、 write 、 mmap 等 libc 函数 hook 了，防止读取相关 dex 的区域，爱加密的字符串会变，但是只是文件名变目录不变

- 腾讯：针对于被保护的类或方法造了一个假的 class_data_item ，不包含被保护的内容。真正的 class_data_item 会在运行的时候释放并连接上去，但是 code_item 却始终存在于 dex 文件里，它用无效数据填充 annotation_off 和 debug_info_off 来实现干扰反编译

各家加固方案详解

360加固宝

- 主页：http://jiagu.360.cn/

- 还有其他产品：

- 针对手游的：

- 360手游保

- http://shouyoubao.360.cn

- 针对网页的：

- H5加固

腾讯乐固legu

- 主页：http://legu.qcloud.com/

- 应用安全 = Mobile Security = MS

- 功能：为用户提供移动应用（APP）全生命周期的一站式安全解决方案

- 涵盖服务

- 应用加固

- 安全测评

- 兼容性测试

- 盗版监控

- 崩溃监测

- 安全组件

- 特点

- 坚固

- 应用加固在不改 Android 应用源代码的情况下，将针对应用各种安全缺陷的加固保护技术集成到应用 APK，从而提升应用的整体安全水平，力保应用不被盗版侵权

- 稳定

- 应用安全提供的安全能力可在复杂环境下稳定运行，兼容性高、崩溃率低；不仅支持 arm、aarch64、x86、x64，还支持 android 2.0 到 android N 等几乎全系统全机型

- 机制和原理分析：

- 乐固做了一些反调试的东西，很多情况并不是反调试越厉害加固就越好

- 乐固仍然是常规规的函数调用和返回方式，流程清晰很多

- 腾讯云 移动应用安全 购买指南 产品文档

- 加壳 保护 功能

- 反编译保护

- DEX 反编译保护

- 壳加密算法保护

- AndroidManifest.xml 防篡改

- DEX 文件整体加固保护

- DEX 虚拟化加固(VMP)

- SO 反编译保护

- SO 库加壳保护

- SO 库内存动态清除

- SO 库与应用绑定保护

- 高级 SO 混淆保护

- SO 库字符串加密

- 防篡改保护

- APK 防篡改保护

- APK 防二次打包保护

- APK 签名文件校验保护

- 源代码防篡改保护

- DEX 文件防篡改

- SO 库防篡改

- 资源防篡改保护

- assets 资源防篡改

- res 资源防篡改

- raw 资源防篡改

- 配置文件防篡改

- 防调试保护

- 防调试保护

- 防模拟器保护

- 加固壳防动态调试

- 防线程动态调试保护

- 防进程动态调试保护

- 防 JDWP 调试

- 防注入保护

- 防内存 dump 保护

- 防内存数据读取

- 防内存数据修改

- 数据与资源保护

- 资源防窃取保护

- assets 资源防窃取

- res 资源防窃取

- raw 资源防窃取

- SSL 证书防窃取

- 本地数据保护

- 本地 databases 目录数据库文件加密

- 防日志泄漏

- 应用防截屏/录屏

网易易盾

- 网易易盾

- 主页：Android应用加固APK加固防篡改APP加固网易易盾

- 产品介绍

- 防逆向

- 多重指令转换VMP虚拟机保护技术，对关键代码、核心逻辑进行加密保护，避免通过IDA，Readelf等逆向工具分析获取源码

- 防篡改

- 对APP应用每个文件分配唯一识别指纹，替换任何一个文件会导致无法运行，防止广告病毒植入、二次打包、功能屏蔽等恶意破解

- 防调试

- 多重加密技术防止代码注入，防止JAVA层/C层动态调试，可有效抵挡动态调试、内存DUMP、代码注入、HOOK等恶意攻击

- 数据保护

- 提供安全键盘、通讯协议加密、数据存储加密、异常进程动态跟踪等功能技术，在各个环节有效阻止数据被捕获、劫持和篡改

- 功能介绍

- DEX安全保护

- VMP虚拟机保护

- Java2C保护

- DEX函数抽取加密

- SO库加密保护

- SO代码高级加密

- SO函数动态加密

- 防HOOK攻击

- 防脱壳

- 资源文件加密

- assets资源文件加密

- H5文件加密

- XML配置文件保护

- 防调试

- 防动态调试

- 防内存DUMP

- 防动态注入

- 数据保护

- 日志防泄露

- 防截屏保护

- 数据文件加密

- 应用场景

- 应用程序被破解

- 核心代码被窃取

- 恶意代码注入

- 核心数据泄露

- 安全检测未合规

- 核心优势

- 高安全性

- 加固强度高，有效对抗多种反编译逆向工具，防止APP被破解剽窃

- 高兼容性

- 支持arm、x86及64位多种CPU架构，完美支持Android4.0到最新系统

- 高稳定性

- 积累丰富的网易内部APP服务经验，加固后性能几乎无影响

- 极速便捷

- 提供工具和命令行操作，编译、加壳一体化快速完成

- 灵活定制

- 提供多种加固项和定制加固服务，自由选取灵活定制，满足不同行业需求

- 国际认证

- 拥有ISO27001、CSA-STAR国际权威标准认证，安全合规双重保障

爱加密

- http://ijiami.cn

- 移动应用安全加固

- 安卓：http://ijiami.cn/android

- 核心技术

- 防逆向

- 通过DEX加花和加壳、SO文件高级混淆和加壳等技术对DEX和SO文件进行保护，防止被IDA等逆向工具分析

- 防调试

- 多重加密技术防止代码注入，防JAVA层/C层动态调试、防代码注入和防HOOK攻击

- 页面数据防护

- 应用防劫持、应用防截屏、虚拟键盘SDK产品和技术，防界面劫持插件对组件进行全方位监听

- 防篡改

- 在加固时提取APP内各文件的文件特征值，当文件运行时，系统解密加密文件提取特征值进行文件校验

- 数据防泄漏

- 使用多种加密算法，包括国际通用算法及自主研发的加密算法等，保护本地数据

- 传输数据防护

- 在客户端和服务器分别嵌入数据加密SDK，保证通道中传输的数据为高强度加密后的数据

- 主要功能

- 概述

- 提升APP安全性

- 源代码保护、SO库保护、DEX 文件保护、数据加密保护

- 确保APP业务安全

- 防盗版保护、防纂改、页面防劫持技术、防截屏技术、 环境清场、短信防劫持

- 保障APP数据安全

- 密钥白盒技术、APP通讯链路加密、数据本地加密技术、安全键盘

- 确保APP的整体优化

- APP包体大小不超过原包“±5%”、全面的兼容性测试、全面的性能测试

- 功能点

- 防逆向

- DEX整体加密保护

- DEX代码分离保护

- DEX混合加密保护

- DEX VMP保护

- 双重VMP保护

- Java2CPP

- SO加壳

- SO Linker

- SO防调用

- SO VMP

- 防篡改

- DEX文件防篡改

- SO库文件防篡改

- H5文件防篡改

- 资源文件防篡改

- 资源文件加密

- 签名保护

- 防调试

- 防动态调试

- 防内存代码注入

- 防模拟器

- 防加速器

- 数据防泄漏

- 防内存数据读取

- 防内存数据修改

- 防日志泄漏

- 本地sharepferences数据加密

- 本地SQLite数据加密

- 页面数据防护

- 防劫持

- 防截屏

- 安全键盘SDK

- 传输数据防护

- 通信协议加密SDK

- 密钥白盒

- 产品优势

- 最新第六代高级双重VMP加密技术

- 6种加密方式满足不同用户、行业的使用需求

- 加密后包增量大小不超过原包“±5%”

- 兼容性高达99%，实现ART全面兼容

- 交付方式灵活，支持本地部署或者云部署，云部署支持私有云和公有云

- 通过密钥白盒技术实现最强的加密强度

- 获得上千家知名行业客户认可的移动安全技术方案

- iOS：http://ijiami.cn/iosProtect

- SDK：http://ijiami.cn/sdkProtection

- SO库：http://ijiami.cn/soProtect

- SO文件加壳保护

- 对SO文件进行加壳保护，加壳后使用ida工具无法看出SO库文件的导入导出函数以及定位源码，有效防止黑客反编译，解包后看到真正源码

- SO文件混淆保护

- 爱加密基于移动安全领域的先进的技术和经验，针对黑客在分析阶段的攻击手段和行为进行分析，利用SO混淆编译器，可以有效的增加黑客信息搜集的难度和复杂度，防止应用被破解，降低APP安全风险

梆梆安全

- 主页

- 梆梆安全 - 移动安全领导品牌，保护智能生活，共建智慧城市！

- 产品

- 泰固

- 移动应用安全加固

- 针对目前移动应用普遍存在的破解、篡改、盗版、钓鱼欺诈、内存调试、数据窃取等各类安全风险，梆梆安全为开发者提供全面的移动应用加固加密技术和攻击防范服务

- 核心加固技术

- 防逆向（Anti-RE）：抽取classes.dex中的所有代码，剥离敏感函数功能，混淆关键逻辑代码，整体文件深度加密加壳，防止通过apktool，dex2jar，JEB等静态工具来查看应用的Java层代码，防止通过IDA，readelf等工具对so里面的逻辑进行分析，保护native代码。

- 防篡改（Anti-tamper）：每个代码文件、资源文件、配置文件都会分配唯一识别指纹，替换任何一个文件，将会导致应用无法运行，存档替换、病毒广告植入、内购破解、功能屏蔽等恶意行为将无法实施。

- 防调试（Anti-debug）：多重加密技术防止代码注入，彻底屏蔽游戏外挂、应用辅助工具，避免钓鱼攻击、交易劫持、数据修改等调试行为。

- 防窃取（Storage Encryption）：支持存储数据加密，提供输入键盘保护、通讯协议加密、内存数据变换、异常进程动态跟踪等安防技术，有效防止针对应用动、静态数据的捕获、劫持和篡改。

- 加固服务策略

- 提供灵活多样的App加固方案

- 防逆向保护

- DEX文件加壳保护

- DEX函数抽取加密

- HTML开发框架保护

- SO文件加壳保护

- SO代码压缩及加密

- SO库设备绑定

- 源代码深度混淆

- 防篡改保护

- 开发者签名校验

- 代码、资源文件、配置文件完整性校验

- 数据透明加密及设备绑定

- 配置文件、数据库文件加密

- 视频、音频、图像等文件加密

- 防调试保护

- 防止进程/线程附加

- 防止进程注入

- 防HOOK攻击

- 防内存Dump

- App完整性保护

- SO数据动态清除

- 防窃取保护

- 本地数据文件加密

- 键盘数据加密

- 通讯协议加密

- 密钥白盒加密

- 移动应用源代码加固

- 未经混淆的源代码受到攻击后，易暴露程序中关键算法、核心业务逻辑、数据结构和模块的控制流布局等敏感内容

顶象安全

- 主页

- 顶象技术 - 金融业务安全的实践者，专注智能风控与全链路反欺诈

- 功能

- Android加固保护 - 顶象技术

- 一套纵深防御体系

- 分别从防逆向、防调试和防篡改等几个维度提供安全保护

- 同时针对每个维度提供又进行了不同层次的划分，加固策可依据实际场景进行动态调配，安全和性能达到完美平衡。

- 对APK提供DEX保护、SO保护、数据加密、资源防篡改、运行时保护等多角度全方位的保护

- 核心功能

- Dex加壳保护

- 对dex文件整体进行加密隐藏，并进行反编译保护处理

- Dex VMP保护

- 将函数方法指令翻译为自定义指令集并加密存储，在运行过程中交由顶象dex虚拟机解释执行

- SO加壳保护

- 加密隐藏SO文件中的导入导出符号表以及常量字符串，同时对SO进行反编译保护处理

- SO VMP保护

- 对二进制函数指令翻译为自定义指令集并加密存储，在运行过程中交由顶象dex虚拟机解释执行

- 特点与优势

- 平台兼容性高

- 支持ARM, ARM64, x86, x86_64, mips等多种cpu框架

- 语言支持丰富

- 支持包括Java，Kotlin，C/C++，Objective-C，Swift等在内的多种源码类型或混合型项目

- 操作流程便捷

- 把编译好的App上传并选择好加固方案即可完成整个加固流程，操作简单易懂，非技术人员也能轻松掌握

- 体积增量小

- 整体加固增量不会超过100kb，一般情况下是80kb

- 应对风险

- 程序逻辑被破解

- 核心代码被窃取

- API接口暴露

- 恶意代码注入

几维安全

- 主页

- 几维安全 - 让万物互联更安全

- 功能

- APP应用加固

- 重点

- 高效、专业、兼容好

- 5分钟极速加密，轻松集成DEX加密、反调试、防盗版等多重安全防护

- 产品简介

- 移动应用安全加固是一项面向互联网企业和个人开发者的在线加密服务， 现支持安卓应用加密，用户只需提供APK包即可快速集成防静态工具分析、Dex文件保护、So文件加壳、内存保护、反调试、防二次打包等多项安全功能。 支持对金融、手游、电商、社交等多个行业的应用做加固保护，避免核心代码被反编译， 请求协议被伪造，APK包被植入恶意代码等诸多安全问题。

- 功能特点

- Dex文件保护

- 对DEX文件进行加密保护，防止被Dex2Jar等工具逆向破解

- Dex-Java2C

- 将Java代码翻译为C代码，并实施Native层的代码混淆保护

- SO文件加壳

- 对SO文件进行整体加壳保护，防止IDA Pro等工具逆向分析

- 防二次打包

- 集成正版签名校验功能，运行时动态校验，防止被植入恶意代码

- 内存加密

- 防止内存数据被篡改或Dump，比如Dump解密后的Java代码

- 反调试

- 拒绝调试器对当前应用的附加操作，防止程序被恶意调试分析

- 自身虚拟化保护

- 专业版采用代码虚拟化技术对自身代码进行保护，防止逆向分析

- 兼容性良好

- 测试覆盖200+机型，兼容性达到99%，支持ART模式

- 应对风险

- Dex文件反编译

- So文件反编译

- 核心技术窃取

- 通信模块破解

- API接口暴露

- 密钥窃取

- 注入恶意代码

- 伪造盗版应用

- SO源码混淆保护

- 重点

- 基于NDK项目源码，通过安装NDK插件即可集成代码混淆、轻量虚拟化、字符串加密等多项高强度的安全保护

- 产品简介

- SO库源代码保护是一款离线的安全编译器工具，主要用于保护Android NDK项目中的核心代码，避免因逆向工程或破解，造成核心技术被泄漏、代码执行流程被分析等安全问题。该安全编译器和普通编译器相似，基于项目源代码可将C、C++代码编译成二进制代码，不同之处在于，安全编译器在编译的时，能够对代码进行混淆、轻量虚拟化、字符串加密等安全保护。从而避免攻击者通过IDA Pro等逆向工具反编译二进制代码，分析业务代码执行流程，进一步篡改或窃取核心技术。

阿里聚安全

- http://jaq.alibaba.com/

- 20180801已下线

- 原理分析：

- Ali 利用 SP 来储存返回地址和参数所以整个流程很混乱，基本看上去就是在各种 JUMP

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-07-01 18:34:03

安卓破解技术

安卓破解相关的叫法有很多，整理如下：

- 安卓应用的 存在形式

- 静态的

- 安装文件： apk

- 动态的

- 运行中的程序叫： app

- 安卓破解 = android crack

- 破解

- = crack = cracking

- 也叫 安卓逆向工程 = 安卓反向工程

- 而逆向工程，就像对一个人去解剖

- 针对于

- 不同的加密和安全技术

- 之前： 加固 = 安卓加固 = 安卓应用加固 = Android app hardening

- = 加壳

- 注：壳是一段保护软件不被非法修改或反编译的程序

- 破解加壳所以叫： 去壳 = 脱壳 = 反加固

- 之前正常编译( compile = compiling )出apk的过程

- 破解也常被叫： 反编译 = decompile = decompiling

- 所以相关工具往往也叫做： 反编译器 = decompiler

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

如何反混淆

背景：使用反编译工具只能看到混淆之后的代码结构，看不到混淆之前的原始的代码

而如何反混淆：

- 如果有： mapping.txt 文件

- 有机会反混淆，恢复和还原出原始代码

- 背景：

- 有安卓项目源码的开发者，在折腾ProGuard时，才有（生成）的mapping.txt文件

- 实际上：作为要破解的人，往往没有

- 如果有：源文件和行号文件

- 有机会反混淆，恢复和还原出原始代码

- 背景：

- 许多APK开发者为了在崩溃时保存源文件类名、行号等信息会在APK混淆时添加以下规则保留源文件信息

- -keepattributes SourceFile,LineNumberTable

- 实际上：作为要破解的人，往往没有

一些反混淆工具

- JEB=JEB Decompiler

- JEB2 被称为反混淆神器

- 官网：

- https://www.pnfsoftware.com/

- 一些用于反混淆的插件

- S3cuRiTy-Er1C/JebScripts: Jeb public scripts

- flankerhqd/jebPlugins: Various Jeb plugins, including obfuscation restore

- enovella/jebscripts: A set of JEB Python/Java scripts for reverse engineering Android obfuscated code

- Simplify

- CalebFenton/simplify: Generic Android Deobfuscator

举例

JEB反混淆效果

如果有了源文件和行号，则可以反混淆：

Jadx反混淆效果

比如：

详见

Jadx 如何反混淆deobfuscation

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

如何去壳脱壳

去壳 = 去掉加固的壳 = 脱壳

脱壳机制原理

- smali层：只做了一些简单的混淆

- Native 层：

- 和如下内容相关

- 各种so库

- 比如libdvm.so

- 对应着内部函数调用：

- .init

- .init_array

- JNI_Onload

- 分析修改ELF头信息

- sub_xxx函数

- 比如：sub_78614CD0

- R2寄存器

- 最后分析出：

- ClassLoader

- loadDex

- multidex

- （作者）QEver

- 写的一个IDA的脚本=一个dex脱壳脚本

- 配合kill方法，可以实现脱绝大部分运行于dalvik上的dex壳

- 可以dump导出正确的dex文件

脱壳注意事项和说明

不是所有的加固的安卓apk都能成功脱壳的。

比如，康美通的安卓apk：

- 老版本 v2.0.7 ：没有加固，可以直接用 Jadx 反编译得到源码的

- 新版本 v4.4.0 ：是 360加固保 加固的，用FDex2也无法导出 dex ，无法破解

总结出来就是：

- 没有加固 的：直接用Jadx即可导出源码

- 比如老旧的Android的apk，很多都没有加固

- 不管你怎么 混淆 都很容易被人分析得干干净净

- 部分加密不强的：可以脱壳

- 包括

- 老一代或免费的 360加固保

- 爱加密（收费）

- 娜迦加固（收费）

- 用 FDex2 可以脱壳

- 可以hook导出 dex ，再dex转 jar ，jar转 java 源码

- 腾讯乐固 ，新一代的 360加固保 ：没法脱壳

- 即使用FDex2也无法脱壳无法破解，无法得到dex文件

- 其中新一代的360加固保：用 art 模式+ dex2oat 相关机制，或许可以破解

- 后续研究

- 【未解决】用ART，oat，dex2oat相关机制去破解新一代360、腾讯等安卓apk的加固

对于使用加固方案的建议和结论

- 免费版的加固可以防止大多数只会反编译的小白

- 对于普通攻击者还是很有效果的

- 对于会用工具脱壳的，还是没太大用途的

- 除非用更加高级的，收费版的加固服务

- 估计就很难破解，很难脱壳了

- 如果真的想要彻底防止别人破解

- 除了考虑（用更高级的）加固方式

- 还要花精力在app的业务逻辑层面，权限校验等方面，防止被破解

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

如何判断哪家加固方案

通过反编译工具后，从 dex 或 jar 包的目录结构，以及相关的文件（比如 AndroidManifest.xml ）的内容，往往可以看出是哪家的加密方案：

腾讯乐固加密后的目录结构和典型内容

腾讯的 乐固legu 加密加壳后的apk，（去用 apktool ）反编译后得到的 jar 包的典型目录结构是：

- 图

- 文字

- 核心文件夹

- com

- tencent

- bugly

- legu

- crashreport

- proguard

- StubShell

- TxAppEntry

- 详细的目录结构和文件

➜  tencent ll

total 0

drwxr-xr-x  12 crifan  staff   384B  3 14 13:39 StubShell

drwxr-xr-x   3 crifan  staff    96B  3 14 13:39 bugly

➜  tencent tree .

.

├── StubShell

│   ├── SystemClassLoaderInjector.smali

│   ├── SystemInfoException.smali

│   ├── TxAppEntry.smali

│   ├── TxReceiver.smali

│   ├── XposedCheck.smali

│   ├── ZipUtil.smali

│   ├── a.smali

│   ├── b.smali

│   ├── c.smali

│   └── d.smali

└── bugly

└── legu

├── Bugly.smali

├── BuglyStrategy$a.smali

├── BuglyStrategy.smali

├── CrashModule.smali

├── a.smali

├── b.smali

├── crashreport

│   ├── BuglyHintException.smali

│   ├── BuglyLog.smali

│   ├── CrashReport$CrashHandleCallback.smali

│   ├── CrashReport$UserStrategy.smali

│   ├── CrashReport.smali

│   。。。

│   └── inner

│       └── InnerAPI.smali

└── proguard

├── a.smali

├── 。。。

└── z.smali

14 directories, 123 files

➜  lib tree .

.

├── arm64-v8a

│   ├── libBugly.so

│   ├── libgifimage.so

│   ├── libimagepipeline.so

│   ├── libjcore119.so

│   ├── libshella-2.9.1.2.so

│   └── libstatic-webp.so

├── armeabi

│   ├── libBugly.so

│   ├── libgifimage.so

│   ├── libimagepipeline.so

│   ├── libjcore119.so

│   ├── libshella-2.9.1.2.so

│   ├── libstatic-webp.so

│   ├── mix.dex

│   └── mixz.dex

├── armeabi-v7a

│   ├── libBugly.so

│   ├── libgifimage.so

│   ├── libimagepipeline.so

│   ├── libjcore119.so

│   ├── libshella-2.9.1.2.so

│   └── libstatic-webp.so

├── 。。。

7 directories, 36 files

反编译出的 AndroidManifest.xml 内容：

<application android:allowBackup="true" android:icon="@drawable/app_logo" android:label="@string/app_name" android:name="com.tencent.StubShell.TxAppEntry" android:supportsRtl="true" android:theme="@style/AppTheme">

<meta-data android:name="TxAppEntry" android:value="com.huili.readingclub.MyApplication"/>

中有：

- android:name="com.tencent.StubShell.TxAppEntry"

- 其中有：

- com.tencent.StubShell.TxAppEntry

- <meta-data android:name="TxAppEntry"

以及，多处都可以搜到： TxAppEntry

都是典型的腾讯乐固的相关内容。

360加固保的加固的目录结构

360加固后的 apk 经过 dex2jar 反编译后的目录结构是：

- com.qihoo.util

- com.qihoo360.replugin

- com.stub

这种结构就说明是360加固保加固的。

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:45:26

如何从apk破解出java源码

下面整理，从安卓的 apk 文件，如何破解，反编译，逆向工程，得到 java 源代码。

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

破解apk概述

对于从apk破解得到java源代码，目前常见的几种思路：

- 没有加固的

- 直接一步搞定

- 用 jadx 从apk导出 java 源码

- 加固了的

- 前提

- 后续的hook能够导出dex文件

- 有些新版本的加固，比如腾讯乐固legu，新版的360加固保，无法导出dex文件

- 也就无法转换出源码

- 所用方法：内存dump法

- 从内存中导出相关dex

- 分3步

1. apk  ->  dex

2. dex  ->  jar

3. jar  ->  java

下面详细介绍如何操作。

AndroidManifest.xml

安卓中有个 AndroidManifest.xml 文件，是保存了相关项目的类，资源等配置信息。

而对于安卓的 apk 文件：

- 直接改名为 zip 后再解压：得到的二进制的 AndroidManifest.xml 文件

- 用 apktool 等工具去反编译：得到的是文本格式的 AndroidManifest.xml 文件

- 就可以看到xml的原始内容了

- 注：即使 apk 加固了，也可以用 apktool 反编译

AndroidManifest.xml的作用

得到了xml源码后，可以从其中看到很多有用的信息。

比如， 小花生安卓版 v3.6.9的 apk ，apktool反编译出的 AndroidManifest.xml 中包含：

<activity android:name="com.huili.readingclub.activity.classroom.SelfReadingActivity" android:screenOrientation="portrait"/>

...

<activity android:name="com.huili.readingclub.activity.classroom.ParentChildReadingActivity" android:screenOrientation="portrait"/>

其中的类名：

- activity.classroom.SelfReadingActivity

- activity.classroom.ParentChildReadingActivity

=类的文件名，对应了app界面：

中的：

- 自主阅读馆

- 亲子阅读馆

-》从而有利于后续分析内部的业务逻辑，了解到内部有哪些类和功能。

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

一步: apk->java

前提

- apk没有被加固

- 怎么看出是没有加固？

- 如果你用jadx打开看到的和导出的代码和目录结构都是 qihoo奇虎360 tencent腾讯乐固legu 字样的

- 那么说明就是被加固了的

- 用的是 360加固保 腾讯乐固legu 的加固方案

- 这样导出的代码也只是加固后的代码

- 不是app的自己的业务逻辑的java代码

思路

用 jadx 等工具，直接从 apk 转换出 java 源代码

准备

下载 jadx ：

从skylot/jadx: Dex to Java decompiler的releases页面下载最新版本，比如jadx-0.9.0.zip

解压得到：

- bin/jadx ：命令行版本

- bin/jadx.bat ：Windows版

- bin/jadx-gui ：带图形界面的版本

- bin/jadx-gui.bat ：Windows版

详见：反编译器 jadx

jadx命令行版

直接通过命令行去反编译，效率最高。

语法：

jadx -d output_folder your_apk_file.apk

举例：

jadx/jadx-0.9.0/bin/jadx -d from_jadx_command xiaohuasheng-v1.5.apk

jadx/jadx-0.9.0/bin/jadx -d exported_java_src mafengwo_ziyouxing.apk

jadx gui图形界面版

下面以 jadx-gui (已被我改名为 JadxGUI )为例去解释。

对于此处v1.5这种没有加固的apk：

jadx （此处指的是 jadx-gui ）打开后：

可以看到源码：

想要导出全部源码，则可以去

文件 -> 全部保存

或

文件 -> 另存为Gradle项目

即可导出全部的代码：

用VSCode打开后即可找到（希望研究的app对应的业务逻辑的）代码：

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

两步或三步: app->dex->jar->java

前提

- apk虽然被加固，但（后续）用 FDex2 等工具能够导出我们要的 dex 文件

- 这种加固方式，往往是：旧版本的360加固保等加固方案

- 如果导不出dex文件

- 则无法继续导出jar再导出java代码

- 说明加固方案往往是：

- 新版本的360加固保

- 腾讯乐固legu

思路

1. 从 apk 到 dex ：从运行中的安卓app导出dex文件

- 事先安装安卓的apk到 已root 的安卓 真机 /安卓 模拟器

- 在安卓中已经安装了 Xposed 等 Hook框架 中

- 再去 Xposed 中安装 FDex2 / DumpDex 等插件

- 用于后续导出 dex 文件

- 运行安卓app

- 自动导出我们要的 dex 文件

- 从安卓（真机/模拟器）中拷贝出刚才导出的（往往是多个） dex 文件

2. 从 dex 到 java 源码

- 一步： 比如用 jadx 支持直接从 dex 转换出 java 源代码

- 两步：

1. dex 转 jar

- 用 dex2jar 等工具从（包含了我们要的、和app业务逻辑相关的那个） dex 文件中导出 jar 文件

2. jar 转 java 源码

- 用反编译器（ CFR / Procyon / JD-GUI 等）把 jar 转换出 java 源代码

详细步骤

下面就来详细解释具体操作过程。

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

1. app导出dex

准备

- 已 root 了的安卓 4.4+  的 真机 或 模拟器

- 因为后续的 FDex2 要求 Android 4.4+

- 此处用的是： 夜神模拟器 = Nox App Player

- 去模拟安卓 4.4.2

- 夜神模拟器 已自带 root

- Hook框架

- 用于后续安装插件去导出 dex 文件

- 此处选用： XPosed框架

- 在安卓中安装 XPosed 框架

- 之前已安装 XPosed框架

- 要破解的安卓apk

- 比如 v3.4.8 的小花生的apk：

- 下载好 FDex2 的 apk

- 从这里下载到 FDex2_1.1.apk

下面以 夜神模拟器  +  XPosed框架 为例解释如何操作。

详细步骤

- 安装要破解的apk

- 把要破解的 apk 安装到 夜神安卓模拟器 中：

- 安装和激活 FDex2

- 安装 FDex2 安装到夜神模拟器中

- 去XPosed里勾选 激活 FDex2：

- 注意：

- 其会提示： XPosed模块列表已更新，重启后更改将生效

- 所以为了使 FDex2生效 ，记得去重启 XPosed 。

- 此处的版本是 1.1 ：

- FDex2 中设置要处理的app

- 然后再去打开FDex2，点击此处要破解的app：小花生

- 会提示设置成功：

- 设置保存成功，请重新打开目标软件，hook包名：com.huili.readingclub

- dex输出目录：/data/data/com.huili.readingclub

- 运行要破解的app

- 正常去打开和运行要破解的app

- 注意：

- 其实只要打开了：

- 稍等几秒，即可

- 此处内部 FDex2 已经去导出app的所有文件到对应的目录了： /data/data/com.huili.readingclub

- 但是为了更保险，此处再去：随意点击和切换页面，也点击到了要破解的页面，感觉会更好

- 拷贝出已导出的 dex 等文件

- 所以接着去对应路径

- 之前 FDex2 设置app时已提示的输出路径

- /data/data/com.huili.readingclub

- 找dex文件（和其他相关项目文件）：

- 并拷贝出来即可

最终拷贝出我们要的dex文件：

➜  v3.4.8 ll

total 81656

-rw-------  1 crifan  staff   1.1M  3 19 14:05 com.huili.readingclub1166288.dex

-rw-------  1 crifan  staff    12M  3 19 14:04 com.huili.readingclub13088280.dex

-rw-------  1 crifan  staff   1.4M  3 19 14:04 com.huili.readingclub1461452.dex

-rw-------  1 crifan  staff   187K  3 19 14:04 com.huili.readingclub191572.dex

-rw-------  1 crifan  staff   2.7M  3 19 14:04 com.huili.readingclub2847840.dex

-rw-------  1 crifan  staff   3.8M  3 19 14:04 com.huili.readingclub3986968.dex

-rw-------  1 crifan  staff   8.3M  3 19 14:04 com.huili.readingclub8725900.dex

-rw-------  1 crifan  staff   8.4M  3 19 14:04 com.huili.readingclub8825612.dex

注意和说明

如何从夜神模拟器中导出文件到Mac中

此处使用夜神模拟器自带的 文件管理器 ：

- 详细步骤：

- 先把导出的文件拷贝到共享目录

1. 勾选 /data/data/ 下面的 com.huili.readingclub

2. 切换到夜神用于和电脑共享的文件夹 /mnt/shared/Other 中去 操作  ->  粘贴选择项

- 然后会开始复制和粘贴：

3. 复制粘贴后，无法立即看到已拷贝的文件。回到上一级目录，再重新进来即可看到：

- 再去到PC（此处Mac）中找到共享根目录，并拷贝文件

- 夜神模拟器和PC的共享根目录

- Windows ：

- 据说是  C:\Users\{USERNAME}/Nox_share/Other

- Mac ：

- /Users/{用户名}/Library/Application Support/Nox App Player/Nox_share

- 举例：

- /Users/crifan/Library/Application\ Support/Nox\ App\ Player/Nox_share

- 说明：其中空格需要 \ 转义

没看到我们要导出的dex文件

1. 有时候没有看到导出文件，则可以重新多试试几次，即可。

2. 有些app（的有些版本），导出的文件中，没有我们希望的（多个dex文件中的某个）包含了app业务逻辑的dex文件

- 说明该apk采用了更加高级的加固，无法导出我们要的dex文件

- 举例：

- 比如小花生的v3.6.9导出的只有一个无效的292B的dex文件：mix.dex

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

2.1 dex转java

jadx 可以直接从 dex 导出 java 源码

下载 jadx

- 从这里下载最新版的 jadx

- 比如：

- jadx-0.9.0.zip

- 解压后得到：

- jadx ：命令行工具

- jadx-gui ：带图形界面的

- 双击即可运行

此处想要用 jadx 去从 jar 中导出代码，有两种方式：

- 用 jadx 的命令行直接导出代码

- 用 jadx-gui 查看代码，也可以再导出代码

下面详细介绍

jadx 直接导出代码

切换到要导出代码的目录，已有dex文件要导出，则可以直接运行：

语法：

bin/jadx dex_file.dex -d output_folder

举例：

jadx-0.9.0/bin/jadx dex_file.dex -d .

../../../../../../reverse_engineering/jadx/jadx-1.0.0/bin/jadx ../../apk_to_dex/com.ishowedu.child.peiyin/com.ishowedu.child.peiyin8392664.dex -d com.ishowedu.child.peiyin8392664_java

../../../../../reverse_engineering/jadx/jadx-1.0.0/bin/jadx ../dex_to_jar/com.ishowedu.child.peiyin9201516-dex2jar.jar -d .

即可转换出源代码到当前目录下，输出有：

- resources

- sources

- 有你要的源码

转换速度还是不错的。

举例

from_v3.4.8_dex /Users/crifan/dev/dev_tool/android/reverse_engineering/jadx/jadx-0.9.0/bin/jadx ../../../../../xiaohuasheng/app_hook_dump_dex/FDex2/v3.4.8/com.huili.readingclub8825612.dex -d .

...

中间很多错误

...

WARN  - Found 75 references to unknown classes

ERROR - 6 errors occurred in following nodes:

ERROR -   Method: android.support.v4.provider.FontsContractCompat.getFontFromProvider(android.content.Context, android.support.v4.provider.FontRequest, java.lang.String, android.os.CancellationSignal):android.support.v4.provider.FontsContractCompat$FontInfo[]

ERROR -   Method: cn.addapp.pickers.util.LogUtils.getTraceElement():java.lang.String

ERROR -   Method: cn.jiguang.a.a.b.c.a(android.os.Message):void

ERROR -   Method: cn.jiguang.d.b.f.a(int):boolean

ERROR -   Method: cn.jiguang.d.d.m.a(android.content.Context, boolean):java.util.List<java.io.File>

ERROR -   Method: cn.jiguang.g.e.a(java.lang.String, java.util.Map):cn.jiguang.g.e

WARN  - 2299 warnings in 454 nodes

ERROR - finished with errors

转换后：

➜  from_v3.4.8_dex ll

total 0

drwxr-xr-x   3 crifan  staff    96B  4 29 15:29 resources

drwxr-xr-x  13 crifan  staff   416B  4 29 15:30 sources

转换后的代码用VSCode去打开的效果：

jadx-gui 查看和导出代码

双击 jadx-gui 即可运行：

然后去打开对应的jar文件： com.huili.readingclub8825612-dex2jar.jar ，即可看到包含了app业务逻辑的代码结构和包名：

然后展开后可以看到详细的代码：

然后如果想要导出全部代码，则可以去：

File -> Save All

然后稍等片刻：

即可在导出的 sources 文件夹中找到你要的源码：

具体过程详见：

反编译器 Jadx

备注和说明

用 JD-GUI 打开同一个 jar 的效果

另外，用 JD-GUI 打开同一个jar的效果：

其中找到了我们之前需要的app相关的业务逻辑的代码：

/com/huili/readingclub/activity/classroom/SelfReadingActivity.class

其中 onSuccess 中就是我们希望得到的对于 J 字段解密的逻辑。

其他无效的jar转换出jar的效果

如前一步所述，从多个 dex 可以转换出多个 jar

而这些无效的、没有包含app业务逻辑的 jar ，去用一些反编译工具打开后的效果是：

其他的一些，比如腾讯乐固加密了的，最终转换出来的jar，去打开后只能看到腾讯乐固的代码：

注意事项

jadx 不能从 jar 导出 java ，否则会报错

举例：

../../../../../reverse_engineering/jadx/jadx-1.0.0/bin/jadx ../dex_to_jar/com.ishowedu.child.peiyin9201516-dex2jar.jar -d .

INFO  - loading ...

INFO  - converting to dex: com.ishowedu.child.peiyin9201516-dex2jar.jar ...

ERROR - jadx error: Error load file: ../dex_to_jar/com.ishowedu.child.peiyin9201516-dex2jar.jar

jadx.core.utils.exceptions.JadxRuntimeException: Error load file: ../dex_to_jar/com.ishowedu.child.peiyin9201516-dex2jar.jar

at jadx.api.JadxDecompiler.loadFiles(JadxDecompiler.java:138)

at jadx.api.JadxDecompiler.load(JadxDecompiler.java:102)

at jadx.cli.JadxCLI.processAndSave(JadxCLI.java:32)

at jadx.cli.JadxCLI.main(JadxCLI.java:18)

Caused by: jadx.core.utils.exceptions.DecodeException: java class to dex conversion error:

dx exception: Translation has been interrupted

at jadx.core.utils.files.InputFile.loadFromJar(InputFile.java:191)

at jadx.core.utils.files.InputFile.searchDexFiles(InputFile.java:82)

at jadx.core.utils.files.InputFile.addFilesFrom(InputFile.java:40)

at jadx.api.JadxDecompiler.loadFiles(JadxDecompiler.java:136)

... 3 common frames omitted

Caused by: jadx.core.utils.exceptions.JadxException: dx exception: Translation has been interrupted

at jadx.core.utils.files.JavaToDex.convert(JavaToDex.java:63)

at jadx.core.utils.files.InputFile.loadFromJar(InputFile.java:182)

... 6 common frames omitted

Caused by: java.lang.RuntimeException: Translation has been interrupted

at com.android.dx.command.dexer.Main.processAllFiles(Main.java:614)

at com.android.dx.command.dexer.Main.runMultiDex(Main.java:365)

at com.android.dx.command.dexer.Main.runDx(Main.java:286)

at jadx.core.utils.files.JavaToDex.convert(JavaToDex.java:49)

... 7 common frames omitted

Caused by: java.lang.InterruptedException: Too many errors

at com.android.dx.command.dexer.Main.processAllFiles(Main.java:606)

... 10 common frames omitted

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

2.2.1 dex转换出jar

思路

从前面的 app导出dex ，我们已得到：（一个或）多个dex文件，而这么多 dex ，其中只有一个是真正包含了安卓app的业务逻辑的 dex 文件。

我们后续会（经过转换和尝试而）找到该 dex ，然后用 dex2jar 等工具从 dex 转换出 jar 文件

准备

- 下载 dex2jar

- 从dex2jar的下载页面下载到最新版本的 dex2jar

- 比如：dex-tools-2.1-SNAPSHOT.zip

- 解压后得到： d2j-dex2jar.sh

详细步骤

比如前面的 v3.4.8 版本的某安卓apk，经过前面一步导出了多个 dex 文件后，此处接着去用 dex2jar 去分别转换出 jar ：

d2j-dex2jar.sh -f dex_file.dex

期间，很多个 dex 转换 jar 的期间都会报错。

经过尝试最终找到了，转换不仅不报错且转换出来的 jar 还是我们希望的有效的包含了app业务逻辑的 jar ：

➜  v3.4.8 /Users/crifan/dev/dev_tool/android/reverse_engineering/dex-tools/dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f com.huili.readingclub3986968.dex

dex2jar com.huili.readingclub3986968.dex -> ./com.huili.readingclub3986968-dex2jar.jar

➜  v3.4.8 /Users/crifan/dev/dev_tool/android/reverse_engineering/dex-tools/dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f com.huili.readingclub8825612.dex

dex2jar com.huili.readingclub8825612.dex -> ./com.huili.readingclub8825612-dex2jar.jar

经后续确定，此处：

- 从： 8.4MB 的 com.huili.readingclub8825612.dex

- 转换出的： 10MB 的 com.huili.readingclub8825612-dex2jar.jar

就是我们要的，包含了app的业务逻辑的代码。

说明和提示

apk改名zip解压得到的 classes.dex 去转换一般无法得到有效的 jar

比如之前的 v3.6.9 版本的某安卓apk，改名为 zip 再解压得到的 classes.dex ，此处用 dex2jar 去转换：

➜  classes.dex pwd

/Users/crifan/dev/dev_root/company/naturling/projects/crawl_data/小花生app/xiaohuasheng/decoded dex/v3.6.9/classes.dex

➜  classes.dex /Users/crifan/dev/dev_tool/android/reverse_engineering/dex-tools/dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f classes.dex

dex2jar classes.dex -> ./classes-dex2jar.jar

➜  classes.dex ll

total 26000

-rw-------  1 crifan  staff   212K  3 25 10:20 classes-dex2jar.jar

-rwxr-xr-x@ 1 crifan  staff    12M  1 25 17:43 classes.dex

虽然转换过程并没有报错，但是才得到200多KB的jar

-》最终经确认，其中没有包含业务逻辑代码，不是我们需要的jar，是无效的jar

多个 dex 转换 jar 的期间会报错

比如：

➜  v3.4.8 /Users/crifan/dev/dev_tool/android/reverse_engineering/dex-tools/dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f com.huili.readingclub1166288.dex

...

GLITCH: 0000 Lcom/android/internal/telephony/uicc/VoiceMailConstants;.getVoiceMailTag(Ljava/lang/String;)Ljava/lang/String; | zero-width instruction op=0xf4

Detail Error Information in File ./com.huili.readingclub1166288-error.zip

Please report this file to one of following link if possible (any one).

https://sourceforge.net/p/dex2jar/tickets/

https://bitbucket.org/pxb1988/dex2jar/issues

https://github.com/pxb1988/dex2jar/issues

dex2jar@googlegroups.com

➜  v3.4.8 /Users/crifan/dev/dev_tool/android/reverse_engineering/dex-tools/dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f com.huili.readingclub13088280.dex

...

GLITCH: 009f Lcom/tencent/bugly/legu/proguard/z;.a(Ljava/lang/Thread;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V | zero-width instruction op=0xf8

Detail Error Information in File ./com.huili.readingclub13088280-error.zip

➜  v3.4.8 /Users/crifan/dev/dev_tool/android/reverse_engineering/dex-tools/dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f com.huili.readingclub1461452.dex

...

GLITCH: 0000 Lcom/google/android/util/SmileyResources;.getSmileys()Lcom/google/android/util/AbstractMessageParser$TrieNode; | zero-width instruction op=0xf4

WARN: can't get operand(s) for sub-double/2addr, out-of-range or not initialized ?

WARN: can't get operand(s) for int-to-float, out-of-range or not initialized ?

WARN: can't get operand(s) for return-wide, out-of-range or not initialized ?

WARN: can't get operand(s) for move-exception, out-of-range or not initialized ?

WARN: can't get operand(s) for move-exception, out-of-range or not initialized ?

Detail Error Information in File ./com.huili.readingclub1461452-error.zip

➜  v3.4.8 /Users/crifan/dev/dev_tool/android/reverse_engineering/dex-tools/dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f com.huili.readingclub191572.dex

...

GLITCH: 0006 Lcom/android/okhttp/internal/tls/OkHostnameVerifier;.verifyHostName(Ljava/lang/String;Ljava/lang/String;)Z | zero-width instruction op=0xee

Detail Error Information in File ./com.huili.readingclub191572-error.zip

➜  v3.4.8 /Users/crifan/dev/dev_tool/android/reverse_engineering/dex-tools/dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f com.huili.readingclub2847840.dex

...

GLITCH: 0006 Lsun/misc/Unsafe;.unpark(Ljava/lang/Object;)V | zero-width instruction op=0xf8

Detail Error Information in File ./com.huili.readingclub2847840-error.zip

➜  v3.4.8 /Users/crifan/dev/dev_tool/android/reverse_engineering/dex-tools/dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f com.huili.readingclub8725900.dex

...

GLITCH: 0000 Landroid/widget/ZoomControls;.setOnZoomOutClickListener(Landroid/view/View$OnClickListener;)V | zero-width instruction op=0xf4

GLITCH: 0000 Landroid/widget/ZoomControls;.setZoomSpeed(J)V | zero-width instruction op=0xf4

WARN: can't get operand(s) for move-result-object, wrong position ?

WARN: can't get operand(s) for move-result-object, wrong position ?

WARN: can't get operand(s) for move-result-object, wrong position ?

WARN: can't get operand(s) for move-object/16, out-of-range or not initialized ?

WARN: can't get operand(s) for shr-int/2addr, out-of-range or not initialized ?

WARN: can't get operand(s) for move/16, out-of-range or not initialized ?

WARN: can't get operand(s) for move-result-object, wrong position ?

WARN: can't get operand(s) for move/16, out-of-range or not initialized ?

WARN: can't get operand(s) for move-result, wrong position ?

WARN: can't get operand(s) for cmpl-float, out-of-range or not initialized ?

WARN: can't get operand(s) for move-result-object, wrong position ?

WARN: can't get operand(s) for sput-boolean, out-of-range or not initialized ?

WARN: can't get operand(s) for move-result-object, wrong position ?

WARN: can't get operand(s) for move-result-object, wrong position ?

WARN: can't get operand(s) for move-result-object, wrong position ?

WARN: can't get operand(s) for move-object/from16, out-of-range or not initialized ?

WARN: can't get operand(s) for move-object/from16, out-of-range or not initialized ?

WARN: can't get operand(s) for move-object/from16, out-of-range or not initialized ?

WARN: can't get operand(s) for move-object/from16, out-of-range or not initialized ?

WARN: can't get operand(s) for move-object/from16, out-of-range or not initialized ?

WARN: can't get operand(s) for sput-boolean, out-of-range or not initialized ?

WARN: can't get operand(s) for sput-boolean, out-of-range or not initialized ?

WARN: can't get operand(s) for move-result-object, wrong position ?

WARN: can't get operand(s) for aput-char, out-of-range or not initialized ?

WARN: can't get operand(s) for mul-float, out-of-range or not initialized ?

WARN: can't get operand(s) for move-result-object, wrong position ?

WARN: can't get operand(s) for move-result-object, wrong position ?

WARN: can't get operand(s) for move-result-object, wrong position ?

WARN: can't get operand(s) for move-wide/16, out-of-range or not initialized ?

WARN: can't get operand(s) for move-result-object, wrong position ?

WARN: can't get operand(s) for mul-int/2addr, out-of-range or not initialized ?

WARN: can't get operand(s) for aput-char, out-of-range or not initialized ?

WARN: can't get operand(s) for aput-char, out-of-range or not initialized ?

WARN: can't get operand(s) for move-result-object, wrong position ?

WARN: can't get operand(s) for sput-byte, out-of-range or not initialized ?

WARN: can't get operand(s) for aget-byte, out-of-range or not initialized ?

WARN: can't get operand(s) for and-int/2addr, out-of-range or not initialized ?

WARN: can't get operand(s) for move/from16, out-of-range or not initialized ?

WARN: can't get operand(s) for iput-boolean, out-of-range or not initialized ?

WARN: can't get operand(s) for iput-boolean, out-of-range or not initialized ?

WARN: can't get operand(s) for move-result-object, wrong position ?

WARN: can't get operand(s) for cmpg-float, out-of-range or not initialized ?

Detail Error Information in File ./com.huili.readingclub8725900-error.zip

Please report this file to one of following link if possible (any one).

https://sourceforge.net/p/dex2jar/tickets/

https://bitbucket.org/pxb1988/dex2jar/issues

https://github.com/pxb1988/dex2jar/issues

dex2jar@googlegroups.com

java.util.IllegalFormatConversionException: d != java.lang.String

at java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:4302)

at java.util.Formatter$FormatSpecifier.printInteger(Formatter.java:2793)

at java.util.Formatter$FormatSpecifier.print(Formatter.java:2747)

at java.util.Formatter.format(Formatter.java:2520)

at java.util.Formatter.format(Formatter.java:2455)

at java.lang.String.format(String.java:2940)

at com.googlecode.d2j.smali.BaksmaliDumpOut.s(BaksmaliDumpOut.java:68)

at com.googlecode.d2j.smali.BaksmaliCodeDumper.visitFilledNewArrayStmt(BaksmaliCodeDumper.java:248)

at com.googlecode.d2j.node.insn.FilledNewArrayStmtNode.accept(FilledNewArrayStmtNode.java:19)

at com.googlecode.d2j.smali.BaksmaliDumper.accept(BaksmaliDumper.java:569)

at com.googlecode.d2j.smali.BaksmaliDumper.baksmaliCode(BaksmaliDumper.java:544)

at com.googlecode.d2j.smali.BaksmaliDumper.baksmaliMethod(BaksmaliDumper.java:482)

at com.googlecode.d2j.smali.BaksmaliDumper.baksmaliMethod(BaksmaliDumper.java:428)

at com.googlecode.dex2jar.tools.BaksmaliBaseDexExceptionHandler.dumpMethod(BaksmaliBaseDexExceptionHandler.java:148)

at com.googlecode.dex2jar.tools.BaksmaliBaseDexExceptionHandler.dumpTxt0(BaksmaliBaseDexExceptionHandler.java:126)

at com.googlecode.dex2jar.tools.BaksmaliBaseDexExceptionHandler.dumpZip(BaksmaliBaseDexExceptionHandler.java:135)

at com.googlecode.dex2jar.tools.BaksmaliBaseDexExceptionHandler.dump(BaksmaliBaseDexExceptionHandler.java:92)

at com.googlecode.dex2jar.tools.Dex2jarCmd.doCommandLine(Dex2jarCmd.java:120)

at com.googlecode.dex2jar.tools.BaseCmd.doMain(BaseCmd.java:290)

at com.googlecode.dex2jar.tools.Dex2jarCmd.main(Dex2jarCmd.java:33)

其中注意到：

- 如果报错，会有把错误信息导出到名为xxx-error.zip的压缩文件中。

- 比如： com.huili.readingclub2847840-error.zip

- 可供后续分析使用

- 后续经过确认，这些报错的，往往是没有包含app业务逻辑的，不是我们要的dex，所以可以忽略这些错误

上述所有的 dex 转换为 jar 之后：

➜  v3.4.8 ll

total 125288

-rw-------  1 crifan  staff   469K  3 21 09:55 com.huili.readingclub1166288-dex2jar.jar

-rw-r--r--  1 crifan  staff    14K  3 21 09:55 com.huili.readingclub1166288-error.zip

-rw-------  1 crifan  staff   1.1M  3 19 14:05 com.huili.readingclub1166288.dex

-rw-------  1 crifan  staff   121K  3 21 09:56 com.huili.readingclub13088280-dex2jar.jar

-rw-r--r--  1 crifan  staff    16K  3 21 09:56 com.huili.readingclub13088280-error.zip

-rw-------  1 crifan  staff    12M  3 19 14:04 com.huili.readingclub13088280.dex

-rw-------  1 crifan  staff   669K  3 21 09:56 com.huili.readingclub1461452-dex2jar.jar

-rw-r--r--  1 crifan  staff    25K  3 21 09:56 com.huili.readingclub1461452-error.zip

-rw-------  1 crifan  staff   1.4M  3 19 14:04 com.huili.readingclub1461452.dex

-rw-------  1 crifan  staff   103K  3 21 09:57 com.huili.readingclub191572-dex2jar.jar

-rw-r--r--  1 crifan  staff   7.0K  3 21 09:57 com.huili.readingclub191572-error.zip

-rw-------  1 crifan  staff   187K  3 19 14:04 com.huili.readingclub191572.dex

-rw-------  1 crifan  staff   1.6M  3 21 09:58 com.huili.readingclub2847840-dex2jar.jar

-rw-r--r--  1 crifan  staff    47K  3 21 09:58 com.huili.readingclub2847840-error.zip

-rw-------  1 crifan  staff   2.7M  3 19 14:04 com.huili.readingclub2847840.dex

-rw-------  1 crifan  staff   3.5M  3 21 09:59 com.huili.readingclub3986968-dex2jar.jar

-rw-------  1 crifan  staff   3.8M  3 19 14:04 com.huili.readingclub3986968.dex

-rw-------  1 crifan  staff   5.1M  3 21 10:00 com.huili.readingclub8725900-dex2jar.jar

-rw-r--r--  1 crifan  staff    68K  3 21 10:00 com.huili.readingclub8725900-error.zip

-rw-------  1 crifan  staff   8.3M  3 19 14:04 com.huili.readingclub8725900.dex

-rw-------  1 crifan  staff   9.5M  3 21 10:00 com.huili.readingclub8825612-dex2jar.jar

-rw-------  1 crifan  staff   8.4M  3 19 14:04 com.huili.readingclub8825612.dex

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 13:35:13

2.2.2 jar转换出java

准备

- 前面一步从 dex 转换得到的 jar 文件

- 选择合适的反编译器： procyon

- 用于从 jar 转换出 java 源代码

- 网上很多人提到了用的比较广的： JD-GUI

- 经过实测，基本够用，但不够完美

- 后续自己测试了多个其他的反编译器

- 最终结论如下：

- Jadx  >  Procyon  >  CFR  >  JD-GUI

- 详见：常见反编译器对比 · 安卓应用的安全和破解

- 注：此处 jadx 其实是，直接从 dex 转 java ，而其他几个反编译器是从 jar 转 java ，略有不同。请使用时稍微注意区别。

- 所以此处选用： procyon

- 关于反编译效果更好的 jadx ，详见前面章节。

详细步骤

比如用procyon反编译器从jar中导出java源码

语法：

java -jar /path/to/your/procyon-decompiler-0.5.36.jar -jar jav_file.jar -o output_folder

举例：

java -jar  /Users/crifan/dev/dev_tool/android/reverse_engineering/Procyon/procyon-decompiler-0.5.36.jar -jar ../../dex_to_jar/com.ishowedu.child.peiyin8392664-dex2jar.jar -o com.ishowedu.child.peiyin8392664_java

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

常见安卓破解工具

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

从app导出dex

下面整理关于从 运行中的安卓app 导出 dex 文件的一些 hook 工具。

这些工具，主要用途是，作为XPosed辅助插件，从运行期间的app（apk）中，导出dex文件。

具体用法详见前面章节：

1. app导出dex · 安卓应用的安全和破解

从app导出dex的文件的命名

折腾 FDex2 等工具，从运行中的app导出 dex 文件时，看到很多文件名都是类似于

com.huili.readingclub8825612.dex

对这类文件名，并没注意到有何特别。

后来从别人的帖子中，突然意识到：

这些hook工具的生成dex的代码中，对应的命名规则应该是：

packageName  +  fileSize .dex

所以此处的

com.huili.readingclub8825612.dex

对应着就是：

- packageName ： com.huili.readingclub

- fileSize ： 8825612

- = 8.4MB

- 就是dex文件本身的大小

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:43:35

FDex2

- FDex2

- 是什么：XPosed的一个插件

- 功能：用来从 运行中的安卓app 中导出 dex 文件

- 下载

- 百度网盘

- 链接: https://pan.baidu.com/s/1lTF8CN96bxWpFwv7J174lg 提取码: 3e3t

- CSDN

- 脱壳工具 FDex2-CSDN下载

如何使用FDex2

安装FDex2（这个安卓apk）

下载得到 96KB 的apk文件： FDex2_1.1.apk

先安装到安卓设备中，比如此处的Nox夜神模拟器：

Xposed中激活FDex2

再去打开 Xposed ，勾选=激活 FDex2 ：

- 注意

- 其会提示： XPosed模块列表已更新，重启后更改将生效

- 所以为了使 FDex2生效 ，记得去重启 XPosed

运行FDex2，点选要破解的app

再去打开 FDex2 ，会看到一个（当前安卓系统已安装的）app的列表：

然后点击对应的，你要破解导出dex的app，比如此处的： 小花生 。

被选中的app名字会变红色，且会弹框提示你包名和保存（导出dex文件的）路径：

设置保存成功，请重新打开目标软件，hook包名：com.huili.readingclub

dex输出目录：/data/data/com.huili.readingclub

运行要破解的app

再去点击运行被破解的app（此处的 小花生）

正常来说：只要打开了app，稍等几秒（等待FDex2内部的计算和导出保存dex文件的操作），即可完成dex的导出

比如进入了小花生的主页：

稍等几秒，即可。

但是为了更保险，此处可以去，随意点击和切换页面，感觉会更好。

去对应目录找导出dex文件

此处内部逻辑是：

FDex2 正在导出app的所有dex文件到对应的目录了： /data/data/com.huili.readingclub

后续（Nox中用 文件管理器 ）去打开对应目录，即可看到希望得到的（多个）dex文件：

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-08-19 17:11:53

DumpDex

用来从 运行中的安卓app 中导出 dex 文件的工具。

- 官网地址

- WrBug/dumpDex: 💯一款Android脱壳工具，需要xposed支持, 易开发已集成该项目

不要从DeveloperHelper下载

对于想要去下载dumpDex的话，建议去：

https://github.com/WrBug/dumpDex/releases

而不要去作者所说的，去下载

集成了DumpDex的DeveloperHelper

-> 否则我此处会导致夜神模拟器中的app运行时产生崩溃，从而无法导出想要的dex文件

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

drizzleDumper

听别人提到过，自己没用过。

- 功能

- 一款基于内存搜索的Android脱壳工具

- 可以从运行中的安卓app中，利用 ptrace机制 ，导出dex文件

- github主页

- DrizzleRisk/drizzleDumper: drizzleDumper是一款基于内存搜索的Android脱壳工具

- 机制和原理

- root设备之后，通过ptrace附加需要脱壳的apk进程，然后在脱壳的apk进程的内存中进行dex文件的特征搜索，当搜索到dex文件时，进行dex文件的内存dump

- 使用步骤

- 将 \armeabi 下的 drizzleDumper 去 push 进手机

- 进入 shell ，赋给可执行权限

- 运行 drizzleDumper [包名] [等待时间,默认为0]

- 运行需要脱壳程序

- 使用举例

$>adb push F:\drizzleDumper /data/local/tmp

$>chmod 755 drizzleDumper

$>./drizzleDumper xyz.sysorem.crackme

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:46:10

DexExtractor

- 功能

- 用于破解邦邦加密的安卓 dex 文件提取器

- github主页

- lambdalang/DexExtractor

- 使用说明

- 4.4的虚拟机 编译好了libdvm。

- 代码github上，脱梆梆的壳，别的没测试

- 把dexdump出来，然后base64解码下，然后odex2dex，没了

- system.img 有空上传

- 作者编译好的镜像文件 system.img 的下载地址

- system-arm_md5_6395c2f1451dbbed027d7293ab39a6e7.img.tar.gz

- 启动模拟器加上sdcard

- 注意

- apk没有写权限的反编译了加上write就好了

- 支持

- 梆梆加固

- 爱加密（新版本没事）

- 其他，暂时没测试

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:47:09

InDroid

- 主页

- romangol/InDroid: Dalvik vm Instrumentation OS

- 作者

- GoSSIP小组

- 功能

- 基于Dalvik VM的插桩分析框架

- 原理

- 直接修改AOSP上的Dalvik VM解释器，在解释器解释执行Dalvik字节码时，插入监控的代码，这样就可以获取到所有程序运行于Dalvik上的动态信息，如执行的指令、调用的方法信息、参数返回值、各种Java对象的数据等等。InDroid只需要修改AOSP的dalvik vm部分代码，编译之后，可直接将编译生成的新libdvm.so刷入任何AOSP支持的真机设备上

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

DexHunter

- DexHunter

- 主页

- zyq8709/DexHunter: General Automatic Unpacking Tool for Android Dex Files

- https://github.com/zyq8709/DexHunter

- 是什么：一个Android dex的通用脱壳器

- 作用：导出dex文件

- 主要思想：以AOP的模式对运行时ART和DVM进行定制

- 详细介绍

- [原创]Android dex文件通用自动脱壳器-Android安全-看雪论坛-安全社区|安全招聘|bbs.pediy.com

- https://bbs.pediy.com/thread-203776.htm

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:48:28

FART

- FART

- 是什么：ART环境下基于主动调用的自动化脱壳方案

- 特点：支持ART（新安卓的VM虚拟机）

- 基于Android 6.0实现，理论上可以移植到任何ART系统上

- FART脱壳的步骤

- 1.内存中DexFile结构体完整dex的dump

- 2.主动调用类中的每一个方法，并实现对应CodeItem的dump

- 3.通过主动调用dump下来的方法的CodeItem进行dex中被抽取的方法的修复

- 详解

- hanbinglengyue/FART: ART环境下自动化脱壳方案

- https://github.com/hanbinglengyue/FART

- [原创]FART：ART环境下基于主动调用的自动化脱壳方案-Android安全-看雪论坛-安全社区|安全招聘|bbs.pediy.com

- https://bbs.pediy.com/thread-252630.htm

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:49:03

dex转jar

此处整理一些从 dex 文件转换出 jar 文件的工具。

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

dex2jar

主页

- 官网

- dex2jar | Penetration Testing Tools

- 其他主页/镜像

- github

- pxb1988/dex2jar: Tools to work with android .dex and java .class files

- BitBucket

- https://bitbucket.org/pxb1988/dex2jar

- SourceForge

- https://sourceforge.net/p/dex2jar

- Google Code

- https://code.google.com/p/dex2jar

功能

- 用于处理 安卓 的 .dex 文件和 java 的 .class 文件的一系列的工具

- 核心和常用功能

- 从 dex 文件导出 jar 文件

- 一系列的工具，包括

- dex-reader/writer : 读写 dex （Dalvik Executable）文件

- 具有和 ASM 类似的轻量级的API接口

- d2j-dex2jar : 把 dex 文件转换为 class 文件（=jar压缩包文件= jar 包= jar 文件）

- smali/baksmali : 反汇编 dex 转换出 smali 文件,  从smali 文件中汇编出 dex 文件

- 和smali/baksmali虽然语法相同，但不太一样的是，此处支持描述中包含 "Lcom/dex2jar\t\u1234;" 这类文字描述

- 其他一些工具

- d2j-decrypt-string

用法和举例

用法：

d2j-dex2jar.sh -f apk_file.apk/dex_file.dex

即：

- 从 apk 中转换出 jar

sh dex-tools/dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f apk_to_decompile.apk

- 从 dex 中转换出 jar

sh dex-tools/dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f dex_to_decompile.dex

更详细的用法，详见前面章节

2.2.1 dex转换出jar · 安卓应用的安全和破解

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:42:28

Enjarify

- 主页

- Github

- 旧：google/enjarify

- 新：Storyyeller/enjarify

- 下载

- Releases · Storyyeller/enjarify

- 功能

- 把安卓的 Dalvik 字节码转换为Java的 字节码

- 和 dex2jar 类似

- 特点

- Google 官方开源的

- 用 Python 3 写的

- 比 dex2jar 更新且更好

- 用法

- python3 -O -m enjarify.main yourapp.apk

- 已设置好环境变量后

- enjarify yourapp.apk

- enjarify classes2.dex

- enjarify yourapp.apk -o yourapp.jar

为何不用 dex2jar ?

- dex2jar

- 比较旧了

- 大部分情况是转换没问题

- 但是

- 有时候

- 模糊特性时

- 边缘情况时

- 转换

- 会报错

- 甚至不报错但生成的是错误的结果

- Enjarify

- 最新设计的工具

- 支持绝大多数（尽可能多的）情况

- 包括有些dex2jar会出错的情况

- 且额外支持

- Unicode的类名

- 用作多种类型的常量

- 隐式转换

- 正常执行流程中的异常处理

- 引用了非常多的常量的类

- 名字非常长的方法

- 捕获函数后的异常处理

- 错误类型的静态初始变量

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

Dedexer

- 主页

- Dedexer user's manual

- 下载

- dedexer - Browse Files at SourceForge.net

- 作用

- 把dex转换为类似于汇编的格式

- 目的：从dex文件创建类似于Jasmin的源代码

- 用法

- java -jar ddx.jar -o -D -d <destination directory>  <source>

- java -jar ddx1.5.jar -o -D -d c:\dex\gen c:\dex\classes.dex

- 举例

D:\WINDOWS\system32>

java -jar ddx1.5.jar -o -D -d c:\dex\gen c:\dex\classes.dex

Processing com/eoeandroid/market/MarketActivity$2

Processing com/eoeandroid/market/MarketActivity$1

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

反编译器

此处主要讨论java反编译器，更主要是的和安卓相关的java的反编译器，其中尤其涉及到dex转出jar包后的，如何从jar包反编译出java源代码的相关反编译器。

作用

- 从 jar文件 = jar包 转换出 java源代码

- 用于

- 在GUI图形界面工具中查看java代码

- 命令行工具中直接导出整个项目所有的java代码文件

总体结论

- 网上目前提到的最多的要数： JD-GUI

- 自己的经验和心得

- JD-GUI 不太够用：

- 有些文件转换会出错

- 且代码逻辑也不够清晰

- 目前自己

- 以后尽量用 Jadx

- 特点

- 代码转换不仅不出错

- 关键是代码逻辑更加清晰和易懂

- 大大提升代码质量，使得代码更加易读

- 用来

- 直接用jadx打开未加固的apk

- 即可查看和导出java源代码

- 打开（用FDex2从加固了的apk导出的）dex文件

- 查看和导出java源代码

- 其次考虑用： Procyon

- 或基于Procyon的GUI工具： Luyten

- 特点

- 代码转换不出错的

- 用来

- 查看代码：用基于Procyon的Luyten去查看代码

- 导出代码：用Procyon去从jar反编译转换出java源代码

常用安卓相关java反编译器

网上有很多安卓相关的java反编译器，大致整理如下：

- 比较老旧的

- Jad

- 不再维护了，源码仓库已关闭

- 不支持Java 5+

- Java DeObfuscator

- https://sourceforge.net/projects/jdo/

- JDO is a Java DeObfuscator that works on class files directly. JDO contains a simple and easy to use GUI that makes automatic deobfuscation of Java projects a one-click operation!

- JODE

- http://jode.sourceforge.net/

- a java package containing a decompiler and an optimizer for Java. This package is freely available under the GNU GPL. It hasn’t been updated for quite some time.

- AndroChef

- http://www.androiddecompiler.com/

- =

- http://www.neshkov.com/ac_decompiler.html

- 只支持Windows平台

- Candle

- https://github.com/bradsdavis/candle-decompiler

- by Brad Davis, developer of JBoss Cake, is an early but promising work in progress= is far away from being feature complete

- 相对新的工具

- JD-GUI

- 官网地址：

- http://jd.benow.ca/

- -》

- http://java-decompiler.github.io

- is an Decompiler, which comes with its own GUI. All is licensed under GPLv3. Like CFR the source for the decompiler itself, is not published, but you have the right to decompile the bionaries. And the binaries are under an OpenSource-License (CFR is under the MIT-license and JD Core is under the GPLv3 license)

- 转换效果：经常会报错

- 更准确的说是：对于LINQ/DLR的树编译器产生的代码，会不支持，会报错

- -》解析后的代码中，包含/ Error / // Byte code 这种代码

- CFR

- 官网

- CFR - yet another java decompiler.

- http://www.benf.org/other/cfr/

- 特点

- 支持java 9/10/12等

- by Lee Benfield is well on its way to becoming the premier Java Decompiler. Lee and I actually work for the same company and share regression tests. We're engaged in a friendly competition to see who can deliver a better decompiler. Based on his progress thus far, there's a very good chance he will win--at least on decompiling obfuscated code :).

- Krakatau

- https://github.com/Storyyeller/Krakatau

- by Robert Grosse, written in Python, includes a robust verifier. It focuses on translating arbitrary bytecode into valid Java code, as opposed to reconstructing the original code.

- Fernflower

- https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/engine

- https://github.com/fesh0r/fernflower

- an analytical Java decompiler

- Cavaj

- https://cavaj-java-decompiler.jaleco.com/

- Procyon

- mstrobel / Procyon — Bitbucket

- https://bitbucket.org/mstrobel/procyon

- 官网使用文档

- mstrobel / Procyon / wiki / Java Decompiler — Bitbucket

- https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler

- 重点关注Java 5之后的特性支持

- 这些是其他很多反编译工具不支持的，会报错的

- 更详细的解释

- 枚举声明

- 枚举和字符串的switch表达式

- 目前只测试支持javac 1.7

- 局部类Local classes

- 匿名和带名字的都支持

- 注解/标注Annotations

- Java 8的Lambdas和方法引用(比如 :: 操作符)

- -》对很多人了来说，比较关注：支持java8

- Procyon本身是命令行工具

- 基于Procyon的带GUI图形界面的工具

- SecureTeam Java Decompiler

- http://www.secureteam.net/Java-Decompiler.aspx

- A JavaFX-based decompiler front-end with fast and convenient code navigation. Download it, or launch it directly from your browser.

- Luyten

- https://github.com/deathmarine/Luyten

- An open source front-end by deathmarine

- Bytecode Viewer

- https://github.com/Konloch/bytecode-viewer

- -》

- https://bytecodeviewer.com

- an open source Java decompilation, disassembly, and debugging suite by @Konloch. It can produce decompiled sources from several modern Java decompilers, including Procyon, CFR, and FernFlower.

- Helios

- https://github.com/samczsun/Helios

- similar to Bytecode Viewer. But is a completely new and independent project, which uses SWT instead of Swing.

- Enigma

- http://www.cuchazinteractive.com/enigma/

- Originally used to deobfuscate Minecraft versions. Uses Procyon internally.

- 作者已不再维护

- Jadx

- 也支持从jar查看java代码

- 和导出全部代码

- 导出方式还有2种

- 保存全部代码

- 和以Gradle的方式导出源码

- 如果打开的是apk文件

- 则导出了dex对应的java源码外，还有assets等资源和其他文件

- -》更加利于你得到更接近apk的原始代码的项目结构

- 同时还支持直接打开apk

- 查看apk中的各种文件

- 包括java源代码

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

常见反编译器对比

下面就去对比常见的安卓的java反编译器的效果和优缺点。

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:49:47

JD-GUI  vs (基于 Procyon 的) Luyten

对比项

JD-GUI

Luyten

流行程度

比较广->大家用的比较多

一般->相对使用的人不是很多

jar转java的准确率

高

->jd-gui代码转换出错Error

很高

->Luyten中可正确解析显示源码：

显示：整体UI界面和代码高亮

比较简单和朴素->不够炫酷和好看

好看，而且支持多种语法高亮效果 -> 更方便看代码

显示：包/类的显示结构

以目录的树状结构显示的 -> 层次比较清晰

（默认）平铺直叙，直接显示的 ->层次结构不够清晰

后记：

后来发现，把默认勾选的选项  Operation ->  Package Explorer Style  取消勾选，也可以按照树状显示类和包名了：

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:45:53

JD-GUI  vs  CFR  vs  Procyon  vs  Jadx

对于同一个jar包： com.huili.readingclub.jar

用不同工具：

- JD-GUI

- CFR

- Procyon

- Jadx

去导出java源代码后，转换导出的效果，尤其是准确性，是否出错，是不一样的。

转换的细节是否完美

jd-gui的细节不够好的地方：

static函数：

static

{

lock = new ReentrantLock();

}

而CFR、Procyon、Jadx转换结果可以更完整：

CFR的：

static {

userTokens = new HashMap();

lock = new ReentrantLock();

condition = lock.newCondition();

}

Procyon

static {

ModelSecurity.userTokens = new HashMap<String, String>();

lock = new ReentrantLock();

condition = ModelSecurity.lock.newCondition();

}

Jadx

public class ModelSecurity {

private static final Condition condition = lock.newCondition();

private static final Lock lock = new ReentrantLock();

private static HashMap<String, String> userTokens = new HashMap();

}

很明显从：

- CFR的： userTokens = new HashMap();

- Procyon的： ModelSecurity.userTokens = new HashMap <String, String>();

- Jadx的： private static HashMap <String, String> userTokens = new HashMap();

可以看出：

- Procyon 能识别static变量，细节转换的很完美和精确

- 而 Jadx ：更进一步识别出是private的static类型的变量，更加准确。

对于细节转换的结论：

- JD-GUI ：细节不够好

- CFR ：细节基本满足要求

- Procyon ：细节完美转换

- Jadx ：不仅完美且代码变量和结构更合理

转换是否出错及代码逻辑清晰度

getToken函数转换效果

比如： com.huili.readingclub.model.ModelSecurity 的 getToken

JD-GUI某函数转换报错得不到源码

都是错误代码：

/* Error */

private static String getToken(String paramString)

{

// Byte code:

//   0: aload_0

//   1: invokestatic 81    com/huili/readingclub/utils/StringUtil:isNullOrEmpty    (Ljava/lang/String;)Z

//   4: ifeq +5 -> 9

//   7: aconst_null

//   8: areturn

//   9: aload_0

//   10: invokestatic 87    java/lang/Integer:parseInt    (Ljava/lang/String;)I

//   13: iconst_1

//   14: if_icmpge +5 -> 19

//   17: aconst_null

//   18: areturn

//   19: getstatic 22    com/huili/readingclub/model/ModelSecurity:userTokens    Ljava/util/HashMap;

//   22: aload_0

......

CFR某函数转换报错但有源码

转换报错：

summary.txt

com.huili.readingclub.model.ModelSecurity

----------------------------

getToken(java.lang.String )

Loose catch block

run()

Loose catch block

代码中有报错：

/*

* WARNING - Removed back jump from a try to a catch block - possible behaviour change.

* Loose catch block

* Enabled aggressive block sorting

* Enabled unnecessary exception pruning

* Enabled aggressive exception aggregation

* Lifted jumps to return sites

*/

private static String getToken(final String string2) {

......

lock.lock();

Runnable runnable = new Runnable((String)charSequence){

......

/*

* WARNING - Removed back jump from a try to a catch block - possible behaviour change.

* Loose catch block

* Enabled aggressive block sorting

* Enabled unnecessary exception pruning

* Enabled aggressive exception aggregation

* Lifted jumps to return sites

*/

@Override

public void run() {

Throwable throwable2222;

Procyon某函数完美转换无错误：

//

// Decompiled by Procyon v0.5.34

//

private static String getToken(String s) {

if (StringUtil.isNullOrEmpty(s)) {

return null;

}

...

sb.append("AyGt7ohMR!gECZG7kiIU0IUJBII7S#N");

ModelSecurity.lock.lock();

try {

try {

new Thread(new Runnable() {

@Override

public void run() {

ModelSecurity.lock.lock();

try {

try {

final StringBuilder sb = new StringBuilder();

...

sb.append("/");

Jadx某函数完美转换外，还保持代码变量和结构更合理 -> 能识别常量定义和引用

private static String getToken(final String str) {

if (StringUtil.isNullOrEmpty(str) || Integer.parseInt(str) < 1) {

return null;

}

......

stringBuilder.append(MyConfig.SECRET_KEY);

final String md5 = StringUtil.md5(stringBuilder.toString());

lock.lock();

try {

new Thread(new Runnable() {

public void run() {

ModelSecurity.lock.lock();

try {

StringBuilder stringBuilder = new StringBuilder();

...

stringBuilder.append(HttpUtils.PATHS_SEPARATOR);

其中包括 stringBuilder.append 的参数是

常量定义 MyConfig.SECRET_KEY

而不是之前代码的常量的值：

"AyGt7ohMR!gECZG7kiIU0IUJBII7S#N"

getMD5Str 的 char 的 list 转换效果

另外，再去对比：

Jadx导出的代码的逻辑和结构，非常清晰：

char的list很清楚，以及赋值语句：

cArr2[i] = cArr[(b >> 4) & 15];

也容易看懂

public static final String getMD5Str(String str) {

char[] cArr = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

try {

byte[] bytes = str.getBytes();

MessageDigest instance = MessageDigest.getInstance("MD5");

instance.update(bytes);

char[] cArr2 = new char[(r1 * 2)];

int i = 0;

for (byte b : instance.digest()) {

int i2 = i + 1;

cArr2[i] = cArr[(b >> 4) & 15];

i = i2 + 1;

cArr2[i2] = cArr[b & 15];

}

return new String(cArr2);

} catch (Exception unused) {

return null;

}

}

而不是像：

Procyon（的Luyten）的代码：

public static final String getMD5Str(final String s) {

final char[] array2;

final char[] array = array2 = new char[16];

array2[0] = '0';

array2[1] = '1';

array2[2] = '2';

array2[3] = '3';

array2[4] = '4';

array2[5] = '5';

array2[6] = '6';

array2[7] = '7';

array2[8] = '8';

array2[9] = '9';

array2[10] = 'a';

array2[11] = 'b';

array2[12] = 'c';

array2[13] = 'd';

array2[14] = 'e';

array2[15] = 'f';

try {

final byte[] bytes = s.getBytes();

final MessageDigest instance = MessageDigest.getInstance("MD5");

instance.update(bytes);

final byte[] digest = instance.digest();

final int length = digest.length;

final char[] array3 = new char[length * 2];

int i = 0;

int n = 0;

while (i < length) {

final byte b = digest[i];

final int n2 = n + 1;

array3[n] = array[b >> 4 & 0xF];

n = n2 + 1;

array3[n2] = array[b & 0xF];

++i;

}

return new String(array3);

}

catch (Exception ex) {

return null;

}

}

作为一个char的list，还是没有清晰的表达出来

更不像是CFR的：

public static final String getMD5Str(String object) {

char[] arrc;

char[] arrc2 = arrc = new char[16];

arrc2[0] = 48;

arrc2[1] = 49;

arrc2[2] = 50;

arrc2[3] = 51;

arrc2[4] = 52;

arrc2[5] = 53;

arrc2[6] = 54;

arrc2[7] = 55;

arrc2[8] = 56;

arrc2[9] = 57;

arrc2[10] = 97;

arrc2[11] = 98;

arrc2[12] = 99;

arrc2[13] = 100;

arrc2[14] = 101;

arrc2[15] = 102;

object = object.getBytes();

char[] arrc3 = MessageDigest.getInstance("MD5");

arrc3.update((byte[])object);

object = arrc3.digest();

int n2 = ((byte[])object).length;

arrc3 = new char[n2 * 2];

int n3 = 0;

for (int i2 = 0; i2 < n2; ++i2) {

byte by = object[i2];

int n4 = n3 + 1;

arrc3[n3] = arrc[by >> 4 & 15];

n3 = n4 + 1;

arrc3[n4] = arrc[by & 15];

}

try {

object = new String(arrc3);

return object;

}

catch (Exception exception) {

return null;

}

}

连char的list都不够明显，只是char的int数值。

更更不像是 JD-GUI 导出的源码：

public static final String getMD5Str(String paramString)

{

char[] arrayOfChar = new char[16];

char[] tmp6_5 = arrayOfChar;

tmp6_5[0] = 48;

char[] tmp12_6 = tmp6_5;

tmp12_6[1] = 49;

char[] tmp18_12 = tmp12_6;

tmp18_12[2] = 50;

char[] tmp24_18 = tmp18_12;

tmp24_18[3] = 51;

char[] tmp30_24 = tmp24_18;

tmp30_24[4] = 52;

char[] tmp36_30 = tmp30_24;

tmp36_30[5] = 53;

char[] tmp42_36 = tmp36_30;

tmp42_36[6] = 54;

char[] tmp49_42 = tmp42_36;

tmp49_42[7] = 55;

char[] tmp56_49 = tmp49_42;

tmp56_49[8] = 56;

char[] tmp63_56 = tmp56_49;

tmp63_56[9] = 57;

char[] tmp70_63 = tmp63_56;

tmp70_63[10] = 97;

char[] tmp77_70 = tmp70_63;

tmp77_70[11] = 98;

char[] tmp84_77 = tmp77_70;

tmp84_77[12] = 99;

char[] tmp91_84 = tmp84_77;

tmp91_84[13] = 100;

char[] tmp98_91 = tmp91_84;

tmp98_91[14] = 101;

char[] tmp105_98 = tmp98_91;

tmp105_98[15] = 102;

tmp105_98;

try

{

paramString = paramString.getBytes();

Object localObject = MessageDigest.getInstance("MD5");

((MessageDigest)localObject).update(paramString);

paramString = ((MessageDigest)localObject).digest();

int i = paramString.length;

localObject = new char[i * 2];

int j = 0;

int k = 0;

while (j < i)

{

int m = paramString[j];

int n = k + 1;

localObject[k] = ((char)arrayOfChar[(m >> 4 & 0xF)]);

k = n + 1;

localObject[n] = ((char)arrayOfChar[(m & 0xF)]);

j++;

}

paramString = new String((char[])localObject);

return paramString;

}

catch (Exception paramString) {}

return null;

}

连char的list不仅不够明显，不仅只是char的int数值，而且还有多余的赋值，影响代码逻辑的理解，以及对应的数据赋值：

localObject[k] = ((char)arrayOfChar[(m >> 4 & 0xF)]);

都很晦涩难懂。

对于几种反编译抓换代码的出错程度和代码逻辑是否完美的结论是

- JD-GUI ：某函数转换报错得不到源码

- CFR ：某函数转换报错但有源码

- Procyon ：某函数完美转换无错误

- Jadx ：某函数完美转换外还能识别常量定义和代码结构更清晰

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:42:02

总结和结论

JD-GUI  vs  CFR  vs  Procyon  vs  Jadx  对比总结

下面从整体总结和对比这几个反编译的反编译的效果：

java反编译器

JD-GUI

CFR

Procyon

Jadx

转换出错程度

比较多

少许

很少

极少

出错状态和相关信息

会显示： /* Error */ // Byte code

输出转换期间出错的地方到文件： summary.txt

会显示：

This method could not be decompiled.

Original Bytecode

转换出的代码的质量

不是很好，细节不够好

部分细节转换的略有瑕疵

但是还是可以看到基本代码逻辑的

完美转换细节

代码中字符数组定义等内容可以正确转换，但是逻辑不清晰

比如只是能转换出常量解析后的字符串值，而无法识别出是常量的引用

不仅转换完美无错，而且代码逻辑更准确和完整

代码中的常量的引用都能完美还原出来

代码中字符数组定义等内容可以完美转换

转换出的文件是否有标识

无

有，顶部有标识：

Decompiled with CFR 0.141

并且还能列出具体出错的类：

Could not load the following classes

有，顶部有标识：

Decompiled by Procyon v0.5.34

无

所以最终结论就是：

- 以后尽量用 Jadx

- 直接用jadx打开未加固的apk

- 即可查看和导出java源代码

- 打开（用FDex2从加固了的apk导出的）dex文件

- 查看和导出java源代码

- 其次考虑用 Procyon （或基于Procyon的GUI工具 Luyten ）

- 查看代码：用基于Procyon的 Luyten 去查看代码

- 导出代码：用Procyon去从jar反编译转换出java源代码

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:41:28

常见反编译器

下面整理一些安卓相关的反编译器。

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

jadx

- 主页

- skylot/jadx: Dex to Java decompiler

- 功能

- 从 dex 或 apk 文件中转换出 java 源代码的反编译器

- 两种模式/版本

- 命令行 版本= command line version ： jadx

- 图形界面 版本= GUI = graphical version ： jadx-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使用说明

命令行： jadx

- 命令行： jadx

- 处理 apk 文件

- 语法

jadx -d output_folder your_apk_file.apk

- 举例

jadx/jadx-0.9.0/bin/jadx -d from_jadx_command xiaohuasheng-v1.5.apk

jadx/jadx-0.9.0/bin/jadx -d exported_java_src mafengwo_ziyouxing.apk

- 详见

- 一步: apk->java · 安卓应用的安全和破解

- 处理 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

- 详见：

- 2.1 dex转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的内存

就是典型的： 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 线程处理，反编译等速度会比较快

- 线程数减少后，反编译等速度可能会有所影响

说明：

- 一般反编译小的不复杂的 apk 或 dex ，不会遇到 OOM 问题

- 反编译比较大型的，比较复杂的 apk 或 dex ，才可能会遇到 OOM

- 比如之前 用jadx反编译马蜂窝 遇到了 OOM

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-08-18 15:52:43

CFR

- CFR = Class File Reader

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

JD-GUI

- 主页

- Java Decompiler

- JD Project=Java Decompiler project

- JD-Core

- 是什么： 一个库

- 功能：从一个或多个.class文件中重构java源代码

- 用途：

- 可用于恢复丢失的源代码

- 可用于查看jar包的java源码=查看JRE（Java运行时）库的源码

- 特点：

- java 5中最新的功能

- 注释annotations

- generics 或 枚举类

- 说明：

- JD-GUI内置包含了JD-Core

- JD-Eclipse内置包含了JD-Core

- JD-GUI

- 是什么：一个独立的带图形界面的 程序

- 作用：显示查看jar包的java源代码

- 注： jar包 =内部包含了很多 .class 文件的，被压缩打包成 jar

- 举例

- github主页

- java-decompiler/jd-gui: A standalone Java Decompiler GUI

- 下载

- http://java-decompiler.github.io

- -》

- Releases · java-decompiler/jd-gui

- -》

- 比如：

- Mac ：

- jd-gui-osx-1.4.1.tar

- 插件

- JD-Eclipse：Eclipse的插件

- 举例：

- JD-IntelliJ：IntelliJ IDEA的插件

- 举例：

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

Procyon

- bitbucket官网

- mstrobel / Procyon — Bitbucket

Luyten vs Procyon

从jar包导出代码：

- Luyten

- 带GUI图形界面：可直接查看代码

- 也可用来Save all导出全部代码

- 但是速度比较慢

- 当代码很大时：几十分钟还没导出完毕

- Procyon

- 不带界面，只是一个jar包：

- procyon-decompiler-0.5.34.jar

- 可直接用来从你的jar包导出源码

- 当代码很大时：速度很快，1分钟左右即可搞定

用Procyon从jar导出java源码

下面介绍用Procyon作为命令行工具去导出一个jar包文件为java源代码的过程：

下载Procyon的jar包

比如 procyon-decompiler-0.5.34.jar

用procyon的jar包从你的jar包转换出java代码

语法：

java -jar /path/to/procyon-decompiler-0.5.34.jar -jar your_to_decompile.jar -o outputFolderName

举例：

java -jar  /Users/crifan/dev/dev_tool/android/reverse_engineering/Procyon/procyon-decompiler-0.5.34.jar -jar com.huili.readingclub8825612-dex2jar.jar -o com.huili.readingclub8825612

java -jar  /Users/crifan/dev/dev_tool/android/reverse_engineering/Procyon/procyon-decompiler-0.5.36.jar -jar ../../dex_to_jar/com.ishowedu.child.peiyin8392664-dex2jar.jar -o com.ishowedu.child.peiyin8392664_java

基于 Procyon 的 Luyten 中的菜单中参数是来自 procyon-decompiler 命令行的参数

从 procyon-decompiler 的help帮助信息是：

procyon-decompiler -?

Usage: <main class> [options] <type names or class/jar files>

Options:

-b, --bytecode-ast

Output Bytecode AST instead of Java.

Default: false

-ci, --collapse-imports

Collapse multiple imports from the same package into a single wildcard

import.

Default: false

-cp, --constant-pool

Includes the constant pool when displaying raw bytecode (unnecessary with

-v).

Default: false

-dl, --debug-line-numbers

For debugging, show Java line numbers as inline comments (implies -ln;

requires -o).

Default: false

--disable-foreach

Disable 'for each' loop transforms.

Default: false

-eml, --eager-method-loading

Enable eager loading of method bodies (may speed up decompilation of

larger archives).

Default: false

-ent, --exclude-nested

Exclude nested types when decompiling their enclosing types.

Default: false

-ei, --explicit-imports

[DEPRECATED] Explicit imports are now enabled by default.  This option

will be removed in a future release.

Default: false

-eta, --explicit-type-arguments

Always print type arguments to generic methods.

Default: false

-fsb, --flatten-switch-blocks

Drop the braces statements around switch sections when possible.

Default: false

-fq, --force-qualified-references

Force fully qualified type and member references in Java output.

Default: false

-?, --help

Display this usage information and exit.

Default: false

-jar, --jar-file

[DEPRECATED] Decompile all classes in the specified jar file (disables

-ent and -s).

-lc, --light

Use a color scheme designed for consoles with light background colors.

Default: false

-lv, --local-variables

Includes the local variable tables when displaying raw bytecode

(unnecessary with -v).

Default: false

-ll, --log-level

Set the level of log verbosity (0-3).  Level 0 disables logging.

Default: 0

-mv, --merge-variables

Attempt to merge as many variables as possible.  This may lead to fewer

declarations, but at the expense of inlining and useful naming.  This feature is

experimental and may be removed or become the standard behavior in future releases.

Default: false

-o, --output-directory

Write decompiled results to specified directory instead of the console.

-r, --raw-bytecode

Output Raw Bytecode instead of Java (to control the level of detail, see:

-cp, -lv, -ta, -v).

Default: false

-ec, --retain-explicit-casts

Do not remove redundant explicit casts.

Default: false

-ps, --retain-pointless-switches

Do not lift the contents of switches having only a default label.

Default: false

-ss, --show-synthetic

Show synthetic (compiler-generated) members.

Default: false

-sm, --simplify-member-references

Simplify type-qualified member references in Java output [EXPERIMENTAL].

Default: false

-sl, --stretch-lines

Stretch Java lines to match original line numbers (only in combination

with -o) [EXPERIMENTAL].

Default: false

-ta, --type-attributes

Includes type attributes when displaying raw bytecode (unnecessary with

-v).

Default: false

--unicode

Enable Unicode output (printable non-ASCII characters will not be

escaped).

Default: false

-u, --unoptimized

Show unoptimized code (only in combination with -b).

Default: false

-v, --verbose

Includes more detailed output depending on the output language (currently

only supported for raw bytecode).

Default: false

--version

Display the decompiler version and exit.

Default: false

-ln, --with-line-numbers

Include line numbers in raw bytecode mode; supports Java mode with -o

only.

Default: false

从这些支持的参数中，可以推断：

基于 Procyon 的 Luyten 中的菜单中的选项，都是对应着这些参数的。

比如： Settings -> Flatten Switch Blocks

对应着此处参数 --flatten-switch-blocks ：

-fsb, --flatten-switch-blocks

Drop the braces statements around switch sections when possible.

Default: false

其他以此类推，都是一样的逻辑：把命令行工具的参数，用菜单选项的形式展示和支持出来了。

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:41:13

Luyten

- 主页

- deathmarine/Luyten: An Open Source Java Decompiler Gui for Procyon

- 功能

- Java Decompiler Gui for Procyon

- 基于Procyon的带图形界面的Java反编译器

- 界面

- 下载

- Release Luyten v0.5.4 · deathmarine/Luyten

Luyten的语法高亮的不同主题的效果

- 默认：Default = Default-Alt

- Dark

- Eclipse

- Visual Studio

- IntelliJ

下载和使用Luyten去查看和导出java代码

去Releases · deathmarine/Luyten下载最新版本，比如Mac版的：

luyten-OSX-0.5.4.zip

解压得到 Luyten.app ：

运行后：

然后去把 jar 包拖进来即可看到代码：

导出所有代码的步骤：

File -> Save All -> decompiled-xxx.zip

解压后，即可用VSCode等工具方便查看代码了。

之前 JD-GUI 、 CFR 等工具转换出错的代码，此处是可以正确解析的：

但是也还是有部分代码无法正确解析：

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

Krakatau

- 主页

- Storyyeller/Krakatau: Java decompiler, assembler, and disassembler

- 功能

- java的反编译器、汇编器、反汇编器

- 如果要java反编译：则需要安装Java JDK

- 如果不需要java反编译，只是汇编和反汇编，则可以不用安装Java JDK

- 但是为了更好的测试结果，最好安装Java JDK

- 特点

- 全部是 Python 写的

- 支持 Java 10

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

Fernflower

- 主页

- 官网

- intellij-community/plugins/java-decompiler/engine at master · JetBrains/intellij-community

- 非官方 GitHub

- fesh0r/fernflower: Unofficial mirror of FernFlower Java decompiler (All pulls should be submitted upstream)

- 功能

- Java的反编译器

- 从Java的 class 反编译出java 源代码

- 说明

- IntelliJ IDEA 内置

- 用法

java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>

- 举例

java -jar fernflower.jar -hes=0 -hdc=0 c:\Temp\binary\ -e=c:\Java\rt.jar c:\Temp\source\

java -jar fernflower.jar -dgs=1 c:\Temp\binary\library.jar c:\Temp\binary\Boot.class c:\Temp\source\

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:43:46

GDA

- GDA = GJoy Dex Analysizer =GDA反编译器

- 主页

- GDA主页-功能强大的交互式Android反编译分析工具

- 下载

- GDA下载 最新版

- 功能

- 一款强大而轻便的交互式反编译器，也是一款综合性逆向分析利器

- 支持分析apk，dex，odex，oat类型文件

- 支持python脚本以及方法签名制作与识别

- 工具包含三个由作者独立完成的高速解析引擎

- 反编译引擎

- apk壳检测引擎

- 恶意行为检测引擎

- 再加上作者独创的使用了字节码直接转java伪代码的解析方式

- 无需转换成smali汇编后再做反编译

- 大大提升了解析速度

- 特点

- 无需安装java环境和android环境就可以使用

- 不是依赖其他的（很多安卓反汇编的、java的）库

- 分析速度快、体积小、内存占用少

- 截图

- GDA vs JEB

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:50:39

Dare

- 主页

- Dare Homepage

- 下载

- Dare downloads

- 功能

- 将 apk 文件反编译为Java的 class 文件

- 用法

dare -d apkoutput WeChat_462.apk

- 截图

- 输出

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:41:28

JAD

- JAD = the fast JAva Decompiler

- 主页

- Home Page of Jad - the fast Java decompiler

- 作者个人主页？：KPD Home Page

- 下载

- Download Jad

- JAD Java Decompiler Download Mirror

- 说明

- 比较老旧的反编译器，已不再更新和维护

- 不建议继续使用

- 换用最新的，比如 jadx

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

其他破解类工具

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

反汇编器

在安卓安全和破解期间，可能会涉及到，底层汇编级别的反编译，会用到相关反汇编工具和框架。

此处列出一些常见的支持（安卓的arm的） 反汇编器 = disassembler = 反汇编框架 ：

- Capstone

- 最大特点：跨平台，支持多架构，包括安卓的arm

- Capstone 支持多架构

- Arm, Arm64 (Armv8), M68K, Mips, PowerPC, Sparc, SystemZ, TMS320C64X, XCore& X86 (incl ude X86_64)

- 提供了多种语言的编程接口

- Clojure, F#, Common Lisp, Visual Basic, PHP, PowerShell, Haskell, Perl, Python, Ruby, C#, NodeJS, Java, GO, C++, OCaml, Lua, Rust, Delphi, Free Pascal

- Capstone的强大之处

- 反汇编 + 分析

- 编译成中间文本形式代码，便于调试

- 主页

- http://www.capstone-engine.org/

- https://github.com/aquynh/capstone

- 安装

- Mac

- brew install capstone

- Ubuntu

- sudo apt-get install libcapstone3

- 详见

- 安卓安全中的Capstone

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

apktool

- apktool 是啥：一个用来逆向工程第三方的二进制的安卓app的工具

- 即：逆向apk的工具

- 输入： apk 文件

- 输出：各种安卓 资源文件

- 还可以用来：

- 构建 自动化 工作 -> 取代重复的手动工作

- 比如自动编译apk等工作

- 给原有apk 添加额外东西

- 比如反编译出apk后

- 再本地化localizing

- 添加其他功能

- 分析 原有apk的功能和逻辑

- 如何安装

- Apktool - How to Install

- github主页

- iBotPeaches/Apktool: A tool for reverse engineering Android apk files

- 官网

- Apktool - A tool for reverse engineering 3rd party, closed, binary Android apps

- 官方提示

- 请不要用apktool用于盗窃破解apk

语法

- 反编译apk

apktool d apk_file.apk

举例

如何用apktool反编译某apk

下面举例说明，如何用apktool去反编译apk：

➜  apk ll

total 51280

-rw-r--r--@ 1 crifan  staff    25M  3 14 09:00 xiaohuashengv3.6.9_downcc.com.apk

➜  apk apktool d xiaohuashengv3.6.9_downcc.com.apk

I: Using Apktool 2.4.0 on xiaohuashengv3.6.9_downcc.com.apk

I: Loading resource table...

I: Decoding AndroidManifest.xml with resources...

S: WARNING: Could not write to (/Users/crifan/Library/apktool/framework), using /var/folders/46/2hjxz38n22n3ypp_5f6_p__00000gn/T/ instead...

S: Please be aware this is a volatile directory and frameworks could go missing, please utilize --frame-path if the default storage directory is unavailable

I: Loading resource table from file: /var/folders/46/2hjxz38n22n3ypp_5f6_p__00000gn/T/1.apk

I: Regular manifest package...

I: Decoding file-resources...

I: Decoding values */* XMLs...

I: Baksmaling classes.dex...

I: Copying assets and libs...

I: Copying unknown files...

I: Copying original files...

➜  apk ll

total 51280

drwxr-xr-x  12 crifan  staff   384B  3 14 13:39 xiaohuashengv3.6.9_downcc.com

-rw-r--r--@  1 crifan  staff    25M  3 14 09:00 xiaohuashengv3.6.9_downcc.com.apk

➜  apk cd xiaohuashengv3.6.9_downcc.com

➜  xiaohuashengv3.6.9_downcc.com ll

total 160

-rw-r--r--    1 crifan  staff    63K  3 14 13:39 AndroidManifest.xml

-rw-r--r--    1 crifan  staff    14K  3 14 13:39 apktool.yml

drwxr-xr-x   10 crifan  staff   320B  3 14 13:39 assets

drwxr-xr-x    8 crifan  staff   256B  3 14 13:39 kotlin

drwxr-xr-x    9 crifan  staff   288B  3 14 13:39 lib

drwxr-xr-x    3 crifan  staff    96B  3 14 13:39 libs

drwxr-xr-x    4 crifan  staff   128B  3 14 13:39 original

drwxr-xr-x  143 crifan  staff   4.5K  3 14 13:39 res

drwxr-xr-x    3 crifan  staff    96B  3 14 13:39 smali

drwxr-xr-x   10 crifan  staff   320B  3 14 13:39 unknown

得到项目目录文件：

其中有：

- 最基本的： AndroidMenifest.xml

- 但得不到我们要的 dex 文件

- 可得到：和app业务逻辑相关代码的smali文件

- 想要得到最终java源码的话

- 需要再去找 smali转java 的工具才可以

- 此处即使不去转换得到java源码

- 也可以从 smali 文件的目录结构和文件名，大概能看出app内部的类/文件名了

- 而用apktool转换apk得到smali源码，是有前提的：apk没有加固

- 加固了的apk反编译后只能看到被加固后的目录结构，看不到app业务逻辑代码和结构

- 举例：某个被腾讯乐固legu加了密的apk，反编译后看不到原始类名和目录结构，只能看到腾讯乐固的目录结构

用apktool反编译安卓版微信6.6.7

后来去从这里下载到 安卓版微信v6.6.7 ，然后去用 apktool 去反编译：

➜  apktool ./apktool d /Users/crifan/dev/dev_tool/android/apk/weixin/weixin_android_v6.6.7_minAndroid4.2.x.apk

I: Using Apktool 2.4.0 on weixin_android_v6.6.7_minAndroid4.2.x.apk

I: Loading resource table...

I: Decoding AndroidManifest.xml with resources...

S: WARNING: Could not write to (/Users/crifan/Library/apktool/framework), using /var/folders/46/2hjxz38n22n3ypp_5f6_p__00000gn/T/ instead...

S: Please be aware this is a volatile directory and frameworks could go missing, please utilize --frame-path if the default storage directory is unavailable

I: Loading resource table from file: /var/folders/46/2hjxz38n22n3ypp_5f6_p__00000gn/T/1.apk

I: Regular manifest package...

I: Decoding file-resources...

I: Decoding values */* XMLs...

I: Baksmaling classes.dex...

I: Baksmaling classes2.dex...

I: Baksmaling classes3.dex...

I: Baksmaling classes4.dex...

I: Baksmaling classes5.dex...

I: Baksmaling classes6.dex...

I: Baksmaling classes7.dex...

I: Copying assets and libs...

I: Copying unknown files...

I: Copying original files...

➜  apktool ll

total 65480

-rwxr-xr-x@  1 crifan  staff   2.3K  3 14 11:26 apktool

-rw-r--r--@  1 crifan  staff    16M  3 14 11:29 apktool.jar

-rw-r--r--@  1 crifan  staff    16M  3 14 11:29 apktool_2.4.0.jar

drwxr-xr-x  15 crifan  staff   480B  4 30 17:35 weixin_android_v6.6.7_minAndroid4.2.x

然后去看看输出的信息：

➜  apktool cd weixin_android_v6.6.7_minAndroid4.2.x

➜  weixin_android_v6.6.7_minAndroid4.2.x ll

total 440

-rw-r--r--    1 crifan  staff   202K  4 30 17:35 AndroidManifest.xml

-rw-r--r--    1 crifan  staff   8.5K  4 30 17:35 apktool.yml

drwxr-xr-x   78 crifan  staff   2.4K  4 30 17:35 assets

drwxr-xr-x    3 crifan  staff    96B  4 30 17:35 lib

drwxr-xr-x    4 crifan  staff   128B  4 30 17:35 original

drwxr-xr-x  118 crifan  staff   3.7K  4 30 17:35 res

drwxr-xr-x    8 crifan  staff   256B  4 30 17:35 smali

drwxr-xr-x    8 crifan  staff   256B  4 30 17:35 smali_classes2

drwxr-xr-x   10 crifan  staff   320B  4 30 17:35 smali_classes3

drwxr-xr-x   12 crifan  staff   384B  4 30 17:35 smali_classes4

drwxr-xr-x   10 crifan  staff   320B  4 30 17:35 smali_classes5

drwxr-xr-x   12 crifan  staff   384B  4 30 17:35 smali_classes6

drwxr-xr-x    8 crifan  staff   256B  4 30 17:35 smali_classes7

➜  weixin_android_v6.6.7_minAndroid4.2.x cat AndroidManifest.xml

➜  weixin_android_v6.6.7_minAndroid4.2.x cat apktool.yml

!!brut.androlib.meta.MetaInfo

apkFileName: weixin_android_v6.6.7_minAndroid4.2.x.apk

compressionType: false

doNotCompress:

- arsc

- png

- sec

- conf

- dat

- txt

- data

- assets/infowindow_bg.9.png

- m4a

- wav

- assets/xwalk-command-line

- jpg

- mp3

- assets/wxa_library/local/IGNORE

- r/a/w6.9.png

- apk

- r/a7/v3.9.png

...

- r/q/aa2.9.png

- r/q/emoji_grid_item_bottom.9.png

- r/q/emoji_grid_item_left.9.png

- r/q/emoji_grid_item_middle.9.png

- gif

...

- r/r/ark.9.png

- r/r/emoji_app_msg_mask.9.png

- r/r/emoji_bottombar_bg.9.png

- r/r/emoji_box.9.png

- r/r/emoji_grid_item_fg_normal.9.png

- r/r/emoji_grid_item_fg_pressed.9.png

- r/r/tenpay_keybg.9.png

- r/r/tenpay_keyitem_bottom.9.png

- r/r/v3.9.png

...

- r/z/w8.9.png

isFrameworkApk: false

packageInfo:

forcedPackageId: '127'

renameManifestPackage: null

sdkInfo:

minSdkVersion: '17'

targetSdkVersion: '23'

sharedLibrary: false

sparseResources: false

unknownFiles: {}

usesFramework:

ids:

- 1

tag: null

version: 2.4.0

versionInfo:

versionCode: '1321'

versionName: 6.6.7

可以看出一些版本方面的信息：

- minSdkVersion: '17' ：最低安卓版本 17

- 17对应：安卓  4.2 ， 4.2.2

- targetSdkVersion: '23' ：目标安卓版本 23

- 23对应：安卓  6.0

- versionName: 6.6.7 ：微信版本号  6.6.7

以及有很多的smali代码：

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:45:10

IDA

- IDA = IDA Pro

- 主页

- IDA: About

- 下载

- IDA Support: Download Center

- 注： IDA Pro 是商业收费软件，请支持和购买正版

- 功能

- 逆向工程的利器

- 支持对Android的静态分析与动态调试

- 动态调试so文件

- 截图

- 官网

- 调试安卓dex

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:48:40

radare2

- 主页

- Github

- radare/radare2: unix-like reverse engineering framework and commandline tools

- 官网

- radare

- 功能和特点

- 一个开源的逆向工程和二进制分析框架

- 功能非常强大

- 反汇编、分析数据、打补丁、比较数据、搜索、替换、虚拟化等等

- 强大的静态或动态分析、十六进制编辑以及溢出漏洞挖掘

- 具备超强的脚本加载能力

- 可以运行在几乎所有主流的平台

- GNU/Linux, Windows, *BSD, iOS, OSX, Solaris

- 组成

- 由一系列的组件构成

- rahash2 ：各种密码算法， hash算法

- rabin2 ：查看文件格式

- ragg2 / ragg2cc ：用于更方便的生成 shellcode

- rax2 ：用于数值转换

- rasm2 ：反汇编和汇编

- radiff2 ：对文件进行 diff

- radare2 ：整合了上面的工具

- 典型用途

- 参加CTF

- 逆向工程

- 漏洞挖掘

- 分析恶意软件（如溯源）

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:44:08

安卓XML破解

此处介绍安卓的xml文件的破解相关的工具。

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

AXMLPrinter2

- 主页

- GoogleCode

- android4me - Google Code

- Github

- limpoxe/android4me: Automatically exported from code.google.com/p/android4me

- 下载

- AXMLPrinter2.jar

- 作用

- 将安卓的二进制的 AXML 转换为可读的 xml 文件

- 提示

- 最近更新都是2008年，11年前的了

- 看来是很老旧的工具了

- 用法

java -jar AXMLPrinter2.jar xxx.xml output.xml

java -jar ~/dev/ApkTOOL/AXMLPrinter2.jar AndroidManifest.xml > main.xml

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:46:37

其他辅助类工具

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

二进制编辑

在安卓反编译期间，可能会涉及编辑一些二进制的文件，比如 dex 文件等。

所以也会涉及到一些二进制编辑方面的工具，整理如下：

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:43:17

010editor

- 主页

- 010 Editor - Professional Text/Hex Editor with Binary Templates

- 下载

- SweetScape Software Inc - Download 010 Editor

- 功能：

- 二进制(16进制)编辑器

- 查看和编辑二进制文件

- 用来辅助破解apk：编辑dex文件

- 截图

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:47:14

EverEdit

- 首页

- 首页 | EverEdit

- 下载

- 下载 | EverEdit

- 功能

- 专为国人设计的文本编辑器

- 身躯小巧，性能卓越，自定义功能完善，丰富的主题和脚本，完美的编码、大字符集字符显示，无论您是哪个级别的码农，EverEdit都会给您带来不一样的体验！

- 特点

- 多点编辑

- 只需要轻按一下Alt+F3，她就会替你选择所有的同名变量；或者按Ctrl+D逐个向下选择。

- 超强编码

- 准确的探测文件的编码，一软在手，万码无忧！

- Emmet/Zencoding

- 完美支持Emmet,支持Tab一键展开那一大坨代码！

- 完美Markdown

- 内置markdown的预览，实时渲染，并排放置视图，一边改一边看，智能回车键和大纲！

- 代码片段

- 用Tab或者Shift+Tab在多个编辑点之间来回跳转。同名位置的引用，也会在修改时同时发生相同的变更。

- 超大文件

- 用较少的内存异步打开巨大文件！打开文件时，不会阻塞界面而且您可以随时取消该操作！

- 二进制编辑

- 内置二进制编辑器，瞬间打开任意大小的文件。并且可以进行查找和替换。同时对找到的字符串和被修改的位置进行高亮显示。

- 文档地图

- 文档地图以缩略图的形式显示出当前文档的整体外观；您可以拖放当前区域进行滚动和定位，甚至可以完全用它替换滚动条！

- 函数列表

- 列出安当前文件内所有的符号(类、函数、变量、宏等)，每个符号都会用一个恰当图标进行标示！

- 支持平台

- Windows

- 截图

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:47:48

apk分析

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:47:53

ClassyShark

- 主页

- google/android-classyshark: Binary analysis of any Android/Java based app/APK/game

- 功能

- 单独的二进制程序

- 用来浏览和查看apk信息

- 类的接口和成员

- dex个数和依赖

- 支持输入格式

- 库

- dex

- aar

- so

- 可执行文件

- apk

- jar

- class

- 安卓二进制XML

- AndroidManifest

- 资源文件

- 布局文件

- 截图

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:49:56

APK Analyzer

- Android Studio 在 v2.2 之后自带 APK Analyzer

- 作用和功能

- (重要)直观的看到apk中各个文件的大小(比如DEX，resource等等)

- 我们可根据文件大小信息，减小apk的大小

- (重要)学习大企业app的命名规范和目录架构规范，还可以查看大公司app使用了什么技术和第三方框架

- 了解DEX文件的组成

- 快速查看APK的版本信息（例如androidmanifest.xml等也可以看到）

- 直接比较两个APK的信息，有对比才有伤害

- 下载

- Android Studio

- Download Android Studio and SDK tools

- 截图

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:49:57

SmaliViewer

- SmaliViewer = SV

- 功能

- 是一款免费的APK分析软件

- 针对Android移动智能设备应用APK文件进行逆向

- 用于对移动应用软件代码的分析

- 采用多种方法来对疑似样本进行筛选判定，如

- 证书信息

- 敏感SP号码信息

- Android Manifest的权限信息

- 函数流程图（CFG）

- 字串表，资源文件信息

- 敏感行为信息

- 动态行为

- 等等综合进行判定

- 无论从分析的深度还是广度来看，都是一款能够满足用户需求的产品，使您在APK分析的过程中，更加得心应手。

- 下载

- AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载

- SmaliViewer.Zip

- 截图

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:46:14

动态分析和调试

此处整理安卓的动态分析和调试方面的工具。

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:43:13

AndBug

- 主页

- swdunlop/AndBug: Android Debugging Library

- 作用

- 在没有源代码的情况下，调试android上的java程序

- 功能

- 支持断点、call stack查看、查看class、method等信息

- 截图

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:49:45

redexer

- 主页

- plum-umd/redexer: The Redexer binary instrumentation framework for Dalvik bytecode

- The Redexer Dalvik bytecode instrumentation platform

- 文档

- Tutorial: using redexer to implement logging in Android apps

- 功能

- Dalvik 字节码（用于安卓APP）分析框架

- 它是一套基于OCaml的实用工具

- 帮助程序员解析、操作Dalvik虚拟机

- 作者

- Redexer由来自马里兰大学帕克分校的PLUM组织开发完成

- 主要作者是：Jinseong Jeon，Kristopher Micinski以及Jeff Foster

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:46:28

Fino

- Fino = FINO

- 主页

- sysdream/fino: Android small footprint inspection tool

- 功能

- An Android Dynamic Analysis Tool

- 特点

- 资源占用少

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:49:41

其他综合类工具

下面整理一些，和安卓反编译和破解相关的一些工具。

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:42:37

ByteCode Viewer

- Bytecode Viewer = BCV

- 主页

- 官网

- Bytecode Viewer - Java & Android APK Reverse Engineering Suite/Tool

- github

- Konloch/bytecode-viewer: A Java 8 Jar & Android APK Reverse Engineering Suite (Decompiler, Editor, Debugger & More)

- 功能

- 概述：一款基于Java 8的Jar和APK的反编译工具包

- 包含反编译、编辑、调试等众多工具

- 具体包含

- 基于图形界面的：

- 轻量级的Java的字节码查看工具

- Java反编译器

- 字节码编辑器

- Smali汇编器

- Baksmali汇编器

- APK编辑器

- Dex编辑器

- APK反编译器

- Dex反编译器

- Procyon的Java反编译器

- Krakatau

- CFR的Java反编译器

- FernFlower的Java反编译器

- DEX2Jar

- Jar2DEX

- Jar-Jar

- 以及

- Hex查看器

- 代码搜索器

- 调试器

- 等等

- 还支持插件系统

- 允许你与加载的类文件进行交互

- 举例

- 你可以写一个字符串的反混淆工具，恶意代码搜索器，或者其他的一些你所能想到的东西

- 主要特性

- 在Bytecode Viewer的编译／反编译工具中集成了Krakatau

- 集成了Smali／BakSmali－现在，你可以通过smali来编辑类文件和dex文件了

- 支持APK／DEX－使用了Dex2Jar和Jar2Dex，可以轻松加载并保存APK文件

- Java反编译器－Bytecode Viewer的反编译工具中集成了FernFlower，Procyon和CFR

- 字节码编译器－CFIED的修改版

- 十六进制查看器－由JHexPane驱动

- 每一个反编译器／编辑器／查看器都是可以进行切换的，你可以选择每一个操作面板上所显示的元素组件

- 功能完整的搜索系统－可以搜索字符串，函数，以及变量等信息

- 系统完全支持使用Groovy脚本

- 截图

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:49:18

Android Decompiler

- 主页

- dirkvranckaert/AndroidDecompiler: Decompile any APK

- 功能

- 集成了多种工具去实现反编译apk得到java代码

- 集成了哪些工具

- Dex2Jar : Version 0.0.9.15

- android-apktool : Version 1.5.2

- JD-Core-Java : Version 1.2

- Artistic Style (astyle) : Version 2.04

- 支持平台

- Mac

- Unix类系统

- 用法

usage: decompileAPK.sh [options] <APK-file>

options:

-o,--output <dir>    The output directory is optional. If not set the

default will be used which is 'output' in the

root of this tool directory.

--skipResources    Do not decompile the resource files

--skipJava        Do not decompile the JAVA files

-f,--format        Will format all Java files to be easier readable.

However, use with CAUTION! This option might change

line numbers!

-p,--project        Will generate a Gradle-based Android project for you

-h,--help        Prints this help message

parameters:

APK-file               A valid APK file is required as input

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

decompile-apk

- 主页

- venshine/decompile-apk: Decompile APK（反编译APK）

- 功能

- 集成了众多工具去从apk中反编译出java源码

- 集成了哪些工具

- Apktool : v2.2.4

- dex2jar : v2.1

- jd-gui : v1.4.0

- jadx : v0.6.1

- android-classyshark : v8.0

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

Android-Crack-Tool For Mac

- 主页

- Jermic/Android-Crack-Tool: 🐞Android crack tool For Mac

- https://github.com/Jermic/Android-Crack-Tool

- 下载

- https://github.com/Jermic/Android-Crack-Tool/releases

- 介绍

- 本软件集成了Android开发中常见的一些编译/反编译工具,方便用户对Apk进行逆向分析,提供Apk信息查看功能

- 功能

- 反编译APK

- 重建APK

- 签名APK

- 优化APK

- DEX2JAR（APK2JAR）

- JDGUI

- 提取DEX

- 提取XML

- Class to smail

- Apk信息查看

- Unicode转换

- 截图

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

Android逆向助手

- 作者：大眼仔~旭

- 简介

- Android 逆向助手是一款针对安卓平台的强大逆向辅助软件，功能涵盖apk反编译打包签名；dex/jar互转替换提取修复；so反编译；xml、txt加密；字符串编码等。支持直接将文件拖放到源和目标文件这，不用每次都点浏览选择。

- 支持系统：

- WinXP、Win7，Win2003

- 注：其它系统没有测试

- 主要功能

- 反编译apk

- 重新打包成apk

- 对apk进行签名

- 反编译dex

- 重新打包成dex

- dex转jar

- dex转ddx

- dex导出成txt

- 反编译so

- jar转dex

- 提取dex

- 替换dex

- 修复dex

- 加密xml转txt

- 字符串unicode编解码

- 特别说明：

- 源文件处支持文件或文件夹拖放

- 必须安装 .Net Framework 2.0 框架

- 部份功能依赖 java运行环境 ，因此必须安装java

- 下载地址

- 地址1：https://pan.baidu.com/s/1jI9L4IM

- 地址2：Android 逆向助手 v2.2 中文版 - 大眼仔旭

- 截图

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

AndroidKiller

- 作者：大眼仔~旭

- 功能

- 一款可视化的安卓应用逆向工具

- 集Apk反编译、Apk打包、Apk签名，编码互转，ADB通信（应用安装-卸载-运行-设备文件管理）等特色功能于一身，支持logcat日志输出，语法高亮，基于关键字（支持单行代码或多行代码段）项目内搜索，可自定义外部工具；吸收融汇多种工具功能与特点

- 打造一站式逆向工具操作体验，大大简化了安卓应用/游戏修改过程中各类繁琐工作

- 下载

- AndroidKiller v1.2

- 安卓 APK 反汇编工具 AndroidKiller 1.2 中文绿色免费版 - 大眼仔旭

- AndroidKiller v1.3.1

- AndroidKiller下载|AndroidKiller(安卓APK反汇编工具)下载 v1.3.1绿色中文版_ - pc6下载站

- 截图

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

Androguard

- 主页

- androguard/androguard: Reverse engineering, Malware and goodware analysis of Android applications

- 文档

- Welcome to Androguard’s documentation! — Androguard 3.4.0 documentation

- 功能

- 主要用来进行静态分析安卓程序

- 也可以用第三方库去反编译安卓

- 支持的第三方库

- DAD

- dex2jar + jad

- DED

- 包括多个模块/子功能

- androrisk.py ：该模块用于分析apk危险级别

- androapkinfo.py ：该模块分析apk列出其中的文件类型、权限、4大组件、是否NDK反射等信息

- androaxml.py ：该模块用于展示apk androidmanifest.xml

- androgexf.py ：该模块生成函数调用图

- apkviewer.py ：该模块生成指令级别的调用图

- androlyze.py ：该模块为交互分析环境

- 特点

- 用 Python 写的

- 支持多个平台：Linux/Windows/Mac

- 支持多种模式

- 命令行模式

- 图形界面模式

- 被当做库文件使用

- 截图

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

AFE

- AFE = Android Framework for Exploitation

- 主页

- Github

- appknox/AFE: Android Framework for Exploitation, is a framework for exploiting android based devices

- 官网

- Appknox - Mobile App Security Testing

- 这家公司主要是做移动应用的安全测试和解决方案的

- 功能

- is a framework for exploiting android based devices

- 说明

- 是基于androguard的

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

其他相关工具

此处介绍，在安卓破解期间，会用到的一些相关的其他方面的工具。

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

安卓Hook框架

破解安卓期间，往往需要安装一些hook相关的插件到一些框架上，此处介绍相关的框架。

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

XPosed框架

XPosed框架是用于安装相关插件 FDex2 ，配合破解安卓，导出运行时app的dex文件。

而之前自己折腾过这个： XPosed框架 = XPosed Installer

比如安装到了 夜神模拟器 中的 XPosed ：

更详细的解释详见专门教程：

- 强大的安卓破解辅助工具：XPosed框架

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

Cydia Substrate

- 主页

- * Cydia Substrate

- 下载

- com.saurik.substrate.apk

- 功能

- 和 Xposed 类似的框架，用来安装各种插件，实现各种功能。

- 比如可以：

- 安装绕过ssl检测的插件，用来破解 ssl pinning

- 关于安卓的app中的https：

- app内部启用了：

- SSL Pinning = ssl certificate pinning = certificate pinning

- = ssl证书绑定 =证书绑定`

- 此处也可以用来安装相关插件，导出安卓的dex文件

- 特点

- Hook底层方法非常方便

- 对so中的方法hook操作非常便捷

- 截图

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:50:07

Android-OpenDebug

- 主页

- iSECPartners/Android-OpenDebug: Make any application debuggable

- 功能

- 是一个Cydia Substrate的插件

- 所以前提是要先安装 Cydia Substrate

- 可以使得任何一个安卓程序可以被调试

- 就有了分析和破解的可能

- 下载

- Android-OpenDebug APK下载

- 安装

- adb install Android-OpenDebug.apk

- 或直接安装apk

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:46:57

Introspy-Android

- 主页

- GitHub

- iSECPartners/Introspy-Android: Security profiling for blackbox Android

- 网站

- Introspy-Android

- 功能

- 帮助分析安卓app运行期间的行为

- 以便于找到可能存在的安全问题

- 提示

- 是个 Cydia Substrate 插件

- 所以前提是先安装 Cydia Substrate

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-29 22:47:23

frida

- 主页

- Github

- Frida

- 官网

- Frida • A world-class dynamic instrumentation framework | Inject JavaScript to explore native apps on Windows, macOS, GNU/Linux, iOS, Android, and QNX

- 简介

- 一款基于 python  +  javascript 的 hook框架

- 可运行在Android/iOS/Linux/Win/OSX等各平台

- 主要使用动态二进制插桩(DBI)技术

- 将外部代码注入到现有的正在运行的二进制文件中，从而让它执行额外操作

- 支持哪些额外操作

- 访问进程内存

- 在应用程序运行时覆盖函数

- 从导入的类调用函数

- 在堆上查找对象实例并使用

- Hook、跟踪和拦截函数等

- 注：调试器也能完成相应工作，不过非常麻烦，比如各种反调试

- 功能和特点

- Scriptable

- Inject your own scripts into black box processes. Hook any function, spy on crypto APIs or trace private application code, no source code needed. Edit, hit save, and instantly see the results. All without compilation steps or program restarts.

- Portable

- Works on Windows, macOS, GNU/Linux, iOS, Android, and QNX. Install the Node.js bindings from npm, grab a Python package from PyPI, or use Frida through its Swift bindings, .NET bindings, Qt/Qml bindings, or C API.

- Free

- Frida is and will always be free software (free as in freedom). We want to empower the next generation of developer tools, and help other free software developers achieve interoperability through reverse engineering.

- Battle-tested

- We are proud that NowSecure is using Frida to do fast, deep analysis of mobile apps at scale. Frida has a comprehensive test-suite and has gone through years of rigorous testing across a broad range of use-cases.

- 文档

- Welcome | Frida • A world-class dynamic instrumentation framework

- 截图

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

安卓模拟器

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

夜神安卓模拟器

此处使用夜神安卓模拟器，来配合破解安卓：

- 可以在夜神模拟器的XPosed中安装 FDex2 ，用来从运行期间的安卓app导出dex文件

- 同时夜神自带的 文件管理器 可以方便的导出dex文件到PC端

更详细的解释详见专门教程：

好用的安卓模拟器：夜神Nox

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

文件浏览器

想要把安卓中（导出的dex等）文件拷贝（导）出来，一般需要借助于好用的安卓浏览器。

下面整理一些好用的安卓浏览器：

夜神模拟器中自带文件浏览器

ES文件浏览器

功能很强，比较流行的安卓的文件浏览器。

MT管理器

- MT = MT管理器 = MT Manager = MT Manager for Android

- 是什么：安卓中的一个文件管理器

- 常被简称为： MT2

- 因为最新版本是v2

- 比如：

- MT浏览器_V2.5.4.apk 文件管理器

- 文件管理神器 MT Manager v2.6.1 for Android

- MT管理器2.0

特点

- 支持在VirtualXposed中使用MT

- 除了普通文件管理功能外，还支持APK反编译相关功能

应用简介

MT管理器是一款强大的文件管理工具和APK逆向修改神器。

- 如果你喜欢它的双窗口操作风格，可以单纯地把它当成文件管理器使用。

- 如果你对修改APK有深厚的兴趣，那么你可以用它做许许多多的事

- 例如汉化应用、替换资源、修改布局、修改逻辑代码、资源混淆、去除签名校验等，主要取决于你如何使用。

主要功能

- 文件复制、移动、创建软链接、重命名、删除、创建文件(夹)，文件批量操作。获取 Root 权限后可访问系统目录，挂载文件系统为读写，修改文件权限和所有者。

- 像 WinRAR 那样打开 ZIP 格式文件，可以对 ZIP 内的文件进行删除、重命名、移动，添加/替换外部文件到 ZIP 中，无需解压后再重新打包，同时支持单独解压 ZIP 内的部分文件。

- 自带强大的文本编辑器，可以流畅编辑大文本文件，支持设置是否显示行号、开关自动换行、双指缩放字体大小、自动识别编码、代码语法高亮、自动缩进、正则搜索替换。

- 拥有图片查看、音乐播放、字体预览、执行脚本、文本对比等功能，在侧拉栏中可方便地查看存储设备、FTP连接、书签、后台、工具等。

- APK 编辑功能，主要有 DEX 编辑，ARSC 编辑，XML 编辑，APK 签名、APK 优化、APK 共存、去除签名校验、RES 资源混淆、RES 反资源混淆、翻译模式等。

截图举例

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

附录

下面列出相关参考资料。

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-06-28 08:35:45

参考资料

- 【整理】安卓安全技术：VMP android

- 【已解决】mac中安装最新版本的安卓反编译工具：Apktool

- 【已解决】mac中用jadx从apk中导出java源码

- 【已解决】用Python代码实现少儿趣配音的请求参数sign的计算逻辑

- 【整理】安卓安全 Smali

- 【整理】安卓安全和破解相关：加花 花指令

- 【整理】安卓 防护 加壳 服务商 总结

- 【已解决】mac中试用FDex2去hook导出安卓app的dex等文件

- 【已解决】从不同版本的小花生apk中反编译出包含业务逻辑代码的dex和jar包源码

- 【已解决】小花生安卓app的v3.4.8版破解后找到源码中是否包含J字段的加密逻辑

- 【已解决】用apktool，dex2jar，jd-gui去反编译安卓apk查看app源码

- 【已解决】尝试破解小花生app安卓apk希望看到api返回的json中的J的解密算法得到明文

- 【已解决】如何反混淆即还原反编译后混淆的安卓代码

- 【记录】从反编译安卓apk得到的java源码代码中尝试找返回json中J加密的逻辑和线索

- 【已解决】小花生app中api请求返回json的C，J，M，ST的含义和如何破解解密

- 【记录】爬取小花生app中自主阅读馆和亲子阅读馆中的有音频的绘本数据

- 【未解决】dex2jar反编译dex后jar文件包含java代码：throw new VerifyError bad dex opcode

- 【已解决】python实现java的MessageGZIP.uncompressToString即gzip的解码

- 【已解决】Python中实现java中的Base64.decode解码加密字符串

- 【已解决】从反编译小花生apk得到的包含业务逻辑代码中找到J字段解码的逻辑并用Python实现

- 【无需解决】安卓apk反编译出的smali反向破解出java原始代码

- 【已解决】安卓app如何脱壳如何破解加固

- 【已解决】找小花生app的旧版本apk并尝试能否安装使用

- 【部分解决】尝试破解安卓apk康美通去得到java源码

- 【整理】JVM参数-Xms和-Xmx参数的含义

- 【未解决】用ART，oat，dex2oat相关机制去破解新一代360、腾讯等安卓apk的加固

- 【整理】把jar包转换为java源代码的java反编译器的整理和对比

- 【已解决】用基于Procyon的Luyten反编译安卓jar包得到java源码

- 【未解决】小花生中如何得到getToken的计算逻辑以便得到正确的md5值可以正常请求接口

- 【整理】java反编译器对比：JD-GUI，CFR，Procyon，Jadx

- 【已解决】mac版JD-GUI查看并导出jar包的java源代码

- 【已解决】用java反编译器CFR从jar包导出java源代码

- 【已解决】用Procyon命令行去从jar包导出java源代码

- 【已解决】用jadx把安卓dex文件转换提取出jar包和java源代码

- 【已解决】mac中用jadx命令行CLI从apk中导出java源码

- 【记录】从安卓的apk中解压出各种项目文件

- 【已解决】用WrBug的DumpDex从app中hook导出dex文件

- 【已解决】mac中用dex2jar反编译dex文件导出jar包文件

- 【已解决】夜神安卓模拟器中导出文件到mac电脑

- 【已解决】Nox夜神安卓模拟器中/mnt/shared对应Mac的共享目录在哪里

- 【已解决】用jadx命令行从dex文件转换出java源代码

- 【基本解决】尝试破解安卓apk马蜂窝去得到java源码

- 【已解决】搞懂安卓app混淆和加固常见做法和相关逻辑

- 好用的安卓模拟器：夜神Nox

- Android 反编译利器，jadx 的高级技巧 - 简书

- 【手机脱壳】MT2+VXP+FDex2实现免Root脱壳 - Powered by Discuz!

- HangZhouCat/ReaverAPKTools: 逆向APK工具

- 文件管理神器 MT Manager v2.6.1 for Android-心海e站

- MT管理器2.0(bin.mt.plus) - 2.6.0 - 应用 - 酷安网

- MT管理器2.6.1公测版（第三版） - Powered by Discuz!

- 介绍 - MT管理器

- Android 逆向助手 v2.2 中文版 - 大眼仔旭

- Jermic/Android-Crack-Tool: 🐞Android crack tool For Mac

- 破解某小说App（一） - 掘金

- 最新乐加固脱壳详细教程（有图有真相） - Android安全 - 逆向未来技术社区 - Powered by Discuz!

- Android逆向助手反编译APK - 长江某菜鸟的博客 - CSDN博客

- 加固保-移动应用安全资讯

- android - Is there a way to get the source code from an APK file? - Stack Overflow

- spriteviki/Dex2oatHunter: Automatic Unpacking Tool for Android Dex Files

- Dex : Java Data Visualization

- What are .dex files in Android? - Stack Overflow

- Dalvik 可执行文件格式 | Android Open Source Project

- ART 和 Dalvik | Android Open Source Project

- How to decompile an APK or DEX file using jadx in Windows | Our Code World

- 压缩代码和资源 | Android Developers

- Android应用加固产品使用对比 - 『移动安全区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.cn

- S3cuRiTy-Er1C/JebScripts: Jeb public scripts

- flankerhqd/jebPlugins: Various Jeb plugins, including obfuscation restore

- enovella/jebscripts: A set of JEB Python/Java scripts for reverse engineering Android obfuscated code

- CalebFenton/simplify: Generic Android Deobfuscator

- Android 反混淆神器JEB2的使用简介 - 飞少的博客 | Jack's Blog

- 【技术分享】Android程序反混淆利器——Simplify工具 - 安全客，安全资讯平台

- [原创]JEB2反混淆神器-『Android安全』-看雪安全论坛

- Android | 使用Java Deobfuscator对JEB Decompiler反混淆_ - AppScan.IO | Janus移动安全中心

- Deobfuscating Android Triada malware – JEB Decompiler in Action

- ANDROID 逆向实例（八）－ 乐固加固脱壳（2017.01） ~ and-rev

- 乐固加固脱壳实战 - faTe's Home

- Android APK脱壳--腾讯乐固、360加固一键脱壳 - 知乎

- Android APK脱壳--腾讯乐固、360加固一键脱壳 | 辉天神龙

- 强大的安卓破解辅助工具：XPosed框架

- 好用的安卓模拟器：夜神Nox

- Apktool - A tool for reverse engineering 3rd party, closed, binary Android apps

- Apktool - How to Install

- Android 各种脱壳工具使用 - 简书

- Android逆向入门流程 - 简书

- lambdalang/DexExtractor

- DexExtractor的原理分析和使用说明 - Fly20141201. 的专栏 - CSDN博客

- system-arm_md5_6395c2f1451dbbed027d7293ab39a6e7.img.tar.gz

- 使用drizzleDumper脱去某数字公司的壳 - suwenlai的博客 - CSDN博客

- 一种常规Android脱壳技术的拓展（附工具） - FreeBuf互联网安全新媒体平台

- DrizzleRisk/drizzleDumper: drizzleDumper是一款基于内存搜索的Android脱壳工具

- pxb1988/dex2jar: Tools to work with android .dex and java .class files

- dex2jar | Penetration Testing Tools

- JesusFreke/smali: smali/baksmali

- Java Decompiler

- java-decompiler/jd-gui: A standalone Java Decompiler GUI

- Releases · java-decompiler/jd-gui

- jd-gui-osx-1.4.1.tar

- Release Luyten v0.5.4 · deathmarine/Luyten

- deathmarine/Luyten: An Open Source Java Decompiler Gui for Procyon

- Releases · deathmarine/Luyten

- Bytecode Viewer - Java & Android APK Reverse Engineering Suite/Tool

- Konloch/bytecode-viewer: A Java 8 Jar & Android APK Reverse Engineering Suite (Decompiler, Editor, Debugger & More)

- Bytecode Viewer-一款基于Java 8的Android APK逆向工具包 - 安全客，安全资讯平台

- skylot/jadx: Dex to Java decompiler

- Jadx 如何反混淆deobfuscation

- 010 Editor - Professional Text/Hex Editor with Binary Templates

- SweetScape Software Inc - Download 010 Editor

- IDA: About

- IDA Support: Download Center

- 安卓逆向学习笔记 (4) - 使用IDA Pro动态调试so文件 - 蜗牛 - CSDN博客

- 安卓 APK 反汇编工具 AndroidKiller 1.2 中文绿色免费版 - 大眼仔旭

- AndroidKiller下载|AndroidKiller(安卓APK反汇编工具)下载 v1.3.1绿色中文版_ - pc6下载站

- GDA反编译器与其他android逆向工具对比 - 知乎

- GDA介绍-功能强大的交互式Android反编译分析工具

- EverEdit：带来惊喜的国产软件 - 简书

- 原创 使用AndBug调试Android Java Bytecode-『Android安全』-看雪安全论坛

- swdunlop/AndBug: Android Debugging Library

- Android安全专项-AndBug动态调试工具 - doctorq - CSDN博客

- androguard/androguard: Reverse engineering, Malware and goodware analysis of Android applications

- Welcome to Androguard’s documentation! — Androguard 3.4.0 documentation

- Android逆向之旅—Native层的Hook神器Cydia Substrate使用详解 | 尼古拉斯.赵四

- AndroidSecNotes/Android Hook 框架（Cydia篇）.md at master · JnuSimba/AndroidSecNotes

- 看雪 - 安卓黑科技之HOOK详解

- Android逆向工程工具Dare的使用方法（Mac OS X中） - qysh123的专栏 - CSDN博客

- Dare Homepage

- Dare downloads

- Google反编译新工具——Enjarify - liuweiballack的专栏 - CSDN博客

- android:tools:enjarify WooYun WiKi

- Android 逆向工具 dex2jar, enjarify 和 AXMLPrinter2 // Neurohazard

- Dedexer user's manual

- dedexer - Browse Files at SourceForge.net

- Dedexer:Dex文件反编译工具介绍 - amos_tl - ITeye博客

- 2015移动安全挑战赛（阿里&看雪主办）全程回顾（3） - Group of Software Security In Progress

- 关于Indroid的编译 · Issue #1 · romangol/InDroid

- iSECPartners/Introspy-Android: Security profiling for blackbox Android

- Introspy-Android

- 目前最全面的Android安全工具清单 - IT经理网

- 翻译Android 应用逆向工具总结-『外文翻译』-看雪安全论坛

- Infografía sobre el funcionamiento interno del robot de Android | SmallVille

- intellij-community/plugins/java-decompiler/engine at master · JetBrains/intellij-community

- fesh0r/fernflower: Unofficial mirror of FernFlower Java decompiler (All pulls should be submitted upstream)

- 【工具分享】Radare 2之旅：通过crackme实例讲解Radare 2在逆向中的应用（上） - 安全客，安全资讯平台

- radare/radare2: unix-like reverse engineering framework and commandline tools

- radare

- Radare2使用全解 - 先知社区

- radare2逆向笔记 - 有价值炮灰 - 博客园

- Android逆向之旅---Hook神器家族的Frida工具使用详解 - Android应用安全防护和逆向分析-----作者 - CSDN博客

- 浅谈 android hook 技术 - Android - 掘金

- 使用Frida框架进行hook | La0s

- Android逆向之旅-Hook神器家族的Frida工具使用详解 - 云+社区 - 腾讯云

- hookmaster/frida-all-in-one: 《FRIDA操作手册》by @hluwa @r0ysue

- 详解Hook框架frida，让你在逆向工作中效率成倍提升 - 知乎

- Android Hook工具之Frida 基础使用 - 简书

- 《Smali Viewer 用户指南》 | AVL Team

- AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载

- SmaliViewer.Zip

- Android反编译 - 简书

- Android apk分析工具：APK Analyzer - 简书

- Making the most of the APK analyzer – Android Developers – Medium

- Analyze your build with APK Analyzer | Android Developers

- 1.2.1 APK反编译工具之：Procyon，Jadx和AndroidDecompiler - Coder-Pig的猪栏 - CSDN博客

- android - decompiling DEX into Java sourcecode - Stack Overflow

- decompiler - how to use DEXtoJar - Stack Overflow

- Android反编译简单实战 - 知乎

- Android混淆（ProGuard）从0到1 - 简书

- 乐固壳分析 - bamb00 - 博客园

- Android APK 反编译实践 - 简书

- 5分钟学会基于Xposed+DumpDex的apk快速脱壳方法 - 简书

- 腾讯加固纯手工简易脱壳教程 - 『移动安全区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.cn

- 花生日记APP邀请注册机实战（360加固脱壳） – Silkage's Blog

- 如何反编译Android 的apk/dex/odex，获得源码 – 码农日记

- Android逆向之路---脱壳360加固 - 简书

- 26款优秀的Android逆向工程工具 - 简书

- Application Hardening - Mobile App Hardening | Promon

- Cydia Substrate使用手册 - 简书

- 看雪安全论坛 18年专注——顶级软件逆向论坛

- 一张图看懂Android编译流程 - 简书

- 原创 如何使用Xposed+JustTrustMe来突破SSL Pinning-『WEB安全』-看雪安全论坛

- 当你写爬虫抓不到APP请求包的时候该怎么办？【中级篇】 - 知乎

- tls - What is certificate pinning? - Information Security Stack Exchange

- permissiongen权限管理混淆处理_dobiman的博客-CSDN博客

- 第三方免费加固横向对比 – Android – 掘金

- Android DEX-VMP 虚拟保护技术 | GeneBlue's Blog

- Android最新的VMP加固技术一般是怎么实现的？ - 知乎

- Android Vmp加固实现流程图_zhangmiaoping23的专栏-CSDN博客_android vmp

- [原创]某Android DEX vmp加固逆向分析-Android安全-看雪论坛-安全社区|安全招聘|bbs.pediy.com

- Study of android malicious in dynamic unpacking

- Android SO Virtualization Protection ｜ KIWISEC

- eaglx/VMPROTECT: Obfuscation method using virtual machine.

- Home · obfuscator-llvm/obfuscator Wiki

- Obfuscator-llvm源码分析 - 知乎

- [原创]ollvm的混淆反混淆和定制修改-Android安全-看雪论坛-安全社区|安全招聘|bbs.pediy.com

- 技术前沿|虚拟机保护技术（VMP）的实践与体会-支付产业网

- 【更新】讨论android加固防内存dump的技术及vmp壳的防护强度 - 看雪安全论坛

- [原创]dex vmp虚拟化-『Android安全』-看雪安全论坛

- 第五代加固技术 ARM代码虚拟化保护技术

- DexHunter的原理分析和使用说明（一）_Fly20141201. 的专栏-CSDN博客_dexhunter

- [原创]Android dex文件通用自动脱壳器-Android安全-看雪论坛-安全社区|安全招聘|bbs.pediy.com

- 从Android运行时出发，打造我们的脱壳神器-Harries Blog™

- [原创]FART：ART环境下基于主动调用的自动化脱壳方案-Android安全-看雪论坛-安全社区|安全招聘|bbs.pediy.com

- [原创]记录一次非常简单的so层小逆向，适合小白入门-『Android安全』-看雪安全论坛

- Smali 语法解析——Hello World - 掘金

- JesusFreke/smali: smali/baksmali

- Smali语法介绍_Java_singwhatiwanna-CSDN博客

- Android逆向基础：Smali语法 - 简书

- dalvik - What is Smali Code Android - Stack Overflow

- Smali: Assembler for Android's VM | Medium

- [Android][Security] Android 逆向之 smali | wOw的博客 (wossoneri.github.io)

- Android Runtime (ART) 和 Dalvik | Android 开源项目

- Dalvik 可执行文件格式 | Android 开源项目 | Android Open Source Project

- 通付盾: 产品体系_应用加固（Andorid/iOS/H5/SDK）

- 移动应用安全加固移动应用APP加固应用安全安全市场华为云市场-华为云

- 爱加密：深入上海互联网移动应用分析，协助构建移动安全互联-爱加密移动应用安全保护平台|app防反编译|app加壳|app防破解

- 安卓dex加花保护_网易易盾

- android dex加花保护_网易易盾

- Android 代码混淆并加花 - 第四维空间testing - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园

- android打包上架之预防反编译（花指令）_移动开发_qinzhuoheng的专栏-CSDN博客

- 【技术分享】Android代码混淆技术总结（一） - 安全客，安全资讯平台

- 花指令 - CTF Wiki

- 纯手工混淆C/C++代码（上） - 知乎

- Unicorn实战（一）：去掉libcms.so的花指令 – LeadroyaL's website

- 【技术分享】 Android SO 高阶黑盒利用 - 安全客，安全资讯平台

- FDex2 core code MainHook - Programmer Sought

- Shelling Android APK - Le Tencent solid, a reinforcement key 360 husking(Others-Community) (titanwolf.org)

crifan.com，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2021-08-19 17:12:50

Table of Contents

前言

概述

安卓背景知识

安卓基本框架

apk编译打包流程

破解apk的流程

相关知识

apk文件

dex文件

安卓虚拟机

smali

安卓加密技术

为何要加密加固

加密技术历史

加密方案概述

代码混淆

花指令

VMP

加壳加固

安卓破解技术

如何反混淆

如何去壳脱壳

如何判断哪家加固方案

如何从apk破解出java源码

破解apk概述

一步: apk->java

两或三步: app->dex->jar->java

常见安卓破解工具

从app导出dex

FDex2

DumpDex

drizzleDumper

DexExtractor

InDroid

DexHunter

FART

dex转jar

dex2jar

Enjarify

Dedexer

反编译器

常见反编译器对比

常见反编译器

其他破解类工具

反汇编器

apktool

IDA

radare2

安卓XML破解

其他辅助类工具

二进制编辑

apk分析

动态分析和调试

其他综合类工具

ByteCode Viewer

Android Decompiler

decompile-apk

Android-Crack-Tool For Mac

Android逆向助手

AndroidKiller

Androguard

AFE

其他相关工具

安卓Hook框架

安卓模拟器

文件浏览器

附录

参考资料