修改 WeChatWin.dll 实现 PC 版微信语音/视频弹窗屏蔽

在使用 PC 版微信时,遇到这样一个问题:在打游戏或进行全屏操作时,微信的语音/视频通话弹窗会突然跳出,打断当前任务,造成不便,很让人抓狂。

微信设置中虽然提供了关闭“语音和视频通话通知声音”的选项,但实测发现,该设置只能关闭提示音,并不能阻止弹窗本身的出现。

为了解决这个问题,本文尝试通过修改 WeChatWin.dll 的方式来实现对通话弹窗的屏蔽。

实现原理

可以发现每当收到视频或语音电话时这个弹窗总是固定出现在桌面的右下角,内部的代码实现应该就是:创建窗口(CreateWindowExW)—->移动窗口(SetWindowPos),经过分析,也确实如此,那么只需要阻止创建窗口即可,语音/视频弹框的窗口类名是 ILinkVoipTrayWnd 根据这个类名来阻止。

好了,废话不多说,接下来开始操作吧。

第一步,扩展 .rsrc 节的大小

微信版本 [3.9.12.51]

使用 die 来查看 WeChatWin.dll PE 节信息

用x64dbg分析了下,发现这些段都没有足够的空白空间写入屏蔽弹窗的汇编代码,所以只能选一个段来扩大。为了方便,这里选择扩大最后一个 .rsrc 段,为什么选最后一个段?因为这些段信息在物理文件中是按顺序储存的,改中间的段就会影响到其它段的物理文件偏移。

可以看到图中最后一行是有个附加信息的,我们先根据这个物理文件偏移用 winhex 单独提取出来放着,等改完之后再附加到文件最后去,它的偏移不用管,会根据最后一个 .rsrc 段自动计算。

从节信息图中可以看出,附加的证书信息数据范围就是从 0x60a6800 到文件末尾,先把这个证书信息数据单独存到文件,然后再回到 winhex 移除这个范围的数据,移除之后要保存更新一下 dll 文件

修改大小之前需要了解一下对齐知识:

实际大小(文件中) SizeOfRawData 对齐到 FileAlignment(通常 0x200)

虚拟大小(内存中) VirtualSize 可不对齐,但加载时按 SectionAlignment(通常 0x1000)对齐

从PE信息中可以看到 .rsrc 的实际大小是 0x600,虚拟大小是 0x508,按照 FileAlignment 对齐规定,扩大后的大小是 0x200 的倍数就行,这里就增大 0x200 个字节吧,增大后也就是 0x800,我们用 die 工具重新载入 dll 更改一下

改完之后再用 winhex 在文件末尾开始追加填充空字节,一直追加到 0x060a6200 + 0x800 = 0x60A6A00 也就是追加 0x201 个字节,对应十进制的 513

把之前保存的附加证书追加到文件末尾,从 0x60A6A00 开始粘贴,粘贴完之后保存更改

验证一下是否附加证书成功,用 die 工具查看 pe 信息,根据下面两张图可以看到附加成功了,自动计算了偏移,且成功显示证书信息

更改 .rsrc 的内存权限标志位,改成可读可运行,要不然你在这个节上写的汇编代码只能读,不能运行,所以必须要改

最后一步,将更改后的 WeChatWin.dll 替换到微信目录下,测试微信是否能正常打开,如果微信能正常打开,则代表成功更改。

第二步,导入屏蔽弹窗汇编代码

x64dbg 版本:

x64dbg 屏蔽微信语音/视频弹窗补丁下载地址:https://be7v.top/static/WeChatWin.1337

至此,我们已经成功扩展了 .rsrc 节的大小,现在开始写入屏蔽弹窗的汇编代码(逆向过程就不写了,比较简单),先把更改后的 dll 替换到微信目录,然后用 x64dbg 打开微信主程序,打开之后应该会自动断下来,一直按 F9 直到微信窗口出现,然后右键汇编代码界面选择导入补丁

导入之后点击修补文件,意思是把补丁的更改永久应用到 dll 文件上,我们选择保存到桌面,这时候得到的 WeChatWin.dll 就带有去除语音弹窗功能了,关闭 x64dbg,将修补后的dll再次替换到微信目录,然后测试屏蔽弹窗功能即可。

屏蔽弹窗的汇编代码:

这里是微信调用 CreateWindowExW 创建语音弹窗的地方
00007FFE79AF4B5F | FF15 7B | call qword ptr ds:[<CreateWindowExW>]     |
00007FFE79AF4B65 | E9 981A | jmp wechatwin.7FFE7C396602                |
00007FFE79AF4B6A | 90      | nop                                       |
这里是屏蔽弹窗代码
00007FFE7C396602 | 48:89C2 | mov rdx,rax                               | rdx:L"WeChatLoginWndForPC"
00007FFE7C396605 | 48:89F1 | mov rcx,rsi                               |
00007FFE7C396608 | 50      | push rax                                  |
00007FFE7C396609 | 53      | push rbx                                  | rbx:L"WeChatLoginWndForPC"
00007FFE7C39660A | 51      | push rcx                                  |
00007FFE7C39660B | 52      | push rdx                                  | rdx:L"WeChatLoginWndForPC"
00007FFE7C39660C | 55      | push rbp                                  |
00007FFE7C39660D | 54      | push rsp                                  |
00007FFE7C39660E | 56      | push rsi                                  |
00007FFE7C39660F | 57      | push rdi                                  |
00007FFE7C396610 | 41:50   | push r8                                   | r8:"甠酧"
00007FFE7C396612 | 41:51   | push r9                                   |
00007FFE7C396614 | 48:83EC | sub rsp,0x20                              |
00007FFE7C396618 | 48:89D9 | mov rcx,rbx                               | rbx:L"WeChatLoginWndForPC"
00007FFE7C39661B | 48:BA 6 | mov rdx,wechatwin.7FFE7C396665            | rdx:L"WeChatLoginWndForPC", 7FFE7C396665:L"voip"
00007FFE7C396625 | 48:B8 5 | mov rax,<shlwapi.StrStrIWStub>            |
00007FFE7C39662F | FFD0    | call rax                                  |
00007FFE7C396631 | 48:83C4 | add rsp,0x20                              |
00007FFE7C396635 | 48:85C0 | test rax,rax                              |
00007FFE7C396638 | 74 18   | je wechatwin.7FFE7C396652                 |
00007FFE7C39663A | 41:59   | pop r9                                    |
00007FFE7C39663C | 41:58   | pop r8                                    | r8:"甠酧"
00007FFE7C39663E | 5F      | pop rdi                                   |
00007FFE7C39663F | 5E      | pop rsi                                   |
00007FFE7C396640 | 5C      | pop rsp                                   |
00007FFE7C396641 | 5D      | pop rbp                                   |
00007FFE7C396642 | 5A      | pop rdx                                   | rdx:L"WeChatLoginWndForPC"
00007FFE7C396643 | 59      | pop rcx                                   |
00007FFE7C396644 | 5B      | pop rbx                                   | rbx:L"WeChatLoginWndForPC"
00007FFE7C396645 | 58      | pop rax                                   |
00007FFE7C396646 | 48:C7C2 | mov rdx,0x0                               | rdx:L"WeChatLoginWndForPC"
00007FFE7C39664D | E9 18E5 | jmp wechatwin.7FFE79AF4B6A                |
00007FFE7C396652 | 41:59   | pop r9                                    |
00007FFE7C396654 | 41:58   | pop r8                                    | r8:"甠酧"
00007FFE7C396656 | 5F      | pop rdi                                   |
00007FFE7C396657 | 5E      | pop rsi                                   |
00007FFE7C396658 | 5C      | pop rsp                                   |
00007FFE7C396659 | 5D      | pop rbp                                   |
00007FFE7C39665A | 5A      | pop rdx                                   | rdx:L"WeChatLoginWndForPC"
00007FFE7C39665B | 59      | pop rcx                                   |
00007FFE7C39665C | 5B      | pop rbx                                   | rbx:L"WeChatLoginWndForPC"
00007FFE7C39665D | 58      | pop rax                                   |
00007FFE7C39665E | E9 07E5 | jmp wechatwin.7FFE79AF4B6A                |
00007FFE7C396663 | 0000    | add byte ptr ds:[rax],al                  |
00007FFE7C396665 | 76 00   | jbe wechatwin.7FFE7C396667                |
00007FFE7C396667 | 6F      | outsd                                     |
00007FFE7C396668 | 0069 00 | add byte ptr ds:[rcx],ch                  |
00007FFE7C39666B | 70 00   | jo wechatwin.7FFE7C39666D                 |

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注