首页
社区
课程
招聘
[求助] 在做FB抓包时,经过N次的HOOK,定位到native层的网络方法,不知道怎么把SO文件逆向了
发表于: 2025-4-19 17:53 2786

[求助] 在做FB抓包时,经过N次的HOOK,定位到native层的网络方法,不知道怎么把SO文件逆向了

2025-4-19 17:53
2786

hook的代码

Java.perform(function() {
    // 1. 增强版Tigon请求捕获
    const TigonService = Java.use('com.facebook.tigon.TigonXplatService');
   
    TigonService.sendRequestIntegerBuffer.implementation = function(
        request, byteArray, i, byteBuffers, i2, callbacks, executor
    ) {
        console.log("\n=== 捕获Tigon请求 ===");
       
        // 解析原始字节数据
        if (byteArray && byteArray.length > 0) {
            try {
                // 将Java byte数组转换为JS格式
                const bytes = [];
                for (let k = 0; k < byteArray.length; k++) {
                    bytes.push(byteArray[k] & 0xff);
                }
               
                // 自动检测并解析Facebook二进制协议
                console.log("\n[解析结果]");
               
                // 1. 解析请求方法 (从输出看位于偏移量4)
                const methodLength = bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24);
                let offset = 4;
                const method = String.fromCharCode.apply(null, bytes.slice(offset, offset + methodLength));
                offset += methodLength;
                console.log(`[方法] ${method}`);
               
                // 2. 解析URL (紧接着方法)
                const urlLength = bytes[offset] | (bytes[offset+1] << 8) | (bytes[offset+2] << 16) | (bytes[offset+3] << 24);
                offset += 4;
                const url = String.fromCharCode.apply(null, bytes.slice(offset, offset + urlLength));
                offset += urlLength;
                console.log(`[URL] ${url}`);
               
                // 3. 解析请求头 (键值对格式)
                console.log("\n[请求头]");
                while (offset < bytes.length) {
                    // 键长度
                    const keyLength = bytes[offset] | (bytes[offset+1] << 8) | (bytes[offset+2] << 16) | (bytes[offset+3] << 24);
                    offset += 4;
                    if (keyLength === 0) break; // 结束标记
                   
                    // 键内容
                    const key = String.fromCharCode.apply(null, bytes.slice(offset, offset + keyLength));
                    offset += keyLength;
                   
                    // 值长度
                    const valueLength = bytes[offset] | (bytes[offset+1] << 8) | (bytes[offset+2] << 16) | (bytes[offset+3] << 24);
                    offset += 4;
                   
                    // 值内容
                    const value = String.fromCharCode.apply(null, bytes.slice(offset, offset + valueLength));
                    offset += valueLength;
                   
                    console.log(`${key}: ${value}`);
                }
               
                // 4. 如果有剩余数据,可能是请求体
                if (offset < bytes.length) {
                    console.log("\n[请求体] 长度:", bytes.length - offset);
                    const body = bytes.slice(offset);
                   
                    // 尝试解析为JSON
                    try {
                        const bodyText = String.fromCharCode.apply(null, body.filter(b => b >= 32 && b <= 126));
                        if (bodyText.includes("{") && bodyText.includes("}")) {
                            console.log("JSON内容:", bodyText.substring(0, 300));
                        } else {
                            console.log("原始数据:", body.slice(0, 64));
                        }
                    } catch (e) {
                        console.log("二进制数据:", body.slice(0, 64));
                    }
                }
               
                // 保存完整数据
                const filePath = `/sdcard/Download/fb_req_${Date.now()}.bin`;
                const fos = Java.use('java.io.FileOutputStream').$new(filePath);
                fos.write(byteArray);
                fos.close();
                console.log(`\n原始数据已保存到: ${filePath}`);
               
            } catch (e) {
                console.log("解析失败:", e);
            }
        }
       
        return this.sendRequestIntegerBuffer.apply(this, arguments);
    };

    console.log("=== Facebook请求解析Hook已安装 ===");
});

xx.bin的内容

 boundary=35A02D10F5864A2BBD9203365A4A3F7B

已知对应的native方法

Java类名:com.facebook.tigon.TigonXplatService

Java方法名:sendRequestIntegerBuffer

Java方法签名:(Lcom/facebook/tigon/iface/TigonRequest;[BI[Ljava/nio/ByteBuffer;ILcom/facebook/tigon/TigonCallbacks;Ljava/util/concurrent/Executor;)Lcom/facebook/tigon/TigonXplatRequestToken;

来自:<libcoldstart.so>

C++函数绝对地址:0x6d0dea2e58

C++函数偏移地址:0x761e58


IDA处理后是红色的,应该是有错误,  但是我不会弄了啊.....     气死了。。。  

有没有大佬可以指导下,  我应该学习哪些东西来解决这个问题啊... 

当前无法debug,一直使用hook加java代码看的,native层不会啊,C/C++会看。汇编看不太懂,如果一边DEBUG的话就可以慢慢看,

但是我没办法过反DEBUG  


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 395
活跃值: (447)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
这怎么换到求助版块去   
发错地方了
2025-4-19 17:56
0
雪    币: 3333
活跃值: (4262)
能力值: ( LV5,RANK:61 )
在线值:
发帖
回帖
粉丝
3
他有降级走java方案的,也有quic以及自己的zstd,还有一些检测点位,ins的也是差不多。f5的话,那就选择一行,然后用鼠标选择一个区域,按一下p就好了,其他的就是明确函数的边界就可以f5成功了
2025-4-19 20:20
3
雪    币: 163
活跃值: (2778)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
是不是so里面有花,请大佬们看一下,这个脚本不错
2025-4-20 23:00
0
雪    币: 395
活跃值: (447)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
陈可牛 他有降级走java方案的,也有quic以及自己的zstd,还有一些检测点位,ins的也是差不多。f5的话,那就选择一行,然后用鼠标选择一个区域,按一下p就好了,其他的就是明确函数的边界就可以f5成功了
感谢, 我再研究研究,小白的苦恼
2025-4-21 13:09
0
游客
登录 | 注册 方可回帖
返回