leolovenet/apkpatch
GitHub: leolovenet/apkpatch
一个封装了 APK 解码、修改、签名与安装全流程的 Python 命令行工具,用于简化 Android 逆向工程中的补丁测试与安全审查工作流。
Stars: 0 | Forks: 0
# apkpatch
`apkpatch` 是一个用于 APK 安全审查和 smali 补丁测试的小型命令行工作流包装器。
它隐藏了以下重复性细节:
- 使用 `apktool` 解码 APK
- 为解码后的 smali 初始化干净的 git 基线
- 使用 `apktool b` 重新构建
- 使用 `zipalign` 对齐
- 使用 `apksigner` 签名
- 生成非交互式的 debug keystore
- 验证签名
- 使用 `adb install -r` 安装
该工具不会为您修改 smali。它只管理围绕您手动编辑 smali/资源的工作流。
## 安装
在仓库根目录下执行:
```
python3 -m pip install -e .
```
然后运行:
```
apkpatch doctor
```
您也可以在不安装的情况下运行:
```
PYTHONPATH=src python3 -m apkpatch doctor
```
## 外部工具
`apkpatch` 需要存在以下工具:
- `apktool`
- `java`
- `keytool`
- `zipalign`
- `apksigner`
- `adb`(仅用于安装)
- `git`(仅用于基线/diff)
`zipalign` 和 `apksigner` 会按以下顺序查找:
1. `$PATH`
2. `--build-tools-dir`
3. `$ANDROID_HOME/build-tools/*`
4. `$ANDROID_SDK_ROOT/build-tools/*`
5. `~/Library/Android/sdk/build-tools/*`(在 macOS 上)
## 基本工作流
解码 APK:
```
apkpatch decode app.apk -o app_workdir
```
默认情况下,这还会在 `app_workdir` 内部创建一个 git 仓库,并将解码后的 APK 提交为:
```
baseline: decoded apk
```
手动进行您的 smali/资源更改,然后检查它们:
```
cd app_workdir
apkpatch diff
```
构建、对齐、签名并验证:
```
apkpatch build \
--generate-ks ~/.apkpatch/debug.keystore \
--out dist/app-patched-signed.apk
```
安装:
```
apkpatch install
```
或者一步完成构建和安装:
```
apkpatch build --install
apkpatch build --install -s DEVICE_SERIAL
```
## 命令
### doctor
检查工具发现情况:
```
apkpatch doctor
```
### decode
使用 `apktool d` 解码 APK:
```
apkpatch decode input.apk -o workdir
```
常用选项:
```
apkpatch decode input.apk -o workdir --force
apkpatch decode input.apk -o workdir --no-git
```
### build
构建已解码的工作目录:
```
apkpatch build
```
`build` 默认使用当前目录。您仍然可以显式指定工作目录:
```
apkpatch build workdir
```
默认情况下,输出会使用解码出的包名(如果可用):
```
workdir/dist/com.example.app-signed.apk
```
默认情况下,构建成功后会删除未签名和对齐的中间 APK 文件。
如果无法推断出包名,`apkpatch` 将回退使用工作目录名。
常用选项:
```
apkpatch build --clean
apkpatch build --name review-false
apkpatch build --suffix review-false
apkpatch build --keep-intermediates
apkpatch build --out /tmp/review-false-signed.apk
apkpatch build --install
```
### rebuild
使用上一次构建保存的元数据再次构建:
```
apkpatch rebuild
```
### sign
为现有的 APK 签名:
```
apkpatch sign unsigned.apk -o signed.apk --ks ~/.apkpatch/debug.keystore
```
### align
仅运行 `zipalign`:
```
apkpatch align unsigned.apk -o aligned.apk
```
### install
安装 APK:
```
apkpatch install signed.apk
apkpatch install signed.apk -s DEVICE_SERIAL
```
如果未提供 APK,`install` 默认使用当前工作目录的 `.apkpatch.json` 中的 `last_signed_apk`:
```
apkpatch install
apkpatch install -s DEVICE_SERIAL
```
如果提供了 `--workdir`,安装失败时可能会包含包名提示:
```
apkpatch install signed.apk --workdir app_workdir
```
### diff
显示更改的文件以及 smali/资源差异:
```
apkpatch diff
apkpatch diff --stat
```
### git-init
为已解码的现有工作目录初始化 git 跟踪:
```
apkpatch git-init
```
## Keystore 行为
如果未提供 keystore,`apkpatch build` 将使用:
```
~/.apkpatch/debug.keystore
```
如果它不存在,将使用以下命令以非交互方式生成:
```
alias: apkpatchdebug
password: android
```
您可以覆盖:
```
apkpatch build \
--ks ./debug-review.keystore \
--alias debugreview \
--ks-pass android \
--key-pass android
```
除非满足以下条件,否则现有的 keystore 不会被覆盖:
```
--force-generate-ks
```
## Signature Scheme v4
默认情况下,`apkpatch` 会禁用 APK Signature Scheme v4,因此 `apksigner` 不会创建 `.idsig` 附属文件。
显式启用它:
```
apkpatch build --v4
```
## 安全提示
`apkpatch` 适用于本地 APK 安全审查、逆向工程以及针对您获得授权进行检查的应用程序的补丁验证。
它本身不会绕过平台安全检查。它仅封装了常见的 APK 工具,并使工作流变得可重复。
标签:Android, APK逆向, DSL, JS文件枚举, 移动开发, 逆向工具