文章总结: 本文深入逆向分析Facebook的x-fb-session-id请求头生成机制,发现其由nid、tid、nc三个64位整数组成,位于原生库libcoldstart.so中。文章详细解析了其防止重放攻击的递增计数逻辑及内存结构,并指出了版本间格式从Base64转为十进制的演变,为理解移动端应用指纹识别提供了底层技术细节。 综合评分: 87 文章分类: 逆向分析,移动安全,爬虫
Facebook 逆向:x-fb-session-id 请求头
haidragon
安全狗的自我修养
2026年1月6日 12:04 湖南
官网:http://securitytech.cc/
在最近关于 Facebook 的新闻,以及我在低层方向钻研认证的过程中,我决定更深入研究 Facebook 是如何构造请求头的,这些请求头代表什么,以及它们在底层到底由什么组成。
本次分析过程中,我使用了JADX、Ghidra 以及 Gemini AI等公开工具来辅助代码生成和静态分析。
快速总结
在研究过程中发现,**x-fb-session-id** 是 Facebook 网络栈中使用的一个会话跟踪请求头,用于在多个 HTTP 请求之间维持状态。
它充当了一个特定“网络会话(network session)”的指纹,使服务器能够将处于相同网络条件下的请求进行分组。
x-fb-session-id 的组成结构
该请求头由三个 64 位整数组成,这些整数存储在应用程序内存中:
nid(Network ID,网络 ID)
一个在网络会话初始化时生成的随机 64 位整数(例如应用启动或网络切换时)。在整个网络会话期间保持不变。
tid(Thread ID / Transaction ID)
负责发送该请求的操作系统工作线程 ID。后端可借此将请求追溯到客户端的具体线程。
nc(Nonce Count)
一个递增的计数器,每发送一次请求就加 1。
该机制可防止请求重放:如果服务器在收到 nc=6 之后又收到 nc=5,就能判断请求乱序或存在恶意行为。
关键函数与方法
生成逻辑位于原生库libcoldstart.so中(该库合并了 libappnetsessionid.so)。以下是反编译后识别出的关键函数:
FUN_00895578(会话调度器)
核心逻辑函数。
std::__ndk2::to_string
标准 C++ 函数,用于将以下偏移处的 64 位整数转换为十进制字符串:
FUN_0070a3d4(字符串拼接器)
将转换后的字符串追加到对应的键名(nid / tid / nc)上。
FUN_00895cb0(格式化函数)
使用分号 ; 对各字段进行格式化。
FUN_00882084(请求头注入)
将最终构造好的字符串以 x-fb-session-id 的键注入 HTTP 请求对象。
研究方法(Methodology)
在搜索 x-fb-session-id 相关资料时,发现了一个公开的 GitHub 仓库,展示了一个可能的历史格式:
nid,pid,tid,nc,fc,bc,cid
按回车或点击查看大图:
从示例中可以看到:
nid=qW/DOVwni83/
该值是Base64 编码。使用CyberChef解码为 HEX 后,得到一个8 字节内存缓冲区:
这表明 nid 本质上是8 字节(64 位)数据,为后续分析提供了重要线索。
APK 分析过程
为了进一步验证,作者从APKPure下载了最新版 Facebook APK:
使用JADX反编译后,搜索 sessionid,发现了 libappnetsessionid.so,但它并未被单独加载,而是通过MergedSoMapping被合并进其他库。
继续分析 SuperpackUnloader 后发现,该库并未被单独解包。
由于网络会话在应用启动阶段立即需要,因此推断其被合并进启动库libcoldstart.so。
libcoldstart.so 中的分析结果
在 libcoldstart.so 中搜索 x-fb-session-id,确认其存在:
使用Ghidra反编译后,可以看到请求头字符串是通过栈上手工拼接的:
builtin_strncpy((char *)(unaff_x29 – 0x18), “x-fb-ses”, 8);
builtin_strncpy((char *)(unaff_x29 – 0x11), “ssion-id”, 8);
这确认了该函数就是请求头 Key 的构造位置。
内存结构与字段偏移
从 Session State 对象中读取三个 64 位整数:
*(long *)(ptr + 0x48) → nid
*(long *)(ptr + 0x50) → tid
*(long *)(ptr + 0x58) → nc
最终生成的请求头格式为:
nid=;tid=;nc=
使用场景(Usage)
nid:网络会话标识
当 WiFi / 蜂窝网络切换时会重新生成,用于防止跨网络会话劫持。
Facebook 使用 AppNetSessionIdInterceptor 自动注入该请求头,
并通过 ReachabilityV2Provider 监听网络变化事件。
当检测到NETWORK_ID_CHANGE时,会生成新的 nid。
面临的挑战
旧版本使用 Base64 格式(nid=qW/DOVwni83/)
新版本使用十进制 64 位整数(std::to_string)
两者本质一致:
👉都是 8 字节数据的不同表示形式
请求头复现算法(简化版)
输入:Session State 对象指针
校验会话状态(offset 0x02)
读取:
转换为字符串
拼接:
nid=;tid=;nc=
总结
x-fb-session-id 是 Facebook 内部网络会话级别的指纹
用于:
构造逻辑完全在Native 层(libcoldstart.so)
并非简单随机字符串,而是强结构化、可复现的会话标识
公众号:安全狗的自我修养
vx:2207344074
http://gitee.com/haidragon
http://github.com/haidragon
bilibili:haidragonx
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:安全狗的自我修养 haidragon《Facebook 逆向:x-fb-session-id 请求头》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论