[JavaScript] 纯文本查看 复制代码
function readDartStringExact(ptr) {
if (ptr.isNull()) return "null";
try {
// 1. 读取长度:位于指针偏移 +7 的位置,占用 4 个字节
// 读取出来的 Smi 编码值需要右移 1 位才是真实长度
let lengthSmi = ptr.add(7).readU32();
let length = lengthSmi >> 1;
if (length === 0) return "";
if (length > 10240) return "[String suspiciously long: " + length + " bytes]";
// 2. 读取字符串数据:位于指针偏移 +15 (0x0F) 的位置
let strDataPtr = ptr.add(15);
// 按照真实长度读取完整的 UTF-8 字符串
let str = strDataPtr.readUtf8String(length);
return str;
} catch (e) {
return "[Error reading string at " + ptr + ": " + e.message + "]";
}
}
function hookMD5() {
let moduleName = "libapp.so";
let libapp = Process.getModuleByName(moduleName);
let targetOffset = 0x70A264;
let targetAddress = libapp.base.add(targetOffset);
console.log(" Hooking generateMD5 at: " + targetAddress);
console.log(" Waiting for network requests...\n");
Interceptor.attach(targetAddress, {
onEnter: function (args) {
// 我们已经确认 args[zxsq-anti-bbcode-0] 就是我们要的明文字符串指针
this.inputStringPtr = args[zxsq-anti-bbcode-0];
console.log("=========================================");
console.log("[+] MD5 Signature Triggered!");
// 使用精准解析函数读取完整明文
let plaintext = readDartStringExact(this.inputStringPtr);
console.log("[->] Full Plaintext Input:");
console.log("-----------------------------------------");
console.log(plaintext);
console.log("-----------------------------------------");
console.log("[zxsq-anti-bbcode-i] Plaintext Length: " + plaintext.length + " characters");
},
onLeave: function (retval) {
// 返回值同样是 Dart 字符串,包含 32 位的 MD5 Hex
let md5Result = readDartStringExact(retval);
console.log("[<-] MD5 Output Hash : " + md5Result);
console.log("=========================================\n");
}
});
}
setTimeout(function () {
hookMD5();
}, 1000);
} catch (e) {
return "[Error reading string at " + ptr + ": " + e.message + "]";
}
}
function hookMD5() {
let moduleName = "libapp.so";
let libapp = Process.getModuleByName(moduleName);
let targetOffset = 0x70A264;
let targetAddress = libapp.base.add(targetOffset);
console.log(" Hooking generateMD5 at: " + targetAddress);
console.log(" Waiting for network requests...\n");
Interceptor.attach(targetAddress, {
onEnter: function (args) {
// 我们已经确认 args[0] 就是我们要的明文字符串指针
this.inputStringPtr = args[0];
console.log("=========================================");
console.log("[+] MD5 Signature Triggered!");
// 使用精准解析函数读取完整明文
let plaintext = readDartStringExact(this.inputStringPtr);
console.log("[->] Full Plaintext Input:");
console.log("-----------------------------------------");
console.log(plaintext);
console.log("-----------------------------------------");
console.log("[i] Plaintext Length: " + plaintext.length + " characters");
},
onLeave: function (retval) {
// 返回值同样是 Dart 字符串,包含 32 位的 MD5 Hex
let md5Result = readDartStringExact(retval);
console.log("[<-] MD5 Output Hash : " + md5Result);
console.log("=========================================\n");
}
});
}
setTimeout(function () {
hookMD5();
}, 1000);