上篇2025企业微信4.1.36.6011获取登录二维码
我们成功获取到了二维码的地址 在过程中 会遇到 二维码地址失效的情况
这种情况下就需要我们去点一下刷新按钮才能获取到新的二维码
打开企业微信 然后先丢着 等二维码过期

找到[原创]2025企业微信4.1.36.6011调试Duilib获取界面XML
里面获取的login\qrcode_frame.xml
文件 大致看下内容 找到一个过期刷新的界面
那我们可以根据 expired_refresh_qrcode_button
这个按钮的名称 去找一下 是哪里触发了刷新逻辑
先打开 IDA 搜一下字符串 发现没搜到...
那就打开 x32dbg 附加一下 选择 wxwork.exe
然后在当前模块搜索一下字符串

找到一个 右键 在反汇编中转到 下个断点 然后点一下刷新二维码
用 ret-sync 插件 同步一下 IDA 和 x32dbg 方便我们看代码调试

执行到这里之后 跳到了LABEL_28

进去这个方法看一下

看起来比较像是刷新的方法 我们记录一下方法的地址 0x036608A4
然后临时保存一下 ecx 也就是 this 指针的值 0x1CEE2CB8
然后让程序继续运行 接着用代码注入器 注入一下汇编代码试试
可以看到 执行之后 他的二维码就开始刷新了(速度太快了 截图了好几次才截到)

还是和之前一样 先把这个地址手动添加到地址列表 然后进行指针扫描
在 x32dbg 里面 对方法的地址 0x036608A4
下断点
用 x32dbg
重启企业微信 继续运行 等到触发断点
再次记录 ecx 的值 0x1C0DAA10
然后让程序继续运行
界面展示之后 继续扫描刚才记录的指针地址
重复几次之后 得到一个稳定不变的偏移地址

仔细观察 实际上你会发现 和上次获取二维码地址偏移位置差不多

所以猜测 WxWork.exe+0x05C54A20 +60 +10C +C
应该是一个对象地址
我们把这个地址添加上 然后用结构分析看看数据结构

添加地址 然后选中 Ctrl+B
打开内存浏览器 然后 Ctrl+D
打开分析数据/遍历

点击 结构-> 定义新的结构 会发现它自动读取到了一个名称 直接确认

然后看看上面的 +58 也就是那个刷新二维码的对象地址

仔细观察会发现 正好符合了这个 IDA 分析出来的代码 1D03B034-4=1D03B030

再看看 +290 可以看到我们要的那个 二维码 Key 的数据

这次直接修改上次写的代码 然后 用 __asm 来完成调用
然后我们注入一下试试看(刷新的截图不到 反正每次注入都会变 说明没问题了)

<
FloatLayout
name
=
"expired_refresh_qrcode_mask_layout"
height
=
"200"
width
=
"200"
targetcontrol
=
"qrcode_image"
bkcolor
=
"!base_white_090"
visible
=
"false"
mouse
=
"false"
>
<
Control
mouse
=
"false"
/>
<
VerticalLayout
name
=
"expired_refresh_qrcode_layout"
width
=
"90"
mouse
=
"false"
>
<
Control
mouse
=
"false"
/>
<
HorizontalLayout
name
=
"expired_refresh_qrcode_tips_label_layout"
height
=
"fit"
padding
=
"0,0,0,8"
mouse
=
"false"
>
<
Control
mouse
=
"false"
/>
<
WrapLabel
name
=
"expired_refresh_qrcode_tips_label"
maxline
=
"1"
align
=
"center"
width
=
"fit"
fontsize
=
"15"
textcolor
=
"!bg_black"
mouse
=
"false"
/>
<
Control
mouse
=
"false"
/>
</
HorizontalLayout
>
<
HorizontalLayout
name
=
"expired_refresh_qrcode_button_layout"
height
=
"22"
mouse
=
"false"
>
<
Control
mouse
=
"false"
/>
<
Button
name
=
"expired_refresh_qrcode_button"
width
=
"fit"
height
=
"22"
align
=
"vcenter"
text
=
"$@IDS_G_QRCODE_EXPIRED_REFRESH"
fontsize
=
"15"
textcolor
=
"!accent_blue"
/>
<
Control
mouse
=
"false"
/>
</
HorizontalLayout
>
<
Control
mouse
=
"false"
/>
</
VerticalLayout
>
<
Control
mouse
=
"false"
/>
</
FloatLayout
>
<
FloatLayout
name
=
"expired_refresh_qrcode_mask_layout"
height
=
"200"
width
=
"200"
targetcontrol
=
"qrcode_image"
bkcolor
=
"!base_white_090"
visible
=
"false"
mouse
=
"false"
>
<
Control
mouse
=
"false"
/>
<
VerticalLayout
name
=
"expired_refresh_qrcode_layout"
width
=
"90"
mouse
=
"false"
>
<
Control
mouse
=
"false"
/>
<
HorizontalLayout
name
=
"expired_refresh_qrcode_tips_label_layout"
height
=
"fit"
padding
=
"0,0,0,8"
mouse
=
"false"
>
<
Control
mouse
=
"false"
/>
<
WrapLabel
name
=
"expired_refresh_qrcode_tips_label"
maxline
=
"1"
align
=
"center"
width
=
"fit"
fontsize
=
"15"
textcolor
=
"!bg_black"
mouse
=
"false"
/>
<
Control
mouse
=
"false"
/>
</
HorizontalLayout
>
<
HorizontalLayout
name
=
"expired_refresh_qrcode_button_layout"
height
=
"22"
mouse
=
"false"
>
<
Control
mouse
=
"false"
/>
<
Button
name
=
"expired_refresh_qrcode_button"
width
=
"fit"
height
=
"22"
align
=
"vcenter"
text
=
"$@IDS_G_QRCODE_EXPIRED_REFRESH"
fontsize
=
"15"
textcolor
=
"!accent_blue"
/>
<
Control
mouse
=
"false"
/>
</
HorizontalLayout
>
<
Control
mouse
=
"false"
/>
</
VerticalLayout
>
<
Control
mouse
=
"false"
/>
[培训]科锐逆向工程师培训第53期2025年7月8日开班!