5618apktool复习

下面是“apktool 流程:反编译 → 改资源/Smali → 重打包签名 → 安装运行”的实战讲义,附带常见命令、注意事项、排错清单,以及 8 道单选练习题(不含答案,选项分布均匀)。

一、目标与适用场景

  • 目标:在合规授权前提下,对 Android APK 做静态修改(资源或 Smali 逻辑),并成功重打包、签名、安装运行。
  • 典型用途:教学练习、逆向修复 UI 文案、开关调试开关、打补丁验证缺陷;严禁用于违法用途。

二、基本工具

  • apktool:反编译/重编译 Android 应用(资源 + Smali)。
  • apksigner 或 jarsigner + zipalign:对重打包的 APK 进行对齐与签名。
  • keytool:生成签名密钥(keystore)。
  • adb:安装与调试。

三、标准流程与命令范式

  1. 反编译(decode)
  • 命令

    apktool d app.apk -o app_src
  • 结果

    • app_src/AndroidManifest.xml(可读)
    • app_src/res/(资源)
    • app_src/smali*/(Smali 代码包)
    • app_src/assets/ 等
  1. 修改内容
  • 改资源

    • 文本/图片:res/values/strings.xml、res/drawable-*/、layout/
    • 注意引用与资源 ID(apktool 会在重编译时重建 R)。
  • 改 Smali

    • 位置:smali/包名路径/类名.smali
    • 语法:基于 Dalvik 指令(.method、invoke-/const- 等)
    • 例:将 const/4 v0, 0x0 改为 const/4 v0, 0x1,可切换布尔逻辑。
  • Manifest

    • 调试标志 android:debuggable="true"
    • 权限/导出属性调整(注意兼容性与安全影响)
  1. 重打包(build)
  • 命令

    apktool b app_src -o app-unsigned.apk
  • 如果报 aapt/aapt2 相关错误,考虑用 apktool 对应版本或指定 framework(系统 app 时需要先“安装”framework-res.apk)。
  1. 对齐(zipalign,可选但推荐)
  • 命令

    zipalign -v -p 4 app-unsigned.apk app-aligned.apk

    若无 zipalign,可直接下一步签名(apksigner 也会提示)。

  1. 签名(sign)
  • 生成测试密钥(首次)

    keytool -genkeypair -v -keystore my.keystore -alias mykey \
      -keyalg RSA -keysize 2048 -validity 10000
  • 使用 apksigner 签名(推荐)

    apksigner sign --ks my.keystore --ks-key-alias mykey \
      --out app-signed.apk app-aligned.apk
    # 或直接对未对齐包签名:apksigner sign --ks ... --out app-signed.apk app-unsigned.apk
  • 验证签名

    apksigner verify --verbose --print-certs app-signed.apk
  1. 安装与运行
  • 卸载同包名旧版本(如果签名不一致)

    adb uninstall com.example.demo
  • 安装

    adb install app-signed.apk
  • 日志调试

    adb logcat | grep -i mytag

四、签名与安装的要点

  • 同包名的 APP 不能覆盖安装不同证书签名的 APK;要么先卸载,要么用原证书重签(通常拿不到原签名)。
  • Android 7.0+ 默认要求 V2 签名(apksigner 会自动处理);jarsigner 仅 V1,可能安装失败。
  • 若需要覆盖安装以便“增量调试”,应使用相同 keystore 重签。

五、Smali 修改小贴士

  • 定位入口

    • 从崩溃堆栈/日志找类路径;
    • 通过 strings.xml/布局 id 推断类名;
    • 使用搜索工具在 smali 里找关键字。
  • 常见修改

    • 布尔/常量开关(const 指令)
    • 条件跳转(if-eq/if-nez → 反转条件)
    • 返回值(return v0 / return-const)
  • 保持寄存器数量与方法签名一致,避免破坏寄存器约束。

六、常见错误与排错

  • 安装失败 INSTALL_PARSE_FAILED_NO_CERTIFICATES

    • 未签名或签名不正确 → 用 apksigner 重新签名。
  • INSTALL_FAILED_UPDATE_INCOMPATIBLE

    • 设备上已有相同包名不同签名版本 → 先 adb uninstall。
  • 运行崩溃 ClassNotFound/NoSuchMethod

    • 改动破坏了类/方法签名或寄存器数量 → 回看 smali 修改。
  • 资源 id 冲突

    • 清理 app_src/build,然后再 apktool b。
  • 系统 app 反编译失败

    • 需先安装相应 framework:apktool if framework-res.apk

七、合规与安全

  • 仅在授权/教学环境操作;
  • 不要把包含第三方资源的修改包传播;
  • 不要移除合法安全机制(防篡改、证书校验)用于不当用途。

八、8 道单选练习题(仅一项正确,选项分布均匀;题末【】填写)

  1. 使用 apktool 反编译 APK 的正确命令形式是?【B】
    A. apktool b app.apk -o app_src
    B. apktool d app.apk -o app_src
    C. apktool sign app.apk -o app_src
    D. apktool if app.apk -o app_src
  2. 修改 Smali 后重打包生成未签名 APK 的命令是?【B】
    A. apktool d app_src -o app-unsigned.apk
    B. apktool b app_src -o app-unsigned.apk
    C. apksigner sign app_src -o app-unsigned.apk
    D. zipalign -v -p 4 app_src app-unsigned.apk
  3. 若要将 APK 签名且兼容 Android 7.0+ 的 V2 签名,应优先使用哪种方式?【A】
    A. jarsigner 直接签名
    B. apksigner sign
    C. 用压缩软件重新打包
    D. 仅使用 zipalign
  4. 安装重签后的 APK 提示 UPDATE_INCOMPATIBLE,最可能的解决方式是?【B】
    A. 修改包名即可覆盖安装
    B. 先卸载设备上同包名旧版本,再安装新签名包
    C. 关机重启设备
    D. 用 zipalign 重新对齐
  5. 下列哪项最适合作为“生成新 keystore”的命令?【A】
    A. apksigner generate --ks my.keystore
    B. keytool -genkeypair -keystore my.keystore -alias mykey ...
    C. jarsigner -keystore my.keystore -alias mykey
    D. zipalign -keystore my.keystore
  6. 发现反编译的系统应用构建失败(缺 framework),应先执行哪步?【A】
    A. apktool if framework-res.apk
    B. apksigner verify framework-res.apk
    C. zipalign framework-res.apk
    D. jarsigner framework-res.apk
  7. 修改 Smali 时,下列哪项做法更稳妥?【C】
    A. 可随意增减寄存器数量,不会影响
    B. 任意更改方法签名以便快速实现
    C. 保持方法签名与寄存器约束一致,仅调整必要指令
    D. 删除 .locals 与 .registers 提高兼容性
  8. 处理“资源 ID 冲突/构建缓存影响”的常见做法是?【D】
    A. 直接多次 apktool b 直到成功
    B. 删除 app_src/build 后再重编译
    C. 在 APK 内手动编辑 resources.arsc
    D. 用 zipalign 修复资源 ID

需要的话,我可以根据你的实际 APK,给出:

  • “改资源”与“改 Smali”的具体定位示例(含搜索关键词与差异补丁)
  • 一键化脚本(decode → build → align → sign → install)与失败时自动打印日志的排错模板

批改结果

  • 得分:5/8
  • 答对:1、2、4、6、7
  • 需改:3、5、8

逐题讲解与更正

  1. 反编译命令
    你的答案:B(正确)
    说明:apktool d app.apk -o app_src
  2. 重打包生成未签名 APK
    你的答案:B(正确)
    说明:apktool b app_src -o app-unsigned.apk
  3. 兼容 Android 7.0+ 的签名方式
    你的答案:A(错误) → 正确:B
    说明:Android 7.0+ 要求支持 V2 签名。apksigner 会同时处理 V1/V2(可兼容更高版本);jarsigner 只做 V1,可能导致安装失败。
  4. UPDATE_INCOMPATIBLE 覆盖失败
    你的答案:B(正确)
    说明:同包名不同证书不能直接覆盖安装。先 adb uninstall com.xxx.yyy 再安装新签名包;或必须用原证书重签。
  5. 生成新 keystore 的命令
    你的答案:A(错误) → 正确:B
    说明:使用 keytool 生成密钥对/keystore:
    keytool -genkeypair -v -keystore my.keystore -alias mykey -keyalg RSA -keysize 2048 -validity 10000
  6. 系统应用缺 framework 构建失败
    你的答案:A(正确)
    说明:先安装框架资源:apktool if framework-res.apk,然后再 decode/build。
  7. 修改 Smali 的稳妥做法
    你的答案:C(正确)
    说明:保持方法签名与寄存器约束一致,仅改必要指令;否则容易 ClassNotFound/寄存器溢出等崩溃。
  8. 资源 ID 冲突/构建缓存影响
    你的答案:D(错误) → 正确:B
    说明:清理构建缓存:删除 app_src/build 后再 apktool b。zipalign 只做对齐,不会修复资源 ID。

一页速记(高频易错)

  • 解包/打包

    • 解包:apktool d app.apk -o app_src
    • 打包:apktool b app_src -o app-unsigned.apk
  • 对齐/签名/验证

    • zipalign -v -p 4 app-unsigned.apk app-aligned.apk
    • apksigner sign --ks my.keystore --ks-key-alias mykey --out app-signed.apk app-aligned.apk
    • apksigner verify --verbose --print-certs app-signed.apk
  • keystore 生成

    • keytool -genkeypair -keystore my.keystore -alias mykey -keyalg RSA -keysize 2048 -validity 10000
  • 安装

    • adb uninstall 包名 ;adb install app-signed.apk
  • 常见报错

    • INSTALL_PARSE_FAILED_NO_CERTIFICATES → 未签名或只 V1 → 用 apksigner
    • UPDATE_INCOMPATIBLE → 先卸载旧包或用原证书重签
    • 构建失败缺 framework → apktool if framework-res.apk
    • 资源冲突 → 删 app_src/build 重编译

需要我把这套流程做成一键脚本(decode → build → align → sign → install),或给你一个“Smali 改布尔开关”的最小示例吗?


好的,下面是新的 8 道单选练习题(仅围绕 apktool 反编译→改资源/Smali→重打包签名→安装运行)。每题只有一个最合适选项,选项分布均匀,题末【】留空,不提供答案。

  1. 仅修改资源文件(strings.xml、图片),不改 Smali 时,为加快反编译速度更合适的做法是?【B】
    A. apktool d -r app.apk -o app_src(不解码资源)
    B. apktool d -s app.apk -o app_src(跳过 Smali 解码)
    C. apktool d -d app.apk -o app_src(降级模式)
    D. apktool d app.apk -o app_src(默认完整解码)
  2. zipalign 步骤在签名流程中的正确时机是?【B】
    A. 应在签名之后执行
    B. 应在签名之前执行
    C. 任何顺序都可,结果一致
    D. 只在调试包需要,发布包不需要
  3. 多 dex 应用中,额外类文件通常会被 apktool 解到哪里?【D】
    A. smali_extra/
    B. smali_classes2/、smali_classes3/…
    C. classes/
    D. dex_bin/
  4. 希望“覆盖安装”修改后的 APK 而不卸载旧版本,下列哪种前提最关键?【C】
    A. 随机生成任意 keystore 即可
    B. 修改包名后就能覆盖
    C. 使用原应用的签名密钥进行重签
    D. 先运行 zipalign 再安装
  5. 关于 APK V1/V2 签名的说法,哪项更准确?【C】
    A. V1 签名在 ZIP 级别校验整个 APK,V2 只校验单个条目
    B. V1/V2 都只校验 META-INF 目录
    C. V1 校验单个 ZIP 条目,V2 在 APK 整体层面进行签名校验
    D. V2 仅在 Android 5.0 及以下有效
  6. 将 AndroidManifest.xml 中 minSdkVersion 从 24 改为 29 后,在 Android 7.0(API 24)设备上安装会出现什么结果?【B】
    A. 正常安装,运行时可能崩溃
    B. 安装失败,提示设备系统版本过低(例如 INSTALL_FAILED_OLDER_SDK)
    C. 正常安装,系统自动降级特性
    D. 仅第一次安装失败,重试即可成功
  7. 需要检查 APK 的签名并打印证书颁发者/有效期等信息,下列哪条命令更合适?【A】
    A. zipalign --print-certs app.apk
    B. apksigner verify --verbose --print-certs app.apk
    C. keytool -verify app.apk
    D. jarsigner -zipalign app.apk
  8. 安装报错 “INSTALL_PARSE_FAILED_NO_CERTIFICATES”,更直接的修复方式是?【B】
    A. 重新解包后删除 META-INF 目录再装
    B. 用 apksigner 或兼容方式对 APK 正确签名(确保符合目标系统签名要求)
    C. 只执行 zipalign 即可
    D. 把 APK 重命名为 .zip 再改回 .apk

批改结果

  • 得分:6/8
  • 答对:1、2、4、5、6、8
  • 需改:3、7

逐题反馈

  1. 仅改资源时的更快解包方式
    你的答案:B(正确)
    说明:-s/--no-src 跳过 Smali 解码,修改资源足够。对比 -r/--no-res 是“跳过资源”,用于仅改 Smali 的场景。
  2. zipalign 的时机
    你的答案:B(正确)
    说明:应先 zipalign,再签名。签名后再对齐会破坏签名。
  3. 多 dex 应用的 Smali 输出位置
    你的答案:D(错误) → 正确:B
    说明:apktool 会把额外 dex 解到 smali_classes2/、smali_classes3/… 目录。没有 dex_bin/ 这一目录。
  4. 覆盖安装的关键前提
    你的答案:C(正确)
    说明:同包名覆盖安装必须使用“原签名密钥”重签;否则需先卸载旧包。
  5. V1/V2 签名差异
    你的答案:C(正确)
    说明:V1 校验 ZIP 条目,V2 在 APK 整体层面签名校验(Android 7.0+ 需要)。
  6. 提高 minSdkVersion 导致的结果
    你的答案:B(正确)
    说明:设备系统版本低于 minSdkVersion 会直接安装失败(如 INSTALL_FAILED_OLDER_SDK)。
  7. 打印证书信息的命令
    你的答案:A(错误) → 正确:B
    说明:apksigner verify --verbose --print-certs app.apk 可查看证书颁发者、指纹、有效期等。zipalign 没有 --print-certs 选项。
  8. “NO_CERTIFICATES” 的直接修复
    你的答案:B(正确)
    说明:用 apksigner(或兼容方案)正确签名,确保符合目标系统的签名要求(V1/V2 等)。

速记补充

  • 只改资源:apktool d -s app.apk -o app_src → 改 res → apktool b … → zipalign → apksigner
  • 只改 Smali:apktool d -r app.apk -o app_src(跳过资源)
  • 多 dex:smali_classes2/3/…
  • 查签名:apksigner verify --verbose --print-certs app.apk

需要我再出一套“Smali 定位与修改”的练习(含最小布尔开关改法与寄存器检查要点)吗?我可以给出具体类片段与正确改法的对比。

~  ~  The   End  ~  ~


 赏 
感谢您的支持,我会继续努力哒!
支付宝收款码
tips
文章二维码 分类标签:博客TypechoAutoUpload
文章标题:5618apktool复习
文章链接:https://www.fangshaonian.cn/archives/138/
最后编辑:2025 年 11 月 14 日 18:48 By 方少年
许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
(*) 4 + 6 =
快来做第一个评论的人吧~