吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1091|回复: 15
收起左侧

[C&C++ 原创] PC微信hook登录二维码

  [复制链接]
l_user 发表于 2024-11-8 23:50

学了一点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拿到了微信的登录二维码了。

免费评分

参与人数 4吾爱币 +10 热心值 +3 收起 理由
trecyn + 1 我很赞同!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
helian147 + 1 + 1 热心回复!
laozhang4201 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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
厉害,作者牛逼
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 09:03

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表