-
-
[求助] 在做FB抓包时,经过N次的HOOK,定位到native层的网络方法,不知道怎么把SO文件逆向了
-
发表于:
2025-4-19 17:53
2787
-
[求助] 在做FB抓包时,经过N次的HOOK,定位到native层的网络方法,不知道怎么把SO文件逆向了
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日开班!