l_user 发表于 2024-11-8 23:50

PC微信hook登录二维码

学了一点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 = 0i64;
    result = 15i64;
    *(a1 + 24) = result;
}
if ( result != a2 )
{
    v5 = a2;
    if ( a2 >= 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;
      this.a2 = args;
      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) {// 增加空指针检查
      char* dataPtr = reinterpret_cast<char*>(a2);
      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拿到了微信的登录二维码了。

hanbazhen 发表于 2024-11-9 17:28

电脑端恢复记录到手机,需要主设备先登录,平板端是不能扫码登录的,

既然楼主都hook到了,不知道楼主有没有想到借此解决掉平板(副设备)不能扫码登录的问题,直接恢复

vscos 发表于 2024-11-9 05:47

这样拿到了有什么用

yilian 发表于 2024-11-9 05:56

是不是要做微信自动发卡

wuyongyin 发表于 2024-11-9 06:46

方便谢谢分享咯

kevinZ0 发表于 2024-11-9 07:51

谢谢分享

liyitong 发表于 2024-11-9 09:58

vscos 发表于 2024-11-9 05:47
这样拿到了有什么用

人家是在讲技术,不是给你讲有没有用。
有了这个方法,可以去拿别的东西啊。

asdasxzca 发表于 2024-11-9 11:49

牛逼啊111

mrmature 发表于 2024-11-11 16:22

厉害了,学习一下

weilianteam 发表于 2024-11-12 00:28

厉害,作者牛逼
页: [1] 2
查看完整版本: PC微信hook登录二维码