Facebook逆向:x-fb-session-id请求头

admin 2026-01-07 02:37:40 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文深入逆向分析Facebook的x-fb-session-id请求头生成机制,发现其由nid、tid、nc三个64位整数组成,位于原生库libcoldstart.so中。文章详细解析了其防止重放攻击的递增计数逻辑及内存结构,并指出了版本间格式从Base64转为十进制的演变,为理解移动端应用指纹识别提供了底层技术细节。 综合评分: 87 文章分类: 逆向分析,移动安全,爬虫


cover_image

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 请求头》

评论:0   参与:  0