本文只讨论互联网时代个人隐私信息收集相关内容,用于学习 iOS App 行为分析、隐私合规核对和逆向研究记录,不涉及任何违法违规操作。文中包名、接口、设备标识、账号、IP、证书、密钥等敏感信息均已做脱敏处理。
如有违规可联系删除,邮箱:ann99445566@gmail.com
鉴于 iOS 闭源的特性,相对于 Android,iOS 上公开资料较少,工具链也没有 Android 生态成熟,分析起来会更麻烦一些。好在 Frida、lldb、class-dump、Mach-O 解析工具和各种开源文章已经覆盖了大部分基础工作。【frida小子罢了】
**苦于IOS trace 没有太成熟的工具 只能frida 乱搓,不管相对于七神而言,难度不值一提,主要定位点在awemecore,里面是个vmp混淆 分析几次发现因为上报的protobuf比较固定 而且对于同个设备来说 没有大改 上报信息基本没什么变化 所以hook memcpy即可定位 算法没有什么难点 主要是vmp分支处理比较麻烦 不过也仅是伪控制流 和我的几亿Token去说吧 **
该文70%由Codex代写
本文不讨论业务功能破解,只站在 device register 的角度,记录点击“同意”之后 App 可能采集了哪些设备信息,这些信息大致如何进入注册、上报和安全 SDK 请求链路。
众所周知,首次下载 App 打开后通常会出现隐私协议弹窗。用户点击同意后,App 才会继续进入主流程;如果不同意,部分版本会直接退出或限制使用。
从网络行为看,点击同意后通常会触发几类请求:
下面内容均以 device register 视角分析,参数只展示脱敏样例。
这里的“新机”指从未安装或打开过该 App 的设备,或者 App 本地数据已经清空、服务端无法关联历史安装记录的环境。
首次启动时,本地一般还没有稳定的 device_id / install_id,因此注册请求会携带一组本地可获得的设备信息,服务端根据这些信息返回新的标识。

以下只展示结构化后的部分字段,非完整请求体:
首次注册完成后,服务端通常会返回或间接写入以下标识:
在实际样本中,后续 /sdi/get_token 和 /report 请求会继续携带这些标识,用于把安全 SDK、上报系统和设备注册系统串起来。
脱敏后的典型字段:
结合本目录内 字段映射现状.md,可以看到安全 SDK 请求里也包含一份设备快照。不同接口字段号不同,但语义基本相近。
设备注册本身是常规结构化请求,难点主要集中在 mssdk 的 /sdi/get_token 和 /report。这两个请求外层是 protobuf envelope,真正的设备环境和 SDK 数据在 field4 加密体里。
大体流程如下:
几个关键点:
还原时不要一开始就盯着网络包硬猜。更稳的方式是先定位 SDK 内部加密函数,hook 入口上下文,把 key、IV、入参、出参长度跑通,然后再回头写解析器。
前面提到的关键点是 mssdk 加密函数附近,重点不是 hook UIDevice 这类系统 API,而是确认 SDK 加密上下文。以下代码只保留核心形式,地址、模块名和函数名按实际样本替换。
分析中确认 sub_D71E57C 入口上下文里可以取到 AES 参数:
输出示例做脱敏处理:
这里主要用来确认加密前后的边界,避免 protobuf 外层、zlib 数据、AES 数据混在一起看。
这段 hook 的目的只是确定“哪一段是内层 protobuf,哪一段是加密结果”。具体参数位置要结合反编译伪代码和寄存器调用约定调整,不同版本偏移会变。
如果已经在抓包里拿到完整 body,可以先在本地解析外层 envelope。正常情况下可以看到类似结构:
hook 时只要能把 f4 前后的明文、密文对应上,后续分析就比较直观:外层负责路由和时间戳,内层才是设备环境主体。
这个链路可以分成三层看。
第一层是设备注册。它更像“建档”:App 把机型、系统、地区、语言、网络、IDFV、IDFA、CDID 等本地信息提交上去,服务端返回 device_id 和 install_id。这一步字段比较直观,抓包后结构化即可。
第二层是安全 SDK。它不是简单重复注册字段,而是把设备环境、沙盒状态、权限状态、部分运行时信息打进加密 payload。get_token 里常见的是设备快照加 SDK blob,report 里更像启动环境上报。字段号不同,但很多语义可以互相印证。
第三层是加密封装。这里的重点不在“有没有 AES”这种表面结论,而是要确认数据边界:protobuf 明文在哪里、zlib 从哪里开始、CRC 覆盖哪些字节、XTEA IV 放在哪里、AES 外层又包了什么。只要边界确定,后续字段映射和样本比对就会稳定很多。
从隐私角度看,值得关注的点有四个:
整体看,iOS 上这类信息收集不是一个接口完成的,而是注册、SDK token、report 三条链路互相补充。单独看某个字段意义不大,最好把字段来源、首次出现位置、是否持久化、是否随重装变化这几件事一起记录。
| 阶段 |
作用 |
典型内容 |
| 设备注册 |
生成或换取 device_id / install_id |
设备型号、系统版本、IDFV、地区、语言、网络、App 版本 |
| 安全 SDK |
获取风控 token 或设备可信标记 |
设备环境、权限状态、沙盒信息、加密 blob |
| 行为上报 |
上报启动、激活、环境快照 |
设备快照、网络状态、越狱状态、App 配置 |
| 参数 |
脱敏样例 |
来源/说明 |
device_model |
iPhone10,3 |
设备机型标识,可由 uname / system info 获取 |
hardware_model |
D22AP |
硬件代号,和机型绑定 |
os |
iOS |
操作系统 |
os_version |
15.0.1 |
系统版本 |
resolution |
1125*2436 |
屏幕分辨率 |
vendor_id |
145321EA-****-****-****-4FEA7AEFF211 |
IDFV, |
idfa |
9992FD16-****-****-****-20C89336C7EC |
IDFA, |
cdid |
8DCE0718-****-****-****-5DA9BAB01B32 |
App 自定义持久化 ID |
app_version |
|
App 版本 |
build_number |
`` |
构建号 |
channel |
App Store |
安装渠道 |
region |
CN |
地区 |
language |
zh-Hans-CN |
系统语言 |
tz_name |
Asia/Shanghai |
时区名 |
tz_offset |
28800 |
UTC+8 |
access |
WIFI |
网络类型 |
carrier |
中国移动 |
运营商展示名 |
is_jailbroken |
false |
越狱状态 |
传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!