前言

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

  泽东同志说得好:自己动手,丰衣足食!,所以核总在这里教大家纯手工修改方法。

准备工作

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

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

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

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

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

破解流程

1.解除多开限制

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

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

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

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

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

  用伪代码表示一下判断逻辑

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

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

  WeChatMainWndForPCWeChatLoginWndForPC

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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

2.消息防撤回

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

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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

3.破解完成

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

下载地址

  不提供任何破解文件下载,免得腾讯律师函警告。

参考资料

  微信PC端多开的秘密

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

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

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

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