### 手动百度脱壳详解 #### 一、引言 在网络安全与软件逆向工程领域,对已加固的应用程序进行“脱壳”是一项技术挑战性极高的工作。本文将详细探讨一种针对百度加固应用程序的手动脱壳过程,具体涉及的技术细节包括分析加固后的文件结构变化、使用IDA进行初步调试尝试、以及最终通过“DD大法”实现脱壳的目标。 #### 二、百度加固概述 百度提供了一种名为“百度加固”的服务,旨在保护应用程序免受逆向工程和恶意篡改。加固后的应用程序会包含额外的组件,例如`libbaiduprotect.so`和`baiduprotect.jar`等文件,这些文件负责在运行时执行解密、校验和其他安全措施。 #### 三、加壳前后对比 **1. 加固后文件变化** - **新增文件**: - `libbaiduprotect.so`:负责核心的加密和解密操作。 - `baiduprotect.jar`:包含用于执行解密算法的Java类。 - **修改文件**: - `META-INF`文件夹:通常用于存储数字签名和证书信息。 - `AndroidManifest.xml`:可能包含用于控制应用行为的新权限或组件。 - `Classes.dex`:这是加固的核心部分,包含了经过加密或混淆处理的Dex文件。 **2. DEX文件变化** - **DEX头部**:DEX文件的头部信息通常会被修改,例如Magic值、签名值等。 - **DEX内容**:关键的DEX内容如Class定义、方法定义等可能被加密或删除。 - **其他更改**:例如Class offset、Data offset等关键信息可能会被修改。 #### 四、IDA尝试 **1. 反调试检测** - 使用IDA远程调试时遇到的问题主要是程序进行了反调试处理。具体来说,程序会在运行初期检查是否处于调试状态,如果检测到调试器,则程序会崩溃或进入死循环。 - 例如,代码中有这样的逻辑: ```java static { if (!Debug.isDebuggerConnected()) { String v0 = Build.CPU_ABI; if (v0 != null && (v0.startsWith("x86"))) { StubApplication.loadX86Library(); return; } System.loadLibrary("baiduprotect"); } } ``` - 删除第一个`if`条件后虽然可以加载`baiduprotect.so`,但程序仍然会因其他反调试机制而崩溃。 #### 五、DD大法 **1. 内存Dump与DEX头部恢复** - 使用DD大法首先需要将程序运行时的内存Dump下来,从中查找DEX文件并尝试恢复其头部信息。 - 通常情况下,加固后的DEX头部信息会被抹掉,需要根据特定的模式或特征恢复这部分信息。 - 恢复DEX头部后,可以进一步提取出DEX文件并对其进行反编译。 **2. Smali文件反编译问题** - 在反编译过程中,可能会遇到一些错误,特别是与DEX文件中某些offset相关的错误。 - 需要检查这些offset是否指向了合法的地址空间,否则反编译将失败。 - 例如,文中提到的`0x0220E8E8`这个offset指向了DEX文件外部的地址,需要将其修改为有效地址。 **3. Dex数据修复** - 修复过程中需要关注的关键点包括: - DEX文件头部的Magic值、签名值等信息。 - Data class offset及Data class中的数据。 - 函数的uleb128索引值、access flags及指向函数内容的offset。 - 这个过程较为繁琐且需要一定的逆向工程经验,有时还需要多次尝试才能确定正确的值。 #### 六、总结 通过上述步骤,我们可以手动完成百度加固应用程序的部分脱壳工作。尽管整个过程非常复杂且耗时,但对于深入理解加固技术和提高逆向工程能力来说是非常有价值的。需要注意的是,这些操作仅适用于学习和研究目的,在未经许可的情况下对他人软件进行逆向工程可能违反相关法律法规,请谨慎操作。
- wen9449362015-09-07内容还不错
- mmspirit22015-12-08比较难,搞不定
- ColoThor2018-10-17还是有难度的
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助