教程
🛡️

网络安全

Web 安全、渗透测试、密码学与安全合规的系统化教程。

APP 信息收集:先把安装包和背后的接口摸清楚

APP 渗透第一步不是上手就搞,而是把安装包、权限、硬编码密钥、后端接口摸个底朝天。这篇讲 APK 结构、Manifest 权限、字符串里的接口与密钥、第三方 SDK 与证书校验检测。

· 更新于 2026-07-19 阅读量 --

很多人一拿到一个 APP,第一反应就是打开抓包、点点点。但真正有经验的测试者会先静下心来”读”这个 APP:它申请了哪些权限?背后连着哪些服务器?代码里有没有写死的密钥?这些静态信息往往比动态抓包更早暴露问题。这一篇讲 APP 信息收集的完整思路。

本文所有手法仅用于你对自有或已授权的 APP 做安全评估。对他人 APP 做逆向、破解、未授权抓取可能违反法律法规与软件许可协议。

APP 本质上是个压缩包

先说一个反直觉的事实:安卓的 APK 文件,说白了就是个 ZIP 压缩包。你把它后缀改成 .zip 直接解压,就能看到里面的资源、配置和编译后的代码。这一步不需要任何高深工具,却是信息收集的起点。

cp app.apk app.zip
unzip app.zip -d app_unpacked
ls app_unpacked
# 你会看到:AndroidManifest.xml、classes.dex、res/、assets/、lib/ 等

解压后几个关键东西:

  • AndroidManifest.xml:应用的”身份证”,声明了权限、组件(Activity、Service、Receiver、Provider)、入口。
  • classes.dex:Dalvik 字节码,也就是 APP 真正跑的逻辑,编译自 Java/Kotlin。
  • res/assets/:界面布局、图片、还有可能藏着的配置文件。
  • lib/:各 CPU 架构的 native 动态库(.so)。

看到这里你就明白,信息收集的第一层是”看它自己说了什么”。

读 Manifest:权限与暴露组件

AndroidManifest.xml 在 APK 里是二进制格式,直接看是乱码,需要用工具(后面反编译章节会细讲)转成可读文本。但即便不反编译,用 aapt 也能快速拉出关键信息:

aapt dump permissions app.apk
# 输出应用申请的所有权限,比如:
# android.permission.INTERNET
# android.permission.READ_CONTACTS
# android.permission.ACCESS_FINE_LOCATION

一个新闻类 APP 却申请了读取通讯录、精确定位、录音,这种”权限过度申请”本身就是隐私合规问题,也是信息收集的重要发现。再看组件:如果某个 ActivityContentProvider 被设成 exported="true" 且没有权限保护,意味着别的 APP 甚至浏览器都能直接调起它,这常常就是越权访问的入口。

字符串里的大鱼:接口与密钥

APP 再怎么混淆,总有一些字符串没法藏——后端域名、API 路径、密钥、证书名。这些信息大量散落在 classes.dex 和资源文件里。反编译后全局搜一下,常有惊喜:

# 用 strings 粗略提取 dex 里的可读字符串
strings classes.dex | grep -E "https?://|api|token|secret|key" | head -20

实战里常见的”大鱼”:

  • 写死的后端地址https://api.xxx.com/v1/,顺藤摸瓜就能知道整套接口长什么样。
  • 硬编码密钥:第三方 SDK 的 AppKey、甚至 AWS/Aliyun 的 AccessKey 直接写在代码里。这是高危,等于把钥匙挂在门上。
  • 测试环境地址https://test.xxx.com,测试环境往往防护更松、数据更真。
  • 加密盐值或固定 IV:客户端做”加密”时把密钥写死,等于没加密。

为什么硬编码密钥这么致命?因为 APP 装在用户手机上,代码是可以被逆向出来的,你写在里面的任何秘密,严格来说都不再是秘密。

第三方 SDK 与证书校验信号

现代 APP 几乎都接第三方 SDK:统计、推送、支付、地图、登录。每个 SDK 都可能引入它自己的接口、权限甚至漏洞。信息收集时要列清楚用了哪些 SDK,尤其是:

  • 推送/IM 类(可能暴露长连接地址);
  • 支付类(回调地址、商户号);
  • 社交登录(OAuth 配置、AppSecret 风险)。

还有一个关键信号:证书校验(SSL Pinning)。如果你在字符串或代码里看到 network_security_configOkHttpCertificatePinnerX509TrustManager 被自定义,说明这个 APP 可能做了证书绑定,普通抓包会被拦。这不直接是漏洞,但它告诉你”下一步抓包要绕”,属于必须提前掌握的信息。下一篇我们就专门讲怎么处理证书校验。

用 MobSF 一把梭

手动解包、搜字符串比较累,业界有个神器叫 MobSF(Mobile Security Framework),它把上面这些活儿自动化了:上传 APK,自动反编译、静态扫描权限、找硬编码密钥、列组件、查已知漏洞,生成一份报告。

# 用 Docker 起一个本地 MobSF
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf
# 浏览器打开 http://localhost:8000,上传 APK 即可

MobSF 适合做”第一轮快速体检”,把明显问题先揪出来。但它不会替你思考业务逻辑,真正深入的发现还是得靠人去读代码、去构造请求。

被动信息收集:应用市场与公开渠道

除了动 APK 本身,还能从外部收集:

  • 应用市场页面:版本号、更新说明、隐私政策链接、下载量、开发者邮箱。隐私政策里有时藏着后端域名、合作方名单。
  • 官方文档 / 开放平台:很多 APP 有开放 API 文档,直接把接口清单给你。
  • 代码托管平台:开发者可能把测试代码、配置文件误传到 GitHub,搜包名或公司名常有收获。
  • 历史版本:旧版 APP 可能没做混淆、没加壳,逆向难度低得多,是绕过重防护的捷径。

被动收集不直接碰目标,最安全也最容易被忽略。老话说”磨刀不误砍柴工”,信息收集就是那把刀。

新手常踩的坑

  • 只看不记:收集到的接口、密钥随手看完就关,到动态测试时又得重来。建议一开始就建个清单文档,把域名、路径、可疑字符串全记下来。
  • 忽视资源文件:很多人只盯 classes.dex,但 assets/ 里的配置文件、res/values/strings.xml 里常常也有接口和密钥。
  • 混淆等于安全:看到代码被混淆(变量名变成 abc)就以为没信息,其实接口路径、域名字符串是没法混淆的,照样能搜到。

信息收集的常见误区与进阶心法

新手做信息收集最容易犯两个错。一是”广撒网不聚焦”:工具跑了一堆,报告攒了几百条,却说不清哪条和后面的漏洞有关。收集不是目的,收集是为了”缩小攻击面、找到下手点”。建议每收集到一条信息,都问一句:它能帮我下一步做什么?能指向下一个接口、下一个组件、还是下一个凭证?带着这个问题收,效率高出十倍。

二是”只动静态不动被动”。很多人拿到 APK 就解包,却忘了应用市场、隐私政策、开源仓库这些公开渠道。被动收集几乎零风险、零痕迹,却能拿到版本历史、测试域名、合作方名单,往往比解包更早暴露薄弱点。成熟测试者的习惯是:先花半天做被动收集,把公开情报榨干,再碰目标本身。

进阶一点,可以给自己建一个”目标档案”:一张表记录域名、IP 段、接口清单、密钥疑点、组件清单、证书绑定情况。随着测试推进不断补全。这份档案是你整个项目的地图,也是最后写报告的依据。信息收集做得越细,后面的漏洞验证越顺,返工越少。记住一句话:渗透里省下的信息收集时间,都会以加倍的踩坑还回来。

这一篇你该记住的

  • APP 是压缩包,解压就能看到 Manifest、dex、资源、native 库。
  • 读 Manifest 看权限与暴露组件,过度权限和 exported 组件是重点。
  • 全局搜字符串,找后端域名、硬编码密钥、测试环境、加密盐值。
  • 留意证书校验信号(Pinning),它决定下一步抓包要不要绕。
  • MobSF 做第一轮自动体检,被动收集(市场、文档、GitHub、历史版)同样重要。

信息收集做完,下一步通常是把流量抓出来看。但很多 APP 做了证书绑定,普通代理抓不到——下一篇我们讲框架使用与证书校验绕过。