上个帖子[原创]2025企业微信4.1.36.6011调试Duilib获取界面XML
我们获取到了登录界面的XML文件 接下来就是获取登录二维码了
网上很多教程都是直接搜索 PNG 图片内容 实际上还有更简单的方法 直接搜索二维码解码后的内容
我们可以找个二维码解码工具 解码登录的二维码 打开企业微信 截图一下二维码 然后解码
可以获得到这么一串地址 根据经验有两种情况 一种 直接从服务端获取完整的URL 另一种就是只获取 Key 然后拼接地址生成二维码
我们先打开 IDA 打开 WxWork.exe
让他分析一会儿
然后打开 CE 找到企业微信 搜一下字符串 第一次 尝试搜索完整的地址 没搜到

那就换成只搜索 Key 部分的内容 搜索到了一堆结果 然后拖动几下窗口 点一下设置按钮

重复几次之后 应该只剩下几个地址了 然后 拿出手机 扫码一下 再取消登录 然后重复上述过程
最后 只剩下一个地址了

由于这个地址是变动的 所以需要对这个地址进行指针扫描


扫描完成之后 我们关闭企业微信
重复一下步骤1 再次获得一个新的地址 然后选择在之前的界面上 选择 指针扫描器 重新扫描指针列表

结果发现 没有固定的数据 可能会层级太多了 那就扫码二维码地址的指针地址试试看
先按照步骤1 获得地址 然后新的扫描 选择4字节 十六进制

发现就只有一个地址 双击地址 加入列表 然后对这个地址进行指针扫描(步骤和上面一样)
完事儿之后 再重复一次获取一个新的地址指针(注意 这里要填指针的地址 不是二维码地址 不然得不到数据)
如果数据还是有点多 那就多重复几次

多次扫描之后 我们获得了几个二维码地址的固定偏移数据
可以把这四个地址都双击一下 添加到地址列表 然后修改类型为字符串 长度32

重新打开企业微信 可以看到这几个地址固定可以获取到登录的 Key
打开 Visual Studio 2022
新建一个 DLL 项目 C++标准 C++20
选择 x32
关闭预编译头(编译基础部分可以自行百度)
生成 Dll 之后 注入到企业微信 看效果

最后只要把获取到的 Key 和地址拼接一下就可以获得二维码完整的地址 找个库生成一下二维码就可以扫码登录了
因为懒得每次保存截图 然后去找解码网站 就用 Golang 写了一个自动从剪切板读取二维码的工具
截图二维码之后运行一下 就可以获得到解码后的地址了
直接丢源码了(也是AI帮忙写的) 自己去编译吧
https:
//wx
.work.weixin.qq.com
/cgi-bin/crtx_auth
?key=1B07EC73F5669D900EE1576A4D9B0C9B&wx=1
https:
//wx
.work.weixin.qq.com
/cgi-bin/crtx_auth
?key=1B07EC73F5669D900EE1576A4D9B0C9B&wx=1
/
/
dllmain.cpp : 定义 DLL 应用程序的入口点。
BOOL
APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
auto address
=
reinterpret_cast<DWORD>(GetModuleHandle(NULL));
address
=
*
reinterpret_cast<DWORD
*
>(address
+
0x05C54A20
);
address
=
*
reinterpret_cast<DWORD
*
>(address
+
0x60
);
address
=
*
reinterpret_cast<DWORD
*
>(address
+
0x10C
);
address
=
*
reinterpret_cast<DWORD
*
>(address
+
0xC
);
if
(address
=
=
0
)
{
MessageBox(NULL, L
"WxWorkQrcode DLL Loaded address is 0"
, L
"WxWorkQrcode"
, MB_OK | MB_ICONERROR);
return
FALSE;
};
address
=
*
reinterpret_cast<DWORD
*
>(address
+
0x290
);
MessageBoxA(NULL, std::
format
(
"Qrcode Address: {:x} Key: {}"
, address, reinterpret_cast<char
*
>(address)).c_str(),
"WxWorkQrcode"
, MB_OK | MB_ICONINFORMATION);
break
;
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break
;
}
return
TRUE;
}
/
/
dllmain.cpp : 定义 DLL 应用程序的入口点。
BOOL
APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
auto address
=
reinterpret_cast<DWORD>(GetModuleHandle(NULL));
address
=
*
reinterpret_cast<DWORD
*
>(address
+
0x05C54A20
);
address
=
*
reinterpret_cast<DWORD
*
>(address
+
0x60
);
address
=
*
reinterpret_cast<DWORD
*
>(address
+
0x10C
);
address
=
*
reinterpret_cast<DWORD
*
>(address
+
0xC
);
if
(address
=
=
0
)
{
MessageBox(NULL, L
"WxWorkQrcode DLL Loaded address is 0"
, L
"WxWorkQrcode"
, MB_OK | MB_ICONERROR);
return
FALSE;
};
address
=
*
reinterpret_cast<DWORD
*
>(address
+
0x290
);
MessageBoxA(NULL, std::
format
(
"Qrcode Address: {:x} Key: {}"
, address, reinterpret_cast<char
*
>(address)).c_str(),
"WxWorkQrcode"
, MB_OK | MB_ICONINFORMATION);
break
;
}
[培训]科锐逆向工程师培训第53期2025年7月8日开班!