很多人一拿到一个 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 却申请了读取通讯录、精确定位、录音,这种”权限过度申请”本身就是隐私合规问题,也是信息收集的重要发现。再看组件:如果某个 Activity 或 ContentProvider 被设成 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_config、OkHttp 的 CertificatePinner、X509TrustManager 被自定义,说明这个 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里常常也有接口和密钥。 - 混淆等于安全:看到代码被混淆(变量名变成
a、b、c)就以为没信息,其实接口路径、域名字符串是没法混淆的,照样能搜到。
信息收集的常见误区与进阶心法
新手做信息收集最容易犯两个错。一是”广撒网不聚焦”:工具跑了一堆,报告攒了几百条,却说不清哪条和后面的漏洞有关。收集不是目的,收集是为了”缩小攻击面、找到下手点”。建议每收集到一条信息,都问一句:它能帮我下一步做什么?能指向下一个接口、下一个组件、还是下一个凭证?带着这个问题收,效率高出十倍。
二是”只动静态不动被动”。很多人拿到 APK 就解包,却忘了应用市场、隐私政策、开源仓库这些公开渠道。被动收集几乎零风险、零痕迹,却能拿到版本历史、测试域名、合作方名单,往往比解包更早暴露薄弱点。成熟测试者的习惯是:先花半天做被动收集,把公开情报榨干,再碰目标本身。
进阶一点,可以给自己建一个”目标档案”:一张表记录域名、IP 段、接口清单、密钥疑点、组件清单、证书绑定情况。随着测试推进不断补全。这份档案是你整个项目的地图,也是最后写报告的依据。信息收集做得越细,后面的漏洞验证越顺,返工越少。记住一句话:渗透里省下的信息收集时间,都会以加倍的踩坑还回来。
这一篇你该记住的
- APP 是压缩包,解压就能看到 Manifest、dex、资源、native 库。
- 读 Manifest 看权限与暴露组件,过度权限和
exported组件是重点。 - 全局搜字符串,找后端域名、硬编码密钥、测试环境、加密盐值。
- 留意证书校验信号(Pinning),它决定下一步抓包要不要绕。
- MobSF 做第一轮自动体检,被动收集(市场、文档、GitHub、历史版)同样重要。
信息收集做完,下一步通常是把流量抓出来看。但很多 APP 做了证书绑定,普通代理抓不到——下一篇我们讲框架使用与证书校验绕过。