hackThacker/awesome-reverse-engineering
GitHub: hackThacker/awesome-reverse-engineering
一个展示如何通过逆向工程和Smali字节码注入技术,将老旧的安卓应用成功现代化并兼容至Android 16的完整实战项目。
Stars: 0 | Forks: 0
<<<<<<< HEAD
# Vedabase Android 现代化项目
本项目主要针对旧版 **Vedabase** Android 应用进行了成功的逆向工程、现代化和补丁应用,确保其与最新的 Android 版本(最高至 Android 16)完全兼容。
## 🚀 主要成就
### 1. 现代化 Android 兼容性 (API 34+)
* **Target SDK 更新:** 应用的 `targetSdkVersion` 已更新至 **33** (Android 13)。这在提供现代系统性能的同时,避开了 API 34 严格的运行时接收器限制,从而确保了在 Android 14、15 和 16 上的稳定性。
* **架构:** 确认应用逻辑为纯 Java,这使其原生兼容所有现代 ARM64-v8a 设备。
### 2. 分区存储与数据库修复
* **问题:** 在 Android 11+ 上,旧版文件访问受到限制。无法通过绝对路径读取 1.1GB 的 `.ivd` 文件。
* **发现:** 分析表明,**`.ivd` 格式实际上是一个标准的 SQLite 数据库**。
* **精准补丁:** 将 Dalvik 字节码 注入到 `MainActivity.onCreate` 中。应用现在会自动检测是否运行在 Android 11+ 上,并提示用户授予**“所有文件访问权限”** (`MANAGE_EXTERNAL_STORAGE`),从而保留了原有的高性能渲染管线。
### 3. 欢迎界面现代化
为了提供更简洁的用户体验,欢迎界面的字符串已直接在 Smali 源文件 (`u.smali`) 中进行了更新:
* **更新头部:** 与 `Intro001.htm` 中的现代介绍文本相匹配。
* **移除旧版链接:** 删除了失效的故障排除和说明部分。
* **新底部文本:**
* **文字:** "This apk is modified For the latest devices upto android 16"
* **署名:** "modified by:" (已链接至 GitHub)
* **URL:** `https://github.com/hackthacker`
## 📂 项目结构
* `vedabase_latest_clean.apk`:最终已签名、对齐且可用于生产的 APK。
* `decompiled_apk/`:完整且已打补丁的源项目(Smali + 资源)。
* `tools/`:所需的实用工具 (`Apktool`, `uber-apk-signer`)。
* `BUILD-GUIDE.md`:用于重新构建项目的分步命令指南。
* `INSTALL-FIX-REPORT.md`:安装错误的详细技术诊断报告。
* `README-Reverse-Engineering.md`:发现阶段的技术文档。
## 🛠️ 重新构建项目
要从修改后的源代码构建 APK,请运行以下命令(详见 `BUILD-GUIDE.md`):
1. **编译:** `java -jar tools\apktool.jar b decompiled_apk -o vedabase_latest_clean.apk`
2. **签名与对齐:** `java -jar tools\uber-apk-signer.jar --apks vedabase_latest_clean.apk --allowResign --overwrite`
## ✅ 最终状态
# 该项目已**100% 成功**。应用能够正常安装,请求必要的权限,并在最新的 Android 硬件设备上完美渲染 Vedabase 的内容。
# 📖 Android 逆向工程与现代化
## 📋 目录
- [这是什么](#-what-is-this)
- [为什么有这个仓库](#-why-this-repo)
- [SDK 版本变更](#-sdk-version-changes)
- [涵盖主题](#-topics-covered)
- [使用工具](#-tools-used)
- [构建环境设置](#-build-environment-setup)
- [如何重新构建](#-how-to-rebuild)
- [适用对象](#-who-is-this-for)
- [仓库状态](#-repo-stats)
- [许可证](#-license)
- [支持](#-support)
## 🔍 这是什么
这款 **Android** 应用是一个庞大的离线吠陀经典阅读器,构建在一个 **1.1 GB 专有的 `.ivd` 数据库文件**之上。该应用最初发布时针对的是 **Android 4.3 Jelly Bean (API 18)**,由于三个复合性问题——分区存储的强制执行、未签名 APK 的拒绝安装以及已弃用的文件 I/O API——导致该应用在现代 Android 版本上完全无法运行。
本项目完全在 **Smali (Dalvik 字节码)** 层面对 APK 进行了**端到端逆向工程**。无需反编译的 Java 源代码。我们将精准的补丁注入到了 `MainActivity.onCreate` 中,更新了 `AndroidManifest.xml` 中的权限声明,并直接在 `.smali` 文件中使欢迎界面的字符串现代化——最终生成了一个完全签名、zipaligned(对齐处理)且可用于生产的 APK,能够在 **Android 16 (API 35)** 上完美运行。
### 🧠 核心发现
在分析过程中,我们发现专有的 `.ivd` 文件格式实际上是一个被重命名了扩展名的**标准 SQLite 数据库**。这消除了对任何自定义解析器的需求,并允许原封不动地保留现有的高性能渲染管线。
## 💡 为什么有这个仓库
| # | 问题 | 根本原因 | 实施的解决方案 |
|---|---|---|---|
| 1 | 在 Android 11+ 上启动时应用直接崩溃 | 分区存储强制执行机制阻止了所有旧式 `File()` 绝对路径读取 | 通过 Smali 将 `MANAGE_EXTERNAL_STORAGE` 运行时权限请求注入到 `MainActivity.onCreate` 中 |
| 2 | 1.1 GB `.ivd` 数据库完全无法读取 | 操作系统阻止了在 API 30+ 上通过旧式绝对路径进行访问 | 逆向工程了 `.ivd` 格式,确认其为标准 SQLite;修补了文件访问路径解析 |
| 3 | APK 拒绝在现代设备上安装 | 包未签名,被 API 26+ 的 Android 包管理器拒绝 | 使用 `apksigner` 进行签名(v1 + v2 方案)+ 使用 Android Build Tools 34.0.0 进行 zipaligned 对齐处理 |
| 4 | `targetSdkVersion` 严重过时 | 原始 API 18 会触发导致不稳定的旧版兼容性垫片机制 | 更新至 `targetSdkVersion 33` 获得现代运行时行为,同时避开严格的 API 34 限制 |
| 5 | 欢迎界面布满失效链接 | 在 `.smali` 内的 `const-string` 值中硬编码了旧版故障排除 URL | 重写了所有受影响的 `const-string` 条目——更整洁的头部、移除了死链、添加了署名信息 |
| 6 | ARM64 兼容性未知 | 源架构未作说明 | 确认为纯 Java 逻辑——零原生 `.so` 库——原生兼容所有 ARM64-v8a 设备 |
## 📱 SDK 版本变更
| 属性 | 原始 APK | 修改后的 APK |
|---|---|---|
| **Min SDK 版本** | `14` Android 4.0 Ice Cream Sandwich | `14` 保留(维持最大设备覆盖范围) |
| **Target SDK 版本** | `18` Android 4.3 Jelly Bean | `33` Android 13 Tiramisu |
| **编译 SDK** | 未知 / API 19 之前版本的构建工具链 | Build Tools `34.0.0` |
| **最高兼容至** | Android 4.3(在 Android 5.0+ 上实际已失效) | ✅ **Android 16 (API 35)** 已全面验证 |
| **原生库** | 仅 ARMv7 | 无需——纯 Java,支持所有 ABI |
| **APK 签名方案** | 未签名 | 通过 `apksigner` 采用的 v1 (JAR) + v2 (APK 签名块) 方案 |
| **存储权限** | 未声明 | 在 API 30+ 上运行时请求 `MANAGE_EXTERNAL_STORAGE` |
## 📚 涵盖主题
- 使用 **APKTool** 进行 Android APK 结构分析与反编译
- **Smali / Dalvik 字节码** 读取、理解操作码以及编写精准补丁
- **Scoped Storage (API 30+)** 运行时 `MANAGE_EXTERNAL_STORAGE` 注入到现有字节码中
- 专有文件格式逆向工程——识别出隐藏在 `.ivd` 中的 **SQLite**
- 跨 Android API 代的 `targetSdkVersion` 和 `minSdkVersion` 策略
- 使用 `apksigner` 进行 APK **签名**(v1 + v2 签名方案)
- 使用 `zipalign` 进行 APK **对齐**,以优化内存映射 I/O
- 使用 `keytool` 生成调试 **keystore**
- 使用 **JADX** 进行 Java 源码反编译和交叉参考
- 多版本 Android 兼容性测试(Android 11 到 16)
- Smali 字符串修补——`const-string`、`\n`、`\'` 转义序列、多行格式化
- `AndroidManifest.xml` 权限和 SDK 属性修改
- 通过直接进行 Smali 和资源修补来实现欢迎界面 UI 的现代化
- 使用 `apksigner verify` 验证 APK
## 🛠️ 使用工具
| 工具 | 版本 | 用途 | 下载 |
|---|---|---|---|
| **APKTool** | `v2.10.0` | 反编译 APK -> Smali + XML 资源;重新编译回未签名的 APK | [apktool_2.10.0.jar](https://github.com/iBotPeaches/Apktool/releases/download/v2.10.0/apktool_2.10.0.jar) |
| **uber-apk-signer** | `v1.3.0` | 一条命令完成 APK 签名和 zipalign;支持 v1/v2/v3 方案 | [uber-apk-signer-1.3.0.jar](https://github.com/patrickfav/uber-apk-signer/releases/download/v1.3.0/uber-apk-signer-1.3.0.jar) |
| **JADX** | `v1.5.0` | 将 APK 反编译为可读的 Java 源码,用于静态分析和交叉参考 | [jadx-1.5.0.zip](https://github.com/skylot/jadx/releases/download/v1.5.0/jadx-1.5.0.zip) |
| **apksigner** | `Build Tools 34.0.0` | 具有精确 v1/v2 方案控制的底层 APK 签名工具 | 包含在 Android Build Tools 中 |
| **zipalign** | `Build Tools 34.0.0` | 将 APK 条目对齐在 4 字节边界上,以提升运行时内存效率 | 包含在 Android Build Tools 中 |
| **Android SDK Manager** | `cmdline-tools r11` | 安装和管理 Android Build Tools 及平台组件 | [commandlinetools-linux](https://developer.android.com/tools/sdkmanager) |
| **keytool** | `JDK 21.0.9 LTS` | 生成用于 APK 签名的 RSA-2048 调试 keystore | 包含在 JDK 中 |
| **OpenJDK** | `21.0.9 LTS` | APKTool、uber-apk-signer、apksigner 和 keytool 的运行环境 | [adoptium.net](https://adoptium.net/temurin/releases/?version=21) |
| **Zed Editor** | 最新版 | 用于修改 Smali 字节码和 XML 资源的主要编辑器 | [zed.dev](https://zed.dev/) |
| **Android Studio** | 最新版 | 模拟器测试、ADB 设备管理和 logcat 调试 | [developer.android.com/studio](https://developer.android.com/studio) |
## ⚙️ 构建环境设置
在 **Ubuntu 22.04 / Debian** 或 **Windows 上的 WSL2** 上的完整环境设置。
### 第 1 步 安装 Java 21 LTS
```
sudo apt-get update && sudo apt-get install -y wget unzip curl
# 安装 OpenJDK 21
sudo apt-get install -y openjdk-21-jdk
# 验证
java -version
# 预期:java version "21.0.9" 2025-10-21 LTS
```
### 第 2 步 下载 APKTool v2.10.0
```
# 下载 APKTool wrapper 脚本
wget https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool \
-O /usr/local/bin/apktool
chmod +x /usr/local/bin/apktool
# 下载 APKTool JAR v2.10.0
wget https://github.com/iBotPeaches/Apktool/releases/download/v2.10.0/apktool_2.10.0.jar \
-O /usr/local/bin/apktool.jar
chmod +x /usr/local/bin/apktool.jar
# 验证
apktool --version
# 预期:2.10.0
```
### 第 3 步 下载 uber-apk-signer v1.3.0
```
wget https://github.com/patrickfav/uber-apk-signer/releases/download/v1.3.0/uber-apk-signer-1.3.0.jar \
-O /usr/local/bin/uber-apk-signer.jar
# 验证
java -jar /usr/local/bin/uber-apk-signer.jar --version
# 预期:uber-apk-signer v1.3.0
```
### 第 4 步 下载 JADX v1.5.0(用于静态分析)
```
wget https://github.com/skylot/jadx/releases/download/v1.5.0/jadx-1.5.0.zip \
-O /tmp/jadx.zip
unzip /tmp/jadx.zip -d /opt/jadx
export PATH="/opt/jadx/bin:${PATH}"
# 验证
jadx --version
# 预期:1.5.0
```
### 第 5 步 安装 Android 命令行工具和 Build Tools 34
```
wget https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip \
-O /tmp/cmdline-tools.zip
mkdir -p /opt/android-sdk/cmdline-tools
unzip /tmp/cmdline-tools.zip -d /opt/android-sdk/cmdline-tools
mv /opt/android-sdk/cmdline-tools/cmdline-tools \
/opt/android-sdk/cmdline-tools/latest
# 接受许可并安装 Build Tools 34
yes | /opt/android-sdk/cmdline-tools/latest/bin/sdkmanager --licenses
/opt/android-sdk/cmdline-tools/latest/bin/sdkmanager "build-tools;34.0.0"
# 添加到 PATH
export PATH="/opt/android-sdk/build-tools/34.0.0:${PATH}"
# 验证
zipalign --version
apksigner --version
```
### 第 步 生成调试 Keystore
```
keytool -genkey -v \
-keystore debug.keystore \
-storepass android \
-alias androiddebugkey \
-keypass android \
-keyalg RSA \
-keysize 2048 \
-validity 10000 \
-dname "CN=Android Debug,O=Android,C=US"
```
## 🔨 如何重新构建
在环境设置完成且 `decompiled_apk/` 目录包含所有已应用的补丁后:
### 方案 A 使用 uber-apk-signer(推荐——一条命令即可完成签名和对齐)
```
# 步骤 1:将 Smali + 资源重新编译回未签名的 APK
apktool b decompiled_apk -o vedabase_unsigned.apk
# 步骤 2:在单个命令中进行签名和 Zipalign
java -jar /usr/local/bin/uber-apk-signer.jar \
--apks vedabase_unsigned.apk \
--allowResign \
--overwrite
# 输出:vedabase_unsigned-aligned-signed.apk
```
### 方案 B 手动使用 apksigner + zipalign(精细化控制)
```
# 步骤 1:重新编译
apktool b decompiled_apk -o app-unaligned.apk
# 步骤 2:Zipalign
zipalign -p -f 4 app-unaligned.apk app-aligned.apk
# 步骤 3:使用显式的 v1 + v2 方案进行签名
apksigner sign \
--ks debug.keystore \
--ks-pass pass:android \
--v1-signing-enabled true \
--v2-signing-enabled true \
app-aligned.apk
# 步骤 4:验证签名
apksigner verify --verbose app-aligned.apk
```
### 安装到设备
```
adb install app-aligned.apk
# 或用于重新安装
adb install -r app-aligned.apk
```
## 🎯 适用对象
```
✅ Android reverse engineers studying real-world Smali patching
✅ Security researchers analyzing legacy APK structures and storage patterns
✅ Devotees requiring Vedabase to run on Android 11, 12, 13, 14, 15, or 16
✅ Developers learning scoped storage migration without Java source access
✅ Students studying APK decompilation, bytecode injection, and re-signing
✅ Engineers learning the full APKTool → patch → sign → verify pipeline
✅ Anyone studying proprietary file format identification (SQLite inside .ivd)
❌ Not for commercial redistribution of the patched APK
❌ Not a replacement for the official Vedabase platform or website
❌ Not for bypassing DRM, copy protection, or proprietary licensing
```
## 📊 仓库状态
这是什么 • 为什么有这个仓库 • SDK 变更 • 涵盖主题 • 使用工具 • 构建环境设置 • 如何重新构建 • 适用对象 • 仓库状态 • 许可证 • 支持
标签:Android 16兼容, Android适配, Android逆向, APK修改, APK反编译, APP破解, Dalvik字节码, JS文件枚举, MANAGE_EXTERNAL_STORAGE, Scoped Storage, Smali注入, SQLite数据库, 二进制分析, 云安全运维, 云资产清单, 代码剖析, 内核监控, 后端开发, 安卓开发, 目录枚举, 移动安全, 系统底层, 软件现代化, 逆向工程