先看结论与判断条件
- 不要只提交一个同名安装包,必须记录来源、版本、文件摘要、签名计划和计划发布渠道。
- 不要只说需要最高强度,应说明哪些逻辑被还原或修改后会造成什么业务损失。
- 技术栈要覆盖语言、构建、最低系统、ABI、Native、动态加载、跨平台框架和第三方 SDK。
- 在 PoC 前写清成功、失败、未覆盖、停止和回滚条件,避免把能启动误当成可以发布。
先提供一个能够被唯一识别的候选包
候选包是后续配置、测试和结论的共同对象。至少需要包名或 Bundle ID、版本、构建来源、文件 SHA-256、当前签名状态、目标签名计划和计划发布渠道。如果暂时不能交付文件,也应明确项目处于架构、开发、联调还是发布准备阶段。
同名文件不代表同一产物。重新构建、重新签名、修改渠道资源或替换依赖都会产生新身份。每次变化要说明哪些验证需要重跑,不能把旧候选的通过结论直接贴到新文件。
涉及商业代码和用户数据时,应通过中央御盾平台的受控项目流程提交。公开专题站只提供方法与入口,不接收账号、安装包、证书或项目秘密。
| 字段 | 示例内容 | 用途 | 常见缺口 |
|---|---|---|---|
| 应用身份 | 包名或 Bundle ID、版本 | 对应发布、升级和测试范围 | 只有市场名称 |
| 文件身份 | SHA-256 与生成时间 | 保证所有证据指向同一文件 | 同名覆盖旧文件 |
| 构建来源 | 分支、提交、CI 任务或发布记录 | 问题回溯与重新构建 | 无法说明来源 |
| 签名计划 | 当前状态、最终证书和签名环节 | 验证升级和发布身份 | PoC 后随意重签 |
| 分发范围 | 商店、企业或私有渠道 | 决定完整性信号和交付检查 | 默认所有渠道相同 |
把需要保护的代码写成业务损失
最高强度、全部保护和防破解都不是可执行需求。请列出核心算法、授权判断、协议处理、内容权益、模型或关键本地决策,并说明它被读懂、复制、修改或跳过后会造成什么损失。
同时说明这些逻辑为什么必须留在客户端。可以由服务端完成的高风险授权,应优先由服务端决定;需要离线、低时延或平台本地能力的路径,再评估客户端保护。这样才能把 VMP 留给真正需要改变执行表示的代码。
每项资产还要有负责人、调用入口、执行频率、线程、输入输出、依赖和失败回退。没有独立验收路径的资产,即使价值很高,也要先补测试条件。
| 资产类型 | 应说明的损失 | 客户端必要性 | 建议准备的验收 |
|---|---|---|---|
| 授权与权益 | 本地分支被跳过后可访问何种资源 | 离线能力或本地快速判断 | 正常、过期、篡改和服务端复核 |
| 核心算法 | 被复制后损失的商业价值 | 端侧性能、隐私或离线 | 输入输出一致、性能和边界数据 |
| 协议与密钥使用 | 重放、伪造或批量滥用的后果 | 设备绑定或本地通信 | 错误、重放、轮换和服务端限制 |
| 端侧模型或规则 | 模型、提示或后处理被复制和修改 | 离线、隐私或低时延 | 版本配对、加载、回滚和日志 |
| 第三方关键接口 | SDK 被绕过或错误调用的后果 | 平台或渠道要求 | 真实账号、签名和回调路径 |
技术栈清单决定兼容性测试边界
Android 项目应说明 Java、Kotlin、NDK、Gradle 和 Android Gradle Plugin 版本,minSdk、targetSdk、发布 ABI、是否使用反射、序列化、动态类加载、热修复、插件化、WebView、Native 和多进程。iOS 项目应说明 Swift、Objective-C、最低系统、扩展、动态库、运行时特性和签名能力。
Flutter、React Native、Unity、Cocos 或其他跨平台框架还要记录框架版本、桥接方式、引擎与业务 Native 库。不能只写跨平台,因为不同版本的产物结构、启动和第三方集成差异很大。
第三方登录、支付、推送、地图、音视频、统计、风控、热修复和厂商服务可能依赖反射、签名、Manifest、URL Scheme、JNI、资源或自身完整性检查。首次评估时完整列出,比发生闪退后逐个猜测更节省时间。
- 语言、构建系统和主要插件版本
- 最低与目标系统、设备和 ABI
- Native、JNI、动态加载和跨平台框架
- 多进程、WebView、热修复与插件化
- 登录、支付、推送、音视频等关键 SDK
签名、渠道和升级计划要在 PoC 前说清楚
PoC 产物使用什么签名、正式发布由谁签名、渠道资源在签名前还是签名后处理、是否使用 Play App Signing、iOS 使用哪种分发方式,这些都会影响安装、升级、完整性信号和最终文件身份。
Android 官方说明应用签名密钥用于确认更新来自同一密钥持有者。PoC 如果使用临时证书,只能验证对应环境,不能自动证明能覆盖线上版本。正式验收要在授权和安全流程允许的前提下使用与发布链一致的签名计划。
渠道处理必须固定顺序。最终签名后再修改包体会破坏签名,验收后重新构建或重签则产生新候选。回滚版本也要提前验证签名、版本号、数据迁移和覆盖升级。
| 问题 | 为什么重要 | PoC 可接受状态 | 正式验收要求 |
|---|---|---|---|
| 谁完成最终签名 | 决定密钥责任和产物身份 | 临时签名需明确限制 | 与正式流程一致且可审计 |
| 渠道何时修改包体 | 修改会改变文件和签名覆盖内容 | 顺序可说明 | 签名前完成并重新固定身份 |
| 如何覆盖线上版本 | 验证签名与版本连续性 | 可暂不执行但标记未覆盖 | 从真实线上版本升级 |
| 如何回滚 | 事故时必须可执行 | 准备基线候选 | 回滚包提前验证并有责任人 |
在开始前定义 PoC 的成功、失败和停止条件
PoC 不是生成一个能安装的加固包。应提前确定要观察的保护范围、静态暴露面、启动、关键业务、性能预算、目标系统、ABI、第三方 SDK、安装升级和异常回退。每个项目都可以有不同权重,但不能没有定义。
成功条件要可测,例如关键输入输出一致、目标系统逐项通过、启动变化在项目预算内、异常路径安全、保护配置能够回溯。失败条件包括启动阻断、关键业务错误、不可接受性能变化、目标范围兼容失败或无法归因。
停止条件防止盲目扩大范围。若候选身份不一致、缺少基线、关键日志无法取得、签名流程未确认或测试环境与发布范围不匹配,应先补条件再继续。
| 状态 | 含义 | 报告要求 | 是否可发布 |
|---|---|---|---|
| 已验证 | 同一候选在约定范围取得证据 | 写明方法、环境、结果和边界 | 仅对该范围可判断 |
| 失败 | 出现可重复的阻断或不符合预算 | 保留最早差异和影响 | 不可按原配置发布 |
| 未执行 | 缺少设备、账号、数据或授权 | 写明原因和下一步 | 不能借其他结果替代 |
| 不适用 | 项目明确不包含该平台或能力 | 给出判定依据 | 不进入本次范围 |
project_stage: release-candidate
artifacts:
baseline: identified
protected_candidate: pending
assets:
- entitlement-decision
- protocol-core
stack:
platform: Android
min_os: project-defined
abis: [arm64-v8a]
critical_journeys:
- cold-launch
- sign-in
- protected-operation
acceptance:
functional_parity: required
performance_budget: project-defined
compatibility_matrix: required
rollback_rehearsal: required
boundaries:
- no_unverified_attack_resistance_claim
- uncovered_devices_remain_open资料完整后,御盾评估会形成什么交付
完整输入能够支持三个连续阶段。第一阶段确认资产、技术栈和发布链,形成初始保护范围与风险清单;第二阶段生成可追溯 PoC,并在同一候选身份上执行静态和运行检查;第三阶段根据结果调整范围,完成目标矩阵、发布边界和回滚条件。
具体保护能力、平台支持、性能预算和交付周期需要根据真实项目确认。本页没有使用客户案例、通过率或通用性能数字,也不承诺没有候选包就能给出最终效果。
登录、注册、申请、价格和项目资料统一进入御盾中央平台。专题站不会建立第二套账号或申请系统。提交前可以先按本文清单整理材料,避免在项目开始后反复补候选身份和发布范围。
- 候选包、基线和发布链可追溯
- 保护资产和业务损失说清楚
- 技术栈、第三方和目标矩阵完整
- 成功、失败、未覆盖和回滚已定义
- 敏感资料只通过中央平台提交
提交包应让评估人员能够独立复现
一份可评估的资料不只是 APK 或 IPA。研发应提供基线候选、构建与签名说明、目标平台、主要技术栈、第三方 SDK、Native ABI、最低系统、关键业务入口和测试账号边界;发布团队补充渠道处理、升级来源、最终签名与回滚方式。材料之间用同一候选标识关联,文件一旦重建或重签就产生新记录,避免把旧报告套用到新产物。
关键业务说明应足够具体,让不了解源码的人也能判断结果是否正确。例如支付或授权场景需要写明入口、前置状态、正常输出、拒绝分支、网络异常和恢复动作,而不是只写测试核心功能。涉及反射、序列化、热修复、插件、WebView、JNI、动态下发或自校验的路径要主动标记,因为这些机制经常依赖名称、装载顺序、资源或异常语义。
敏感材料按最小必要原则提供。生产密钥、长期令牌、真实用户数据和完整内部拓扑不进入普通评估包;可以使用专用测试账号、脱敏配置和受控上传通道。若某个问题必须依赖生产环境才能复现,应先说明需要的观测点和授权范围,由项目负责人决定如何取证,而不是把生产凭据附在文档或聊天记录里。
依赖清单应来自实际构建,而不是过时的项目文档。Gradle、CocoaPods、Swift Package Manager、内部二进制和手工放入的 Native 库都可能改变启动、反射和签名行为;最好同时提供锁文件、最终包扫描结果和已知特殊初始化说明。无法提供源码的商业 SDK 也要记录供应商版本、支持系统、所含 ABI 和升级限制,便于把兼容风险放进 PoC 矩阵。
测试账号要覆盖权限差异和恢复路径。普通账号、付费账号、企业角色或地区策略可能触发不同模块,只提供一个能登录的账号会漏掉高价值逻辑。账号说明应列出允许操作、禁止操作、有效时间和重置办法;涉及资金或真实外部通知时使用沙箱或明确停止点,确保评估不会产生业务副作用。
- 基线候选与签名来源可独立核对
- 关键业务具有输入、输出和异常路径
- 反射、热修复、JNI 等敏感机制已标记
- 渠道加工和升级链写入发布说明
- 测试账号与生产凭据严格分离
- 任何重建或重签都建立新候选记录
在申请前回答十个会改变方案的问题
第一组问题决定保护重点:攻击者最想复制、修改或绕过的三项业务资产是什么,资产位于 Java、Kotlin、Objective-C、Swift、Native 还是服务端,失败后造成的商业损失是什么。只有把对象和损失说清楚,评估人员才能区分需要强保护的决策逻辑、只需常规混淆的胶水代码以及应该迁移到服务端的高风险授权。
第二组问题决定兼容边界:应用如何启动和恢复,哪些 SDK 在启动期初始化,是否使用反射、动态加载、热修复、插件、JNI 或自校验,最低与最高目标系统是什么,主要设备、ABI 和渠道各占什么范围。这里不要求在申请前完成全部测试,但必须如实列出未知项;隐藏复杂依赖只会让 PoC 在错误假设上开始。
第三组问题决定发布与验收:哪个文件是唯一候选,谁完成最终签名和渠道处理,成功与失败如何判断,允许的性能和包体预算是什么,出现问题时如何停止、回滚和复核。答案可以是尚未确定,但必须指定负责人和补齐时间。没有这些决策,团队即使收到一个能运行的保护包,也无法判断它是否适合商业发布。
如果同时存在 Android 和 iOS,不要把一个平台的保护对象、指标和测试结果复制到另一个平台。两边的代码形态、签名分发、运行时、第三方依赖和设备覆盖不同,应共享业务资产定义,却分别建立候选、配置和证据。这样可以保持采购与项目目标统一,又不会把 Android 的 DEX、JNI 结论误写成 iOS 已经覆盖。
评估入口还应指定日常沟通和最终批准人。技术联系人负责复现与配置,业务负责人确认关键输出,发布负责人确认签名、渠道与回滚,安全负责人确认剩余风险。任何关键角色缺席时,对应结论只能保持待确认;用一个人代替全部角色签字,会把技术通过、业务正确和允许上线混成同一个含糊判断。
时间计划应围绕候选冻结和证据补齐,而不是只写一个交付日期。需求变更、SDK 升级或签名调整会让已完成测试失效,项目要预留重新构建和回归窗口。若业务必须赶固定渠道节点,应提前缩小有证据的保护范围并声明未覆盖项,不能在最后一天临时扩大配置又省略回归。
申请资料最后由不参与编写的人走读一次。走读者应能从文件身份找到源码版本,从业务入口找到预期结果,从失败条件找到负责人和回滚动作;任何需要口头补充才能理解的关键项都应写回台账。这样的资料既减少沟通轮次,也使后续版本能够复用结构而不复用过期结论。
后续版本可以继承资产分类、测试脚本和责任分工,但不能继承候选身份与通过状态。每次发布重新记录文件、签名、依赖和保护配置,先判断变化影响哪些证据,再选择完整回归或有依据的增量回归。若无法证明某项旧证据仍适用,就把它列为未验证,而不是为了保持进度直接沿用。
| 类别 | 问题 | 影响的决定 | 未明确时的处理 |
|---|---|---|---|
| 资产 | 最重要的业务资产和损失是什么 | 保护优先级 | 先做资产访谈 |
| 位置 | 资产实际落在哪种代码与服务边界 | 控制类型 | 补充调用链和模块图 |
| 入口 | 正常、异常和恢复入口有哪些 | 测试脚本 | 由业务研发写可复现步骤 |
| 框架 | 反射、热修复、JNI 等机制是否存在 | 兼容配置 | 列为高风险待验证项 |
| 平台 | 系统、设备、ABI 和渠道范围是什么 | 验收矩阵 | 按用户与收入风险排序 |
| 候选 | 哪个文件是唯一评估对象 | 证据主键 | 冻结后再开始测试 |
| 签名 | 谁执行最终签名和渠道加工 | 发布顺序 | 画出完整制品链 |
| 预算 | 启动、包体和资源预算是多少 | 停止条件 | 先测未保护基线 |
| 证据 | 谁批准成功、失败和未覆盖 | 验收责任 | 指定业务与发布负责人 |
| 回滚 | 失败后如何停止和恢复 | 上线安全 | 演练回滚后再扩量 |
- 资产、兼容和发布问题分别有负责人
- 未知项明确写出而不是默认通过
- 验收预算来自可测基线
- 最终候选和签名顺序无歧义
- 回滚在正式发布前完成演练
- 旧证据不继承新候选通过状态
- 增量回归必须说明证据仍适用的原因
- 依赖清单同时核对锁文件与最终包扫描
- 评估结论分别由技术、业务和发布角色确认
事实依据与适用边界
以下内容区分官方事实、本文工程判断和不能外推的范围,避免把设计建议写成未经验证的产品结论。
| 本文判断 | 事实或工程依据 | 适用限制 |
|---|---|---|
| 候选包身份是评估证据的共同主键。 | 重新构建、签名、渠道修改和依赖变化都会改变最终文件及可能的运行行为。 | SHA-256 用于识别文件,不代表文件已经安全。 |
| VMP 保护目标应来自业务损失和威胁模型。 | OWASP MASVS 将抗逆向与抗篡改视为针对特定威胁的纵深防御,不替代服务端和整体架构。 | 标准不能证明某个候选包或配置已经通过。 |
| 签名和升级计划必须在正式验收中闭合。 | Android 使用应用签名身份确认更新连续性,Apple 平台也要求可执行代码遵循代码签名链。 | 不同分发方式和证书轮换策略需要按项目核对。 |
| 能安装和能启动不是完整 PoC 结论。 | 发布还涉及关键业务、性能、系统、ABI、第三方、升级、监控和回滚。 | 项目可根据真实用户范围裁剪矩阵,但必须明确未覆盖项。 |
| 专题站不接收敏感项目资料。 | 账号、申请和项目数据统一由御盾中央平台承接,内容站只提供公开方法和跳转。 | 具体资料权限和保留规则以中央平台和项目约定为准。 |
工程常见问题
只有 APK,没有源码,可以申请评估吗?
可以先确认产物和目标,但保护配置、问题归因和重新构建能力可能受限。应说明是否能提供构建配合、符号、测试账号和基线。
第一次沟通必须提供正式签名吗?
不一定。可以使用受控测试签名开展部分 PoC,但必须明确不能代表线上升级和正式签名链,正式验收前需要补齐发布计划。
为什么要列出全部第三方 SDK?
第三方 SDK 可能依赖反射、签名、资源、JNI、初始化顺序或自身完整性检查,是兼容问题的重要来源。
能不能直接要求全量最高强度?
可以提出风险偏好,但最终范围仍需根据业务价值、执行频率、故障半径和回归能力分层,否则很难形成稳定发布结论。
文章里的资料可以直接通过专题站上传吗?
不可以。专题站只提供公开内容,登录、注册、申请和项目资料必须跳转御盾中央平台处理。