移动应用加固 西安守界御盾信息安全技术有限责任公司 87 views

静态分析能看到什么:御盾加固后 APK 的入口、载体与明文面复核

静态分析能看到什么:御盾加固后 APK 的入口、载体与明文面复核 结论:这次静态专项回答的是“御盾 Android 加固后,攻击者只靠离线工具还能直接看到多少入口、业务逻辑和明文线索”。本轮证据显示,入口被代理承接,DEX 可读面明显收敛,native 与 assets 形成分层载体,资源命名和敏感明文关键词没有直接暴露成业务地图;运行态、注入和改包专项将另

从阅读进入评估 如果你正在评估 App 加固方案,可以先看官网能力边界,再提交一个真实包做 PoC。
查看御盾官网 提交内测评估

结论:这次静态专项回答的是“御盾 Android 加固后,攻击者只靠离线工具还能直接看到多少入口、业务逻辑和明文线索”。本轮证据显示,入口被代理承接,DEX 可读面明显收敛,native 与 assets 形成分层载体,资源命名和敏感明文关键词没有直接暴露成业务地图;运行态、注入和改包专项将另行展开。

摘要

最近三天的公开内容方向已经调整为“只从静态分析发表文章”。这类文章的价值在于把离线工具能观察到的入口、DEX、native、assets、资源和明文面讲清楚,形成稳定的公开证据底座;运行态专项、注入专项和改包专项会在独立文章中展开,避免把不同目标揉成一篇。

静态分析的价值不在于喊一句“反编译打不开”,而在于把攻击者最先接触到的发布面拆开:Manifest 是否暴露真实入口,DEX 是否能恢复大量业务类,native/SO 是否只是普通明文库,assets 是否存在后备载体,资源和 XML 是否能拼出路由,字符串里是否能直接看到接口、凭据、调试工具和业务常量。只要这些线索足够多,攻击者不需要完整还原算法,也能先建立业务地图;反过来,如果这些线索被拆散、代理、重命名和收敛,静态阶段就会失去大量低成本入口。

本轮使用用户指定的固定加固 APK,作为 2026-07-23 到 2026-07-25 的静态分析底座。私有证据包记录了真实样本标识、工具输出和日志边界,公开页面只保留脱敏后的证据:应用入口不是裸启动类直出,Manifest 显示非调试和备份面收敛;APK 内存在 3 个 DEX,其中主 DEX 与两个极小 DEX 形成明显分层;JADX 只恢复出有限数量 Java 文件,静态可读源码面没有铺开;arm64 native 载体在 APK lib 目录和 assets 后备位置同时出现,且可见 stripped 特征;assets 中存在大体量不透明材料;敏感关键词快扫没有在首轮命中中暴露明显凭据、token、私钥或口令类明文。

范围也要清楚:本文聚焦静态视角,只讨论离线分析能看到的发布面,不展开运行态、注入、改包和内存专项。本文的主目标只有一个:为“静态分析视角下,御盾加固后的 APK 发布面是否仍容易形成业务地图”提供可公开、可复核、非攻击教程化的证据。

读者对象

这篇文章适合正在做 Android App 加固选型、PoC 验收和安全发布检查的团队阅读。安全负责人可以用它确认静态验收应该看哪些面,而不是只问“JADX 是否能打开”。Android 研发可以用它理解加固后 Manifest、DEX、SO、assets 和字符串之间的关系。采购或产品负责人也可以用它判断一份加固测评是不是只给结论,还是给了能够复核的证据链。

如果您的验收目标覆盖真机运行、改包、注入 Hook 或内存改值,应把这些内容放到后续运行态专项中。本文只覆盖静态阶段,尤其是攻击者把 APK 拿到本地后,使用常见静态工具能看到的入口、载体、资源和明文线索。

核心结论

  • 本轮是静态专项,主题集中在离线发布面。
  • APK 可以通过标准签名验证工具校验,说明发布包具备可被 Android 工具接受的签名结构。
  • Manifest 层能观察到入口代理、非调试配置和备份面收敛。
  • 应用不是单一裸 DEX 直出,包内存在 DEX 分层和 native/assets 分层。
  • 静态反编译恢复出的 Java 文件数量有限,没有形成大面积业务源码阅读面。
  • native 载体出现在 APK lib 目录,assets 中还存在更大体量的后备 native 材料。
  • 可解析 native 材料呈现 64 位 ARM 共享对象特征,且符号面有收敛迹象。
  • 资源与 assets 同时包含公开游戏资源和不透明保护材料,需要同时覆盖 res、lib 和 assets。
  • 整包敏感关键词快扫没有在首轮结果中暴露明显凭据、token、私钥或口令类明文。
  • 运行态启动、Frida、改包、运行期恢复和内存修改将作为后续专项。

测评目标与范围

目标 本轮状态 已做动作 可公开结论 范围边界
主目标:静态入口面复核 已执行 使用 Manifest 解析与解包视角交叉检查入口、组件和应用属性。 入口存在代理承接,调试和备份面有基础收敛。 不公开包名、类名、组件名。
主目标:DEX 可读面复核 已执行 统计 DEX 分层并使用反编译输出观察 Java 可读面。 DEX 分层明显,Java 可读面有限。 不公开源码、类路径和业务标识。
主目标:native 与 assets 载体复核 已执行 检查 APK lib 目录和 assets 后备 native 材料。 native 与 assets 形成分层承载,符号面有收敛迹象。 不公开 SO 名称、BuildID、符号或路径。
主目标:静态明文面复核 已执行 对整包做敏感关键词快扫并观察资源表面。 首轮未见明显凭据类、token 类、私钥类明文锚点。 不做“绝对没有任何秘密”的表达。
运行态专项 后续展开 本文不展开运行态验收。 本文只引用静态观察事实。 运行态材料不进入本文公开结论。
改包专项 后续展开 本文不展开重签和回装验收。 本文只说明静态发布面。 改包材料另行沉淀。
注入与内存专项 后续展开 本文不展开注入或内存改值验收。 本文只做静态证据归纳。 运行态工具材料另行沉淀。

事实依据与脱敏证据

# 证据来源类型 脱敏后的观察事实 支撑的工程判断 公开化边界
1 APK 固定输入记录 用户指定同一加固 APK 作为三天分析底座,文件真实存在且体量较大。 本轮不是凭空写作,而是围绕固定样本做静态专项。 不公开本地路径、真实样本名和 hash。
2 质量门禁 自有站 live gate 和生产 database gate 均通过,当前线上内容处于健康状态。 发布前环境健康,可以进入内容包阶段。 不公开服务器连接方式。
3 Manifest 解析 应用层显示非调试配置,并且备份面有收敛。 静态调试面不是默认开放状态。 不公开 Manifest 原文。
4 Manifest 解析 入口由代理和组件链路承接。 静态入口判断需要结合代理、组件和载体分层。 不公开类名、组件名和 authority。
5 DEX 清单 APK 中存在 3 个 DEX,主 DEX 和两个极小 DEX 形成明显分层。 加固后 DEX 发布面不是单层业务代码平铺。 不公开精确文件名和完整清单。
6 反编译输出 JADX 只恢复出有限数量 Java 文件,主要可见面集中在壳层、依赖和少量承接结构。 静态源码可读面被压缩,完整业务源码视图没有直接铺开。 不公开源码、包名或类路径。
7 native 文件识别 APK lib 目录存在 arm64 native 载体,file 视角可识别为 64 位 ARM 共享对象。 加固后有 native 层承载,不是纯 Java 发布面。 不公开 SO 名称、BuildID 或符号。
8 native 文件识别 可解析 native 材料呈 stripped 特征。 符号面有收敛,静态符号枚举成本提高。 不公开符号表细节。
9 assets 统计 assets 中存在体量明显的后备 native 材料和不透明保护材料。 只看 lib 目录会漏掉保护侧载体,静态验收必须覆盖 assets。 不公开 assets 路径和文件名。
10 资源表面 资源与 assets 同时包含公开资源和保护材料,部分命名呈短名或重命名特征。 资源面没有直接展开成业务地图。 不公开资源名和定位信息。
11 敏感明文快扫 首轮敏感关键词扫描未见明显 API key、secret、password、bearer、private key、token 类明文命中。 静态凭据锚点初步收敛。 只说明首轮关键词快扫结果,不做绝对化表达。
12 签名验证 标准签名工具显示 APK 可验证。 发布包具备可被工具接受的签名结构。 不公开证书摘要、签名和 hash。
13 范围边界 本文只使用静态证据组织公开结论。 运行态材料将按专项另行整理。 不公开设备、端口、进程、日志原文。
14 发布资格 静态证据足够支撑静态专项。 可以发布静态文章。 不公开可复现路径。

原始报告事实映射(自主工具事实映射)

工具事实 公开转述 支撑判断 未公开边界
文件存在、体量较大、作为三天固定输入。 本轮有固定分析对象。 可持续分专项复核,不必每天换包。 样本路径、名称、hash。
aapt 与 apktool 均能解析 Manifest。 Manifest 静态面可复核。 可提炼入口、调试、备份、组件代理等事实。 包名、组件名、authority。
zip 清单显示多 DEX、native 和 assets 后备材料。 发布面呈分层结构。 静态验收需要同时覆盖 DEX、lib 与 assets。 完整文件清单。
JADX 产出有限 Java 文件。 静态可读源码面有限。 业务逻辑没有大面积以 Java 源码形式展开。 源码、类路径、函数名。
native 识别显示 arm64 共享对象和 stripped 特征。 native 符号面有收敛。 SO 静态分析需要更高成本。 SO 名、BuildID、符号。
敏感关键词快扫未见明显凭据类命中。 静态明文凭据锚点初步收敛。 支撑静态明文面专项。 原始字符串和扫描命令。
运行态材料另行沉淀。 本文只写静态。 公开结论保持在静态证据范围内。 日志原文、设备、进程。
measurement_scope:
  article_type: "static-only assessment"
  main_goal: "review what offline static analysis can see after hardening"
  public_findings:
    manifest_surface: "entry proxy and non-debuggable surface observed"
    dex_surface: "multi-dex split and limited decompiled Java surface observed"
    native_surface: "arm64 native carriers and stripped surface observed"
    asset_surface: "large opaque asset-side carrier observed"
    plaintext_surface: "first-pass sensitive keyword scan found no obvious credential anchors"
  out_of_scope:
    - dynamic startup pass
    - runtime hook observation
    - repackaging closure pass
    - memory modification resistance pass
  publication_boundary: "no package name, path, hash, device, command, raw log, class name, symbol, or exploit chain"

现场时间线与范围边界

阶段 执行情况 公开判断 为什么不写通过
静态准备 固定 APK 与工具输出完成归档。 静态分析对象稳定。 不公开样本定位信息。
Manifest 复核 入口、调试、备份和组件链路完成归纳。 可支撑入口面判断。 不公开组件名。
DEX 复核 DEX 分层和反编译可读面完成归纳。 可支撑源码可读面判断。 不公开类路径和源码。
native 复核 lib 与 assets 侧载体完成归纳。 可支撑载体分层判断。 不公开 SO 名称和符号。
后续计划 后续文章继续扩展运行态和改包专项。 当前页面保持静态专项定位。 保持专项目标清晰。

这一段放在正文里,是为了让读者明确页面范围。静态文章不是泛泛介绍,而是把目标收窄到离线发布面:Manifest、DEX、反编译、native、assets、资源和明文锚点。运行态专项会在独立页面中组织。

技术拆解

Manifest:入口不是全部答案

很多静态分析从 Manifest 开始,也容易在 Manifest 结束。看到一个启动 activity,就试图把它当成真实业务入口;看到 provider、service、receiver,就顺着组件名构造运行假设。本轮 Manifest 的可公开观察是:入口被代理承接,应用是非调试配置,备份面有收敛,组件链路中存在保护侧承接特征。

这类事实对防守有两个意义。第一,入口层不再把业务主干直接暴露给低成本枚举。第二,后续真实运行路径需要结合 native、assets 和类加载关系判断,单靠 Manifest 一张图并不充分。对 PoC 验收来说,Manifest 检查应该输出“入口面、组件面、权限面、调试面、备份面”五类结果,而不是只截图启动类。

DEX:反编译能打开,还要看源码可读面

本轮 APK 中存在 3 个 DEX,主 DEX 与极小 DEX 分层明显。JADX 能产出 Java 文件,但文件数量有限,且可读面主要集中在壳层、依赖和承接结构。这说明“工具能打开 APK”和“业务逻辑被还原”之间有明显差距。

更严谨的判断方式是三层:第一层,看 DEX 是否存在以及数量如何分布;第二层,看 JADX/反编译输出是否能恢复稳定 Java 文件;第三层,看这些 Java 文件是否包含可理解的业务算法、协议常量、关键控制流和敏感字符串。本轮只支持前两层静态事实。后续若要写 DEX 恢复专项,应补运行期恢复、深度恢复和恢复后再反编译对比。

native 与 assets:不要只看 lib 目录

很多验收只看 lib 目录是否存在 SO,这不够。加固后的发布面可能把 native 材料放在多个位置:一部分是系统可识别的 arm64 共享对象,一部分是 assets 里的后备载体或保护材料。本轮静态证据显示,APK lib 目录和 assets 侧都存在 native 相关材料,且可解析 native 材料呈 stripped 特征。

这对攻击者意味着两个变化。第一,符号名没有直接提供足够索引。第二,只扫 lib 目录会漏掉 assets 后备材料。对防守方来说,验收时应该同时看 ELF 类型、符号面、assets 体量、载体位置和是否存在高风险明文,而不是简单问“有没有 SO 加密”。

明文面:真正危险的是业务地图

静态明文检查不是为了追求“一个字符串都没有”。任何 Android APK 都可能包含框架、资源、语言包、图片名和系统引用。真正危险的是业务地图型明文:接口域名、固定 IP、token、口令、私钥、调试后门、content URI、协议常量、渠道控制参数、风控绕过开关。

本轮首轮敏感关键词快扫未见明显 API key、secret、password、bearer、private key、token 类明文命中。这个结论应当保守表达:它说明明显凭据类锚点没有在首轮静态扫描中暴露,不说明所有秘密绝对不存在。更完整的验收还应该按业务词典、域名规则、配置格式、资源表和 native 字符串做二次扫描。

工程落地

企业做静态验收时,可以把本轮方法固化为一张检查表。第一步,确认包能被标准工具识别并记录版本、签名和架构,但不要公开这些私有标识。第二步,拆 Manifest,把入口、导出组件、权限、调试、备份、组件工厂等内容聚合成摘要。第三步,统计 DEX 数量、大小分布、反编译 Java 文件数量和错误情况。第四步,覆盖 lib 与 assets 两侧 native 材料,记录 ELF 类型、符号面和是否存在大体量不透明载体。第五步,做敏感明文关键词快扫和人工复核,区分框架字符串与业务锚点。第六步,把所有结论分成“已执行”“可公开正向事实”“只可概括判断”“后续专项”四类。

可以使用下面这种脱敏验收结构,让研发、安全和商务都看得懂:

StaticAcceptance:
  manifest:
    entry_surface: proxy_observed
    debug_surface: closed
    backup_surface: reduced
  dex:
    split_observed: true
    readable_java_surface: limited
    algorithm_recovery_claim: not_claimed
  native:
    apk_lib_carrier: observed
    asset_side_carrier: observed
    symbol_surface: reduced
  plaintext:
    credential_anchor: not_observed_in_first_pass
    business_map_claim: reduced_not_absent
  dynamic:
    status: out_of_scope_for_this_article

这段不是攻击脚本,也不是复现教程;它只是帮助团队把静态验收结果写成可复核的发布材料。

攻防视角

从攻击视角看,静态阶段通常会先问五个问题:真实入口在哪里,业务类能否大量反编译,native 是否有可读符号,assets 是否藏有直接可取的材料,字符串里是否有接口和凭据。只要其中一个问题有明显答案,就能缩短后续分析路径。

从防守视角看,御盾这类加固要做的不是让 APK 消失,而是让这些问题无法在静态阶段低成本闭合。本轮静态证据能支撑的正向判断是:入口面被代理化,DEX 可读面有限,native 与 assets 形成分层承载,符号和资源面有收敛,明显凭据类明文没有在首轮快扫中暴露。本文同时保持范围克制:运行态观察、改包闭合和运行期恢复会放到独立专项中。

真正专业的公开文章应该敢于写边界。边界不是扣分项,反而能让文章不像模板营销文。对客户来说,知道“这篇只证明静态发布面”比看到一句“全面防护”更有价值。

风险边界

本文所有公开结论都来自脱敏静态证据。没有公开真实包名、样本名、路径、签名、hash、设备、命令、日志原文、类名、函数名、符号、section、偏移或内存地址。文中也没有提供可复现的脱壳、注入、重签或绕过步骤。

需要特别强调四个限制。第一,敏感关键词首轮未命中不是“绝对没有秘密”,完整秘密扫描还需要业务词典和人工复核。第二,JADX 可读面有限只是静态阶段观察,运行期恢复需要独立专项。第三,SO stripped 和 assets 后备载体只是静态载体事实,SO 恢复需要独立专项。第四,运行态、危险环境、注入、内存和改包会放到独立专项。

常见误区

误区一:JADX 能打开,就说明已经看懂业务逻辑

JADX 能打开只能说明 APK 可被工具解析。真正要看的是能恢复多少业务类、控制流、协议常量、核心算法和敏感字符串。本轮可读 Java 面有限,因此应继续看 DEX 分层、native 载体和明文锚点。

误区二:lib 目录有 SO,就等于 native 保护完成

SO 是否存在只是起点。还要看符号面、assets 后备载体、运行期加载路径、内存输出和恢复后的可读性。本文只写静态 carrier 事实,不写 SO 脱壳通过。

误区三:没有明显 token 命中,就等于没有任何敏感信息

关键词扫描只能覆盖常见显式明文。业务私有格式、编码后的配置、native 字符串和资源拼接仍然需要后续复核。公开表达必须保守。

误区四:静态专项可以替代全部验收

不适合。静态专项适合沉淀公开证据和搜索意图,运行态、恢复、改包、注入、内存和危险环境矩阵应放在独立验收文章中。

FAQ

这篇文章是不是完整验收报告?

本文是静态专项,只覆盖 Manifest、DEX、反编译、native/SO、assets/resources、签名和敏感明文面。运行态、改包、注入、内存和危险环境会在后续专项中展开。

静态分析文章对选型有没有意义?

有意义。企业选型时需要先知道供应商能否把静态发布面讲清楚。如果一份报告连入口、DEX、SO、assets 和明文面都分不清,后续验收也很难可信。

为什么不公开真实包名、hash 和日志?

因为这些信息会把公开文章变成可定位样本材料,甚至帮助别人复现攻击路径。公开内容只需要展示脱敏后的证据类型、观察事实、工程判断和边界。

敏感关键词没命中是否代表完全没有泄露?

不代表。它只能说明首轮常见关键词快扫没有发现明显凭据锚点。完整结论还需要结合业务词典、配置格式、native 字符串和人工复核。

后续还会做运行态和改包专项吗?

会。未来专项会继续补关键业务路径、observer、改包三类篡改、DEX/SO 恢复和内存矩阵。每个专项都会单独设定目标和公开边界。

相关承接页

御盾内测申请

需要针对自己的 App 验证加固策略?

提交项目平台和当前攻防问题,安全工程师会按业务复杂度安排人工审核。完整技术档案可在申请后补充。

御盾 Android加固 静态分析 JADX SO保护 assets保护 明文收敛 App加固验收
相关阅读