前言

网上有一堆 微信电脑版多开、防撤回等破解补丁,可以实现类似的功能,但是微信是比较涉及个人隐私的社交软件,所以网上公开的补丁基本都不敢用,万一自带木马后门什么的就惨了。所以在这里教大家纯手工修改方法。

准备工作

1. OllyDbg 或 OllyICE(OllyDbg 爱好者二次开发升级版本) 等反汇编软件。

2. 安装好微信电脑版,提取安装路径文件夹中的 WeChatWin.dll 备用。

使用 OllyDbg 纯手工修改微信电脑版 WeChatWin.dll 的汇编代码,实现无限多开和消息防撤回功能,并且有撤回提示。

该方法适用于微信电脑版(Windows PC 版)近几年的所有版本,甚至未来新版本。

有一定的技术门槛,需要了解基本的反汇编破解知识,如果不能熟练掌握 OllyDbg 等反汇编软件,那么底下内容就可以不用看了。

破解流程

解除多开限制

微信启动后,会先尝试创建互斥体,如果创建成功则直接启动微信,否则依次判断 WeChatMainWndForPCWeChatLoginWndForPC 两个窗口是否存在,如果存在则使用 BringWindowToTop 函数将其置顶并弹出,如果不存在则启动微信。

上述两个窗口分别代表的是微信的主界面窗口和登陆界面窗口,如果一个微信实例已经存在,则势必处于这两种状态之一。

微信判断是否重复启动运行的条件:

1.如果互斥体创建成功,则直接启动微信。

2.如果互斥体创建失败,如果查找微信相关窗口,找到则置顶并退出,未找到则启动微信。

伪代码表示一下判断逻辑

// 尝试创建互斥体
if (CreateMutex() == SUCCESS) {
// 创建成功则启动微信
} else {
// 创建失败则尝试查找窗口
if (FindWindow() == SUCCESS) {
// 找到微信窗口,则将已有窗口置顶,然后结束程序
} else {
// 未找到微信窗口,则启动微信
}
}

所以破解思路就很简单了,首先使用 OllyDbg 查找所有参考文本字符串:

WeChatMainWndForPCWeChatLoginWndForPC

然后找到以下这段代码并修改(看右侧的注释说明,需要修改 1 处星标的行):

5B36F8B0  /$  E8 6B000000   call WeChatWi.5B36F920                                                      创建互斥体
5B36F8B5 84C0 test al,al 判断互斥体是否创建成功
5B36F8B7 |. 74 56 je short WeChatWi.5B36F90F ★ je 改为 jmp,不管是否创建成功都强制跳转,并且跳过底下的窗口查找判断
5B36F8B9 |. 56 push esi
5B36F8BA |. 6A 00 push 0x0 ; /Title = NULL
5B36F8BC |. 68 2819105C push WeChatWi.5C101928 ; |Class = "WeChatMainWndForPC"
5B36F8C1 |. FF15 1CD8F15B call dword ptr ds:[<&USER32.FindWindowW>>; \FindWindowW
5B36F8C7 |. 8BF0 mov esi,eax ; WeChatWi.5A960000
5B36F8C9 |. 85F6 test esi,esi
5B36F8CB |. 75 12 jnz short WeChatWi.5B36F8DF > 如果找到窗口 WeChatMainWndForPC 则将该窗口切换到顶层然后退出(按理说修改这个字符串也可以实现绕过多开检测)
5B36F8CD |. 50 push eax ; /Title = "婍?"
5B36F8CE |. 68 9C0D105C push WeChatWi.5C100D9C ; |Class = "WeChatLoginWndForPC"
5B36F8D3 |. FF15 1CD8F15B call dword ptr ds:[<&USER32.FindWindowW>>; \FindWindowW
5B36F8D9 |. 8BF0 mov esi,eax ; WeChatWi.5A960000
5B36F8DB |. 85F6 test esi,esi
5B36F8DD |. 74 2B je short WeChatWi.5B36F90A > 如果找到窗口 微信:WeChatLoginWndForPC 则将该窗口切换到顶层然后退出(按理说修改这个字符串也可以实现绕过多开检测)
5B36F8DF |> 6A 01 push 0x1
5B36F8E1 |. 56 push esi
5B36F8E2 |. FF15 88D7F15B call dword ptr ds:[<&USER32.SwitchToThis>; user32.SwitchToThisWindow 以下代码为置顶已登录的窗口
5B36F8E8 |. 56 push esi ; /hWnd = 00000001
5B36F8E9 |. FF15 8CD7F15B call dword ptr ds:[<&USER32.BringWindowT>; \BringWindowToTop
5B36F8EF |. 6A 00 push 0x0 ; /pResult = NULL
5B36F8F1 |. 68 E8030000 push 0x3E8 ; |Timeout = 1000. ms
5B36F8F6 |. 6A 02 push 0x2 ; |Flags = SMTO_NORMAL|SMTO_ABORTIFHUNG
5B36F8F8 |. 6A 00 push 0x0 ; |lParam = 0x0
5B36F8FA |. 6A 00 push 0x0 ; |wParam = 0x0
5B36F8FC |. 68 E00B0000 push 0xBE0 ; |Message = MSG(0xBE0)
5B36F901 |. 56 push esi ; |hWnd = 00000001
5B36F902 |. FF15 74D9F15B call dword ptr ds:[<&USER32.SendMessageT>; \SendMessageTimeoutW
5B36F908 |. 85F6 test esi,esi
5B36F90A |> 0f95c0 setne al
5B36F90D |. 5E pop esi ; LoadDl_1.60001057
5B36F90E |. C3 retn 函数返回(有多开时)
5B36F90F |> 32C0 xor al,al 函数返回(没有多开时)
5B36F911 \. C3 retn

消息防撤回

消息防撤回,带对方撤回消息提示!

和上边一样,先查找所有参考文本字符串:pStrMsgid value is null

然后找到以下这段代码并修改(看右侧的注释说明,需要修改 1 处星标的行):

68E854DA  |> \8B06          mov eax,dword ptr ds:[esi]
68E854DC |. 8BCE mov ecx,esi
68E854DE |. FF50 18 call dword ptr ds:[eax+0x18]
68E854E1 |. 85C0 test eax,eax ; WeChatWi.68B90000
68E854E3 |.^ 74 9D je short WeChatWi.68E85482
68E854E5 |. 68 F4C7336A push WeChatWi.6A33C7F4 ; ASCII "revokemsg"
68E854EA |. 8BC8 mov ecx,eax ; WeChatWi.68B90000
68E854EC |. E8 0F2F7700 call WeChatWi.695F8400
68E854F1 |. 8BF0 mov esi,eax ; WeChatWi.68B90000
68E854F3 |. 85F6 test esi,esi
68E854F5 |.^ 74 8B je short WeChatWi.68E85482
68E854F7 |. 68 F8D4336A push WeChatWi.6A33D4F8 ; ASCII "newmsgid"
68E854FC |. 8BCE mov ecx,esi
68E854FE |. E8 FD2E7700 call WeChatWi.695F8400
68E85503 |. 85C0 test eax,eax ; WeChatWi.68B90000 ★ 修改为 xor eax,eax
68E85505 |. 74 7B je short WeChatWi.68E85582 > PS:或者把 je 改为 jne 也可以?待测试!
68E85507 |. 8BC8 mov ecx,eax ; WeChatWi.68B90000
68E85509 |. E8 82377700 call WeChatWi.695F8C90
68E8550E |. 85C0 test eax,eax ; WeChatWi.68B90000
68E85510 |. 75 62 jnz short WeChatWi.68E85574
68E85512 |. 0F1005 98F52B>movups xmm0,dqword ptr ds:[0x6A2BF598]
68E85519 |. 83EC 10 sub esp,0x10
68E8551C |. BA C0C3336A mov edx,WeChatWi.6A33C3C0 ; ASCII "02_manager\ChatMgr.cpp"
68E85521 |. 8BC4 mov eax,esp
68E85523 |. B9 02000000 mov ecx,0x2
68E85528 |. 83EC 10 sub esp,0x10
68E8552B |. 0F1100 movups dqword ptr ds:[eax],xmm0
68E8552E |. 8BC4 mov eax,esp
68E85530 |. 83EC 10 sub esp,0x10
68E85533 |. 0F1100 movups dqword ptr ds:[eax],xmm0
68E85536 |. 8BC4 mov eax,esp
68E85538 |. 83EC 10 sub esp,0x10
68E8553B |. 0F1100 movups dqword ptr ds:[eax],xmm0
68E8553E |. 8BC4 mov eax,esp
68E85540 |. 83EC 10 sub esp,0x10
68E85543 |. 0F1100 movups dqword ptr ds:[eax],xmm0
68E85546 |. 8BC4 mov eax,esp
68E85548 |. 83EC 10 sub esp,0x10
68E8554B |. 0F1100 movups dqword ptr ds:[eax],xmm0
68E8554E |. 8BC4 mov eax,esp
68E85550 |. 68 E0D4336A push WeChatWi.6A33D4E0 ; ASCII "pStrMsgid value is null"
68E85555 |. 68 F8C3336A push WeChatWi.6A33C3F8 ; ASCII "ChatMgr"
68E8555A |. 68 C4D4336A push WeChatWi.6A33D4C4 ; ASCII "ChatMgr::parseRevokeContent"
68E8555F |. 68 8B080000 push 0x88B
68E85564 |. 0F1100 movups dqword ptr ds:[eax],xmm0
68E85567 |. E8 54732900 call WeChatWi.6911C8C0
68E8556C |. 83C4 70 add esp,0x70
68E8556F |.^ E9 0EFFFFFF jmp WeChatWi.68E85482

破解完成

复制所有修改并保存到文件,然后替换 WeChatWin.dll 原文件,重新运行微信即可。

参考资料

微信PC端多开的秘密

微信PC段防撤回DLL(WeChatWin.dll)修改测试

深扒微信多开的秘密后,我竟然发现了个 bug

微信 最新 电脑版 绿色修改版,和官方同步更新,有现成破解补丁下载,安全性自测!

微信 最新 电脑版 正式版+测试版+开发版(多开+防撤回,带撤回提示),和官方同步更新,有现成破解补丁下载,安全性自测!

2021-04-26

⬆︎TOP