2023-03-19 23:01:23 +08:00

66 lines
3.9 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 第七章 脱壳
## 7.1 壳,加壳,脱壳
`Android``APK`文件实际上是一种压缩文件格式,它包含了应用程序的二进制代码、资源文件、清单文件等。在安装应用程序之前,系统会将`APK`文件解压缩并安装到设备上。在`APK`文件中,应用程序的二进制代码通常是以`DEXDalvik Executable`格式存储的。`DEX`格式是一种针对移动设备优化的字节码格式,与`Java`虚拟机`JVM`的字节码格式有所不同。由于`DEX`格式采用了特殊的指令集和数据结构,使得反编译工具可以轻松地将其转换为可读性较高的`Java`代码。此外,许多反编译工具还可以通过反汇编和反混淆等技术来还原出源代码,因此为了防止应用程序的关键代码轻易被暴露,开发人员会采取一系列的手段来保护代码。
Android常规对代码保护的方案主要包括以下几种
1. 混淆Obfuscation通过重命名类、方法、变量等标识符来隐藏程序逻辑使得反编译后的代码难以被理解和分析。
2. 压缩Compression将应用程序的二进制代码压缩成较小的体积防止恶意用户逆向工程和复制源代码。
3. 签名Signing在应用程序发布前使用数字证书对应用程序进行签名确保其完整性和来源可信。
4. 加固Hardening在应用程序内部添加额外的安全保护机制如代码加密、反调试、反注入等增强应用程序的抵御能力。
5. 动态加载Dynamic Loading将敏感的代码和资源文件放置在远程服务器上在运行时动态加载到本地设备以防止被攻击者轻易访问和修改。
### 7.1.1 什么是加壳
加壳`Packing`就是一种应用程序加固手段之一。它将原始应用程序二进制代码嵌入到一个特殊的外壳中,通过修改程序入口和解密算法等方式,增加反调试、反逆向、防篡改等安全机制,提高应用程序的安全性。
加壳的目的是使应用程序难以被攻击者分析和修改,从而提高应用程序的抵御能力。但是,加壳也会带来一些负面影响,如增加应用程序的体积、降低应用程序运行效率、可能引入新的安全漏洞等。
常见的加壳壳包括:
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 如何脱壳
## 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 自动化脱壳