2023-03-13 21:09:47 +08:00
|
|
|
|
# 第七章 脱壳
|
|
|
|
|
|
|
|
|
|
## 7.1 壳,加壳,脱壳
|
|
|
|
|
|
2023-03-19 23:01:23 +08:00
|
|
|
|
`Android`的`APK`文件实际上是一种压缩文件格式,它包含了应用程序的二进制代码、资源文件、清单文件等。在安装应用程序之前,系统会将`APK`文件解压缩并安装到设备上。在`APK`文件中,应用程序的二进制代码通常是以`DEX(Dalvik Executable)`格式存储的。`DEX`格式是一种针对移动设备优化的字节码格式,与`Java`虚拟机`(JVM)`的字节码格式有所不同。由于`DEX`格式采用了特殊的指令集和数据结构,使得反编译工具可以轻松地将其转换为可读性较高的`Java`代码。此外,许多反编译工具还可以通过反汇编和反混淆等技术来还原出源代码,因此为了防止应用程序的关键代码轻易被暴露,开发人员会采取一系列的手段来保护代码。
|
2023-03-13 21:09:47 +08:00
|
|
|
|
|
2023-03-19 23:01:23 +08:00
|
|
|
|
Android常规对代码保护的方案主要包括以下几种:
|
2023-03-13 21:09:47 +08:00
|
|
|
|
|
2023-03-19 23:01:23 +08:00
|
|
|
|
1. 混淆(Obfuscation):通过重命名类、方法、变量等标识符来隐藏程序逻辑,使得反编译后的代码难以被理解和分析。
|
|
|
|
|
2. 压缩(Compression):将应用程序的二进制代码压缩成较小的体积,防止恶意用户逆向工程和复制源代码。
|
|
|
|
|
3. 签名(Signing):在应用程序发布前,使用数字证书对应用程序进行签名,确保其完整性和来源可信。
|
|
|
|
|
4. 加固(Hardening):在应用程序内部添加额外的安全保护机制,如代码加密、反调试、反注入等,增强应用程序的抵御能力。
|
|
|
|
|
5. 动态加载(Dynamic Loading):将敏感的代码和资源文件放置在远程服务器上,在运行时动态加载到本地设备,以防止被攻击者轻易访问和修改。
|
|
|
|
|
|
|
|
|
|
### 7.1.1 什么是加壳
|
|
|
|
|
|
|
|
|
|
加壳`(Packing)`就是一种应用程序加固手段之一。它将原始应用程序二进制代码嵌入到一个特殊的外壳中,通过修改程序入口和解密算法等方式,增加反调试、反逆向、防篡改等安全机制,提高应用程序的安全性。
|
|
|
|
|
|
|
|
|
|
加壳的目的是使应用程序难以被攻击者分析和修改,从而提高应用程序的抵御能力。但是,加壳也会带来一些负面影响,如增加应用程序的体积、降低应用程序运行效率、可能引入新的安全漏洞等。
|
2023-03-13 21:09:47 +08:00
|
|
|
|
|
2023-03-19 23:01:23 +08:00
|
|
|
|
常见的加壳壳包括:
|
|
|
|
|
|
|
|
|
|
1. `DexProtector`:一款商业化的加壳工具,支持`Android`和`iOS`平台,可以对`Java`代码和`NDK`库进行加固。其特点是支持多种代码混淆技术,同时还提供了反调试、防止`Hook`攻击、反模拟器等多种安全机制。
|
|
|
|
|
2. `Qihoo360`加固保:一款免费的加壳工具,支持`Android`和`iOS`平台,采用自己研发的加固壳技术,可以对`Java`代码和`C/C++`库进行加固,同时还提供了反调试、反逆向、防篡改等多种安全机制。
|
|
|
|
|
3. `Bangcle`:一款国内著名的加壳工具,支持`Android`和`iOS`平台,提供了多种加固壳方案,如`DexShell、SOShell、`加密资源等,同时还支持反调试、反注入等多种安全机制。
|
|
|
|
|
4. `APKProtect`:一款功能强大的加壳工具,支持`Android`平台,可以对`Java`代码和`Native`库进行加固,支持多种加固方式,如代码混淆、`Resource Encryption、Anti-debugging`等,同时还提供了反反编译、反调试等多种安全机制。
|
|
|
|
|
|
|
|
|
|
这些加壳工具都有不同的特点和适用场景,开发者可以根据实际需求选择合适的加壳壳进行加固。需要注意的是,加壳只是一种安全加固手段,不能取代其他常规的安全措施,并且可能带来一些负面影响,如体积增大、运行效率下降等。
|
|
|
|
|
|
|
|
|
|
### 7.1.3 如何脱壳
|
2023-03-13 21:09:47 +08:00
|
|
|
|
|
2023-03-19 23:01:23 +08:00
|
|
|
|
|
2023-03-13 21:09:47 +08:00
|
|
|
|
|
|
|
|
|
## 7.2 壳的特征
|
|
|
|
|
|
|
|
|
|
### 7.2.1 初代壳
|
|
|
|
|
|
|
|
|
|
### 7.2.2 二代壳
|
|
|
|
|
|
|
|
|
|
### 7.2.3 三代壳
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 7.3 脱壳的原理
|
|
|
|
|
|
|
|
|
|
### 7.3.1 双亲委派机制
|
|
|
|
|
|
|
|
|
|
### 7.3.2 类的加载流程
|
|
|
|
|
|
|
|
|
|
### 7.3.3 函数调用流程
|
|
|
|
|
|
|
|
|
|
### 7.3.4 初代壳实现
|
|
|
|
|
|
|
|
|
|
### 7.3.5 如何脱壳
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 7.4 简单脱壳实现
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 7.5 自动化脱壳
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|