学了一点hook,那么就取一下64位微信的登录二维码,练练手。
打开微信,截图看一下二维码地址的构造,它是这样的http://weixin.qq.com/x/字符串,那可以直接用CE搜一下对应的字符串,结果字符串是搜到了,但是CE中的地址和x64dbg看到的地址却不一样,搞了半天没有搞明白,求大佬指点一下。
CE不行的话,那就上IDA,搜一下二维码相关的字符串,比如QrCode,成功搜到了这样的字符串NetSceneCheckLoginQRCode,这一看就是跟二维码相关了。大概的看一下伪代码,很好,看不懂。
把里面相关的函数挨个看了一下,发现了这样一个方法,很像构造那个字符串的
__int64 *__fastcall sub_1823B7730(__int64 a1, __int64 *a2)
{
__int64 *result; // rax
__int64 v5; // r8
*(a1 + 44) |= 4u;
result = *(a1 + 24);
if ( result == &qword_1856C45D8 )
{
result = sub_1843555C8(32i64);
*result = 0i64;
result[2] = 0i64;
result[3] = 15i64;
*(a1 + 24) = result;
}
if ( result != a2 )
{
v5 = a2[2];
if ( a2[3] >= 0x10 )
a2 = *a2;
result = sub_181B3BBE0(result, a2, v5);
}
return result;
}
frida启动,尝试打印一下数据
var targetOffset = 0x23b7730;
var baseAddress = Module.findBaseAddress("WeChatWin.dll");
var targetAddress = baseAddress.add(targetOffset);
if (targetAddress) {
Interceptor.attach(targetAddress, {
onEnter: function (args) {
this.a1 = args[0];
this.a2 = args[1];
console.log("a2 address:", this.a2);
try {
// 读取 a2 指向的数据内容
var dataPtr = Memory.readPointer(this.a2);
if (!dataPtr.isNull()) {
var dataContent = Memory.readByteArray(dataPtr, 24);
console.log("Data content at a2:", dataContent);
var dataStr = String.fromCharCode.apply(null, new Uint8Array(dataContent));
console.log("Data content at a2 (as string):", dataStr);
} else {
console.log("a2 pointer is null, no data to read.");
}
} catch (e) {
console.error("Error reading data at a2:", e);
}
},
onLeave: function (retval) {
console.log("sub_1823B7730 returned:", retval);
console.log("---- Interception Complete ----\n");
},
});
} else {
console.error("Function address not found!");
}
果然这里会被定时调用,那这样就是找到了二维码字符串的地址了,由于它是由参数得到的,没法直接基址+偏移的方式获取,那我们就hook这个方法。
根据frida,c++核心代码如下:
static void LoginQr(__int64 a1, __int64* a2) {
if (a2 && a2[0]) { // 增加空指针检查
char* dataPtr = reinterpret_cast<char*>(a2[0]);
std::string loginUrl(dataPtr, 22); //读取内容
LOG_INFO("Login QR Code URL: {}", loginUrl);
{
std::lock_guard<std::mutex> lock(gQrCodeMutex);
gLoginQrCodeUrl = "http://weixin.qq.com/x/" + loginUrl; // 更新二维码 URL
}
gQrCodeCv.notify_all(); // 通知等待的线程
}
realLoginQr(a1, a2);
}
这样就成功通过hook拿到了微信的登录二维码了。