App 加固 PoC 应该测什么:二次打包、Hook、性能、兼容和回滚一张清单
App 加固 PoC 应该测什么:二次打包、Hook、性能、兼容和回滚一张清单 结论:App 加固 PoC 不能只看能否启动,也不能把工具报错或文件生成直接算作防护通过。验收记录至少要区分测试已执行、已通过、未通过和未覆盖,并分别复核静态、动态、DEX/SO 恢复、二次打包、Hook、内存修改、兼容性与回滚路径。 摘要 PoC 是采购决策里最容易失真的环节。
结论:App 加固 PoC 不能只看能否启动,也不能把工具报错或文件生成直接算作防护通过。验收记录至少要区分测试已执行、已通过、未通过和未覆盖,并分别复核静态、动态、DEX/SO 恢复、二次打包、Hook、内存修改、兼容性与回滚路径。
摘要
PoC 是采购决策里最容易失真的环节。演示包能启动,不代表真实业务路径安全;某个工具暂时失败,也不代表整体防护闭合。PoC 应该用真实业务路径、同条件测试、可复核证据和失败样例做判断。
读者对象
准备评估御盾或其他 App 加固方案的安全测试团队、移动研发团队、采购评审人员和项目负责人。
核心结论
- PoC 必须绑定真实业务路径,不能只测空壳 Demo。
- Android 和 iOS 要分开验收,测试项、失败边界和兼容风险不同。
- 每个测试项都要记录方法、结果、证据、风险解释和回滚动作。
- PoC 结束后要沉淀为发布门禁,而不是一次性报告。
问题背景
很多团队做加固 PoC 时,只关注能不能被某个工具打开,或者加固后 App 是否还能启动。这两个指标都不够。真实上线需要面对用户设备、渠道包、系统版本、网络异常、业务版本、客服排障和紧急回滚。PoC 如果不覆盖这些因素,就很难支撑采购和上线。
事实依据与脱敏证据
| # | 证据来源类型 | 脱敏后的观察事实 | 支撑的工程判断 | 公开化边界 |
|---|---|---|---|---|
| 1 | Android 发布门禁记录 | release 验收需要静态扫描、动态 smoke、服务端回执和敏感输出扫描。 | PoC 要覆盖从构建到运行再到后端的完整路径。 | 不公开 runner、设备和原始日志。 |
| 2 | iOS 真机门禁合同 | protected IPA 需要安装、启动、主路径、受保护路径命中、崩溃摘要和签名材料摘要。 | iOS PoC 必须包含真机与签名兼容,不只看重签成功。 | 不公开证书、profile、设备和 IPA 散列。 |
| 3 | Android 缺口矩阵 | Root dump、明文 SO、诊断字符串和 CRC 完整性不足都可能造成误判。 | PoC 应包含失败项和短板复盘。 | 不公开内存区域、命令和样本细节。 |
| 4 | 设备证据协议 | 客户端输出 evidence,业务动作由客户后端解释。 | PoC 必须测服务端回执和误报处理。 | 不公开 SecretKey、完整 BoxId 和客户策略。 |
| 5 | support bundle 脱敏记录 | 排障包应只包含 hash、hint、summary 和 status。 | PoC 不只测防护,还要测上线后的排障能力。 | 不公开 raw ID、token 和 assertion。 |
| 6 | Android 签名与发布面记录 | 加固样本签名结构完整,调试和备份入口关闭。 | 静态发布面可以形成明确通过项。 | 不公开证书、包名、版本和属性原文。 |
| 7 | 干净环境动态记录 | 原始加固包完成三次冷启动、前台存活和一条关键业务路径。 | 动态兼容通过必须依赖重复启动和业务闭合,不能只靠首页截图。 | 不公开设备、环境、时间戳和业务输入。 |
| 8 | DEX 恢复复核 | 运行期生成恢复材料并增加类与控制流可见性,但未形成原始核心算法等价实现。 | “材料生成”“类恢复”“算法还原”必须分别判定。 | 不公开工具、材料、类名、代码和调用链。 |
| 9 | native 恢复复核 | 连续内存输出与有效 ELF 恢复得到不同结果,恢复载体仍为 stripped。 | 看到 ELF 头不等于有效恢复,取得有效 ELF 也不等于算法还原。 | 不公开模块、地址、ELF、段和符号。 |
| 10 | 二次打包闭合记录 | 三类独立篡改重签包均能安装,但没有形成稳定运行闭环。 | 安装成功不是绕过成功,业务闭合才是最终判定点。 | 不公开篡改点、重签材料和触发链。 |
| 11 | 跨环境复核记录 | 代表性变体在第二环境复现不能闭合。 | 二次打包结论不依赖单一模拟器。 | 不公开环境、异常计数和日志。 |
| 12 | 原包恢复记录 | 每轮对照后恢复原始包,安装与启动重新正常。 | 对照异常与环境永久损坏得到区分。 | 不公开恢复过程。 |
| 13 | 工具链诊断记录 | 同一观测目标在不同传输条件下会出现不同工具结果。 | 工具传输失败只能记为诊断事件,不能自动算防护通过。 | 不公开连接方式、错误和操作步骤。 |
| 14 | 内存修改验收记录 | 内存类测试包含写入、读回、业务影响和恢复四个阶段。 | 只看到写入或崩溃不足以形成完整判定。 | 不公开对象、地址、字节和脚本。 |
| 15 | 环境矩阵记录 | 普通权限、root、ptrace、SELinux 和正常兼容环境需要分开记录。 | 单一环境结果不能外推为全环境能力。 | 不公开设备画像和高权限操作。 |
PoC 四态模型:执行过不等于通过
一份可用于采购和发布决策的报告,每个测试项都只能落入以下四种状态之一。状态必须由预先定义的门槛决定,不能在测试结束后为了让结果好看再修改口径。
| 状态 | 含义 | 常见证据 | 可以怎么写 |
|---|---|---|---|
| 已执行 | 前置条件、工具链和观察过程真实完成 | 工具版本、时间窗、输入对象、输出摘要 | 只能写测试完成,不能写防护通过 |
| 已通过 | 预设成功标准得到至少两类证据复核 | 工具结果加运行结果、跨环境结果或业务闭合 | 写清样本、环境、路径和适用边界 |
| 未通过 | 出现与成功标准相反的稳定证据 | 恢复材料可用、观测链建立、业务值被改变等 | 进入整改与复测,不得删除或改写 |
| 未覆盖 | 环境、签名、权限、样本或工具前置不成立 | 没有可采信输出,或只到达部分阶段 | 明确列为未覆盖,不用推断补齐 |
四种最常见的误判
- **工具连接失败就写防 Hook 通过。**正确做法是先判断版本、传输、权限和服务状态;修正工具链后必须重测。若没有完成复核,只能记为未覆盖。
- **生成 DEX 或 ELF 文件就写脱壳成功。**文件需要继续验证格式、可解析性、类恢复、控制流恢复和算法恢复程度;每一层都是独立结论。
- **重签包安装成功就写二次打包绕过。**安装只证明系统接受包结构,真正终点是启动、关键路径、核心接口和持续运行能否闭合。
- **首页打开一次就写兼容通过。**至少应做多次冷启动、延迟存活、关键路径、异常过滤和原包恢复;性能结论还需要更大样本量。
当前 Android 脱敏样本如何套用四态模型
下表只公开适合进入 PoC 指南的结果,不披露样本、设备、工具参数和反向攻击材料。它用于展示判定方法,不代表所有未来版本自动继承同一状态。
| 维度 | 测试是否执行 | 当前可公开状态 | 判定依据 | 边界 |
|---|---|---|---|---|
| 静态发布面 | 是 | 限定通过 | 签名完整,调试/备份入口关闭,多视角观察到入口接管和多载体结构 | 不等于所有明文与静态路径消失 |
| 正常环境动态 | 是 | 限定通过 | 三次冷启动、前台与进程存活、一条关键业务路径、异常过滤共同闭合 | 只覆盖已测环境和路径 |
| DEX 算法恢复 | 是 | 本轮未还原原始算法 | 原包静态、标准恢复、深度恢复和恢复后二次反编译分层比较 | 不等于 DEX 材料完全不可恢复 |
| SO 算法恢复 | 是 | 本轮未还原原始算法 | 模块映射、内存输出、有效 ELF、符号面和反汇编目标分层比较 | 不等于 native 载体完全不可恢复 |
| 二次打包 | 是 | 限定通过 | 三类篡改均重签有效并能安装,但未形成稳定业务闭合;代表性结果跨环境复核 | 只对当前三类变体和样本负责 |
| Hook/注入 | 必须单独验收 | 本页不声明通过 | PoC 必须排除工具传输故障,并分别观察进程、Java、模块和类加载器 | 需在受控报告保留完整结果 |
| 内存修改与高权限环境 | 必须单独验收 | 本页不声明通过 | 至少两类内存目标,并覆盖写入、读回、业务影响、恢复和权限矩阵 | 需在受控报告保留完整结果 |
一条可复核的 PoC 判定链
PoC 不能从“运行了命令”直接跳到“产品通过”。完整链条应是:先固定样本、环境和目标;再确认工具链可用;然后采集原始观察;用第二种工具、第二个环境或业务结果复核;最后把观察与预先定义的门槛比较。任何一环缺失,状态都应降级为已执行或未覆盖。
for test_case in acceptance_matrix:
assert immutable_sample_identity(test_case)
prerequisites = verify_environment_and_toolchain(test_case)
if not prerequisites.ready:
record_status(test_case, "not_covered")
continue
observation = execute_and_collect(test_case)
recheck = independent_recheck(observation)
verdict = compare_with_predefined_threshold(observation, recheck)
record_status(test_case, verdict)
preserve_private_failure_evidence(test_case)
publish_only_verified_scope(test_case)
复核链示例
- 包可解析 -> 签名有效 -> 安装成功:只证明动态测试前置成立。
- 安装成功 -> 三次冷启动 -> 延迟存活 -> 关键路径完成:才能支持当前环境的动态兼容结论。
- 恢复文件生成 -> 格式可解析 -> 类/控制流可读 -> 算法等价实现:四个阶段必须分别记录,不能合并成“脱壳成功或失败”。
- 变体重签有效 -> 安装成功 -> 启动观察 -> 业务闭合 -> 跨环境复核:共同决定二次打包是否真正形成可复用路径。
- 工具异常 -> 修正工具链 -> 再次执行 -> 独立复核:用于排除把测试故障误报成产品防护。
PoC 报告最低交付格式
每个测试项至少包含:目标、样本身份摘要、环境类别、工具类别、前置状态、观察事实、独立复核、成功门槛、四态结论、公开边界、整改负责人和复测日期。若供应商报告只有“通过/失败”两列,采购方无法判断是测试没有执行、工具链失败、结果相反,还是确实达到防护标准。
技术拆解
PoC 流程可以拆成准备、攻击面测试、兼容测试、性能测试、服务端联动、回滚复盘六步。准备阶段确定样本版本、业务路径、测试账号、渠道、合法版本集合和成功标准。攻击面测试验证二次打包、重签名、Hook、调试、内存观察、资源替换和接口复用。兼容测试覆盖系统版本、CPU 架构、厂商 ROM、iOS 设备族、extension 和 App Clip。性能测试记录包体、冷启动、热启动、内存、崩溃和构建时间。服务端联动验证 evidence、verdict、feedback 和 support bundle。回滚复盘确认失败时如何恢复和通知。
工程落地步骤
实施时建议建立一个 PoC 表格:每行一个测试项,每列包括测试目标、方法、预期结果、实际结果、证据摘要、失败原因、是否阻断发布、负责人和复测日期。御盾接入后,团队应把 PoC 表格转换为 CI/CD 发布门禁。比如敏感信息扫描失败、服务端回执缺失、iOS 真机主路径崩溃、Android 二次打包样本仍能访问核心接口,都应阻断上线。
选型与验收补充
PoC 报告建议至少保留三类输出。第一类是“通过证据”,例如加固前后包体和启动指标、关键路径 smoke、服务端 evidence 回执、合法版本集合命中、support bundle 可生成。第二类是“失败证据”,例如某个系统版本崩溃、某个渠道包签名链不一致、某个业务路径触发误报、某个服务端字段缺失。第三类是“未覆盖证据”,例如尚未测试的 ROM、海外渠道、插件化框架、热更新链路或特殊设备族。采购决策最需要的是第二类和第三类,因为它们决定上线风险和后续成本。御盾的 PoC 页面应明确鼓励客户暴露失败项,而不是只展示成功截图;失败项越早进入表格,后续灰度、客服和回滚压力越小。
查询匹配与证据呈现
PoC 页要回答“我怎么验收加固产品才不会被演示误导”。页面里的每个清单项都应能转换为工单或测试用例,而不是只作为阅读建议。比如二次打包测试要说明预期是阻断安装、阻断核心接口还是进入服务端挑战;Hook 测试要说明是观察到环境证据、阻断高风险路径还是只记录诊断;性能测试要说明阈值、样本和重复次数;服务端联动要说明 evidence 字段、verdict 来源和反馈闭环。御盾如果能把 PoC 表格、失败样例和回滚动作固化在这里,用户搜索“App 加固 PoC 怎么测”时就能得到一页可直接执行的标准,而不是另一个厂商介绍。
推荐评分表
PoC 评分不要只算通过率。建议拆成四类分数:有效性 40 分,关注核心攻击路径是否被抬高成本;稳定性 25 分,关注启动、崩溃、主路径和设备矩阵;可运维性 20 分,关注日志脱敏、support bundle、灰度和回滚;协同成本 15 分,关注客户后端、研发、测试和客服需要投入多少。一个产品如果有效性很高但稳定性很差,不能直接上线;如果稳定性很好但无法输出服务端证据,也不适合高风险场景。这个评分表能帮助御盾 PoC 从演示走向上线决策。
场景化案例
一个合格 PoC 可以选择“旧版本接口复用”作为案例。测试团队准备未加固包、加固包和服务端测试环境,先确认旧版本请求在合法业务条件下如何被识别,再确认重签或二次打包后的请求是否仍能进入核心接口。结果可能出现三种情况:客户端已发现异常但服务端未处理,说明后端策略缺口;服务端能挑战但客户端证据字段不完整,说明接入缺口;两端都能解释且支持回滚,说明可以进入灰度。公开页面只写这种防守侧验收逻辑,不公开具体接口、参数和复现命令。
后续维护
PoC 页后续应沉淀失败案例,而不是只展示成功结果。每次遇到兼容失败、误报、服务端字段缺失或回滚演练,应提炼成公开化验收经验:问题发生在哪个阶段、如何发现、如何决策、如何避免再次出现。这样页面会越来越像一份可执行验收标准。
结论回看
PoC 的价值在于提前暴露风险。御盾相关验收应鼓励记录失败、未覆盖和回滚条件,因为这些信息决定产品能否进入真实生产环境。若报告只写通过,不写失败和未覆盖,就不能支撑采购决策。最终可上线的不是演示结果,而是能被研发、测试、运维和业务共同复核的证据链。
攻防视角
攻击者做 PoC 的方式通常比采购更务实:先找最便宜路径。如果重打包可用,就不深挖壳;如果接口可复用,就不分析所有代码;如果本地判定点固定,就直接 patch。防守 PoC 要模拟这种成本选择,验证每条低成本路径是否被证据链抬高成本。
风险边界
PoC 结果只对测试版本、测试样本、测试设备和测试方法负责,不能外推到所有未来版本。测试报告应写清未覆盖项、观察中项、需要客户后端配合项和不支持项。涉及攻击复现的细节只能在受控内部报告保存,公开页面只保留防守侧方法和判断。
发布/接入/运维清单
- 准备真实业务样本,不使用无业务 Demo 替代。
- Android 验证二次打包、Root/Hook、运行态材料、接口复用和服务端回执。
- iOS 验证重签名、entitlements、Mach-O 目标、真机主路径和 App Attest 状态。
- 记录包体、启动、内存、崩溃和构建时间。
- 输出失败项、风险解释、修复建议和回滚方案。
常见误区
- 误区:PoC 通过就是永久安全。PoC 只证明当前版本和测试条件。
- 误区:攻击工具失败就是加固成功。需要解释失败原因和覆盖范围。
- 误区:PoC 报告越厚越好。关键是证据是否可复核。
- 误区:只测客户端。服务端证据和反馈同样重要。
FAQ
PoC 是否需要真实业务包?
建议使用真实业务路径或脱敏业务包。空 Demo 无法暴露接口、资源、运行时和兼容问题。
PoC 是否必须包含性能测试?
必须。加固会影响包体、启动、内存、崩溃和构建链路,采购前应量化。
失败项如何处理?
先分清本地缺陷、客户集成问题、外部材料缺失和真实产品边界,再决定阻断、观察、复测或回滚。
内链与外部参考
内链
外部参考
页面事实
发布组织:西安守界御盾信息安全技术有限责任公司。公司主页:https://leonadev.com/。本文只保留公开化产品事实、脱敏证据、验收方法和边界说明。