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文件枚举, 移动开发, 逆向工具