前言:逛帖子的时候遇到一篇有趣的帖子,我们现在的手机基本支持微信多开,但是电脑不能多开。其实原理就是微信启动采用了单例模式的设计结构,但是又没有采用双校验锁的机制,仿佛是故意留下的暗门一样,可以让我们偷渡进去实现双开。简单的来说就是,一个房间只能有一个人进去,第一个人进去后用锁将门锁住,后面的人就进不来了,但是如果第二个人在锁门之前短暂的时间内跑到房间里,虽然门被锁了,但是房间里有了两个人,这就是双开

一、前言

手机端多开微信我知道,像华为、小米等手机系统都对此做了支持,不过在运行Windows系统的电脑上怎么启动两个微信呢,至少写了一个批处理:

start D:\WeChat\WeChat.exe
start D:\WeChat\WeChat.exe

然后直接双击批处理文件,就能启动两个微信进程。试了一下,果然如此!

接着我在网络上搜了一下,原来这一招早就被人用过了,看来是我火星了。不过到底为什么用这种方式就能多开,我倒是很想直到这个迷底。
TIPS:如果对技术分析部分不感兴趣,可以跳过直接来到后面的真相部分。

二、原理

微信的单例模式
正常情况下,直接手动双击微信图标启动,后面启动的进程会进行全局单例模式检查,如果发现已经存在微信进程,就会直接把对应进程的微信窗口激活,定位到桌面最前面,随后自己退出。
但为什么用上面的方式就能启动俩呢?我们来一探究竟。
首先,分析一下上面描述的微信单个实例是如何实现的。
做过Windows平台应用程序开发的朋友可能对此比较熟悉,一般是进程启动后创建一个全局唯一名字的互斥体,创建成功则正常启动,创建失败则判断一下是否这个互斥体已经存在。如果已经存在则说明已经有对应程序之前启动。
带着这种猜想,用工具procexp查看一下微信进程打开的所有内核对象,并找到互斥体部分:

果然,这其中有一个名字叫_WeChat_App_Instance_Identity_Mutex_Name的互斥体,从这个名字可以猜出,这个跟微信的单例模式绝对有关系。
接着,启动神器APIMonitor,它可以帮你监控指定进程的API调用情况,勾选上CreateMutex和GetLastError这两个Windows API函数。在已经有微信在运行的情况下,用这个工具再启动一个微信进程,看一下函数调用情况:

可以看到,创建这个名字的互斥体后,随后又调用了GetLastError函数,并返回了0x000000b7,查看手册,其含义:

表示已经存在。
来看一下,这个CreateMutex调用的堆栈,看看是哪个地方的代码在创建这个全局互斥体:

从堆栈看出,调用来自于微信目录下的一个动态库WeChatWin.dll。具体位置在偏移0x8e271b处的前一条指令。
接下来就要祭出神器中的神器,大名鼎鼎的反汇编软件IDA,这家伙支持x86、x64、ARM、MIPS等多种处理器架构和Windows、Linux、Android、MacOS、JVM等多种系统平台的程序分析。
用IDA打开这个WeChatWin.dll文件,并定位到偏移0x8e271b处:

如上图所示,创建互斥体的动作,发生在函数sub_108e26d0。
上层是sub_108e2660函数在调用它:

上面这张图反映了创建互斥体后的判断逻辑:
如果sub_108e26d0的返回值为0,表示没有错误,当前函数也直接返回0。
如果sub_108e26d0的返回值不为0,表示出现了错误,则依次判断WeChatMainWndForPC和WeChatLoginWndForPC两个窗口是否存在,如果存在则使用BringWindowToTop函数将其置顶弹出。这两个窗口分别代表的是微信的主界面窗口和登陆界面窗口,如果一个微信实例已经存在,则势必处于这两种状态之一。
问题就出在上面这个判断中,汇编代码看起来有点辣眼睛,咱们F5来还原一下C代码(还原效果只能凑合看,能看清楚逻辑就行):

上面图片的注解已经说明了,函数sub_108e2660的返回值将决定是否启动微信实例进程,还是直接退出。
真相只有一个
事情到这里就真相大白了,来总结一下。
微信判断是否启动的2个条件:
如果能成功创建互斥体对象,则启动微信
如果不能创建互斥体:
如果找到对应窗口,则置顶之,自己退出
如果没有找到,则启动微信
用伪代码来表示一下:

if (CreateMutex() == SUCCESS)
{启动微信
}
else
{if (FindWindow() == SUCCESS) {将已有窗口置顶} else {启动微信}
}

而直接使用脚本启动的多个进程,虽然操作系统内核层面保证了互斥体的唯一,但由于启动速度相差不大,相应的窗口还没有来得及创建出来,导致走入上面的第二个启动逻辑,从而可以启动多个实例。
彩蛋
在分析的过程中,发现了一个有趣的事情:
在WeChatWin.dll中,上面的创建互斥体再上一级函数名字叫StartWaChat,也是作为导出函数被该DLL导出:

这里不知道是故意还是不小心把微信的WeChat写成了WaChat,如果是笔误,这位程序员同学看到了赶紧偷偷去改一下吧。

三、具体操作
新建一个文件,保存时后缀名改成.bat格式,添加代码

start E:\微信\WeChat\WeChat.exestart E:\微信\WeChat\WeChat.exe
pause

其中E:\微信\WeChat\WeChat.exe是我微信启动程序的路径,pause使程序运行后不直接退出。两次启动代码中间隔了两行是因为操作将我第二个start命令的st给“吃了”。

震惊!微信PC端也能多开!相关推荐

  1. 微信PC端浏览器内置浏览器

    嵌入式Chromium框架(简称CEF) 是一个由Marshall Greenblatt在2008建立的开源项目,它主要目的是开发一个基于Google Chromium的Webbrowser控件,支持 ...

  2. 微信PC端技术研究(2)-保存聊天语音

    微信PC端技术研究-保存聊天语音 转载地址: [原创]微信PC端技术研究(2)-保存聊天语音-软件逆向-看雪论坛-安全社区|安全招聘|bbs.pediy.com 0x0. 前言 最近又学习了某位大佬用 ...

  3. 微信PC端测试版更新:新增视频号直播工具

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 推荐:https://www.xttblog.com/?p=5155 明天就开始 ...

  4. 微信PC端技术研究(2)-拿下语音

    微信PC端技术研究-保存聊天语音 by anhkgg(公众号:汉客儿) 2019年1月31日 2.6.6.28 0x0. 前言 虽然一直知道CE,也用过一段时间,但一直用不好,可能太笨. 最近又学习了 ...

  5. 新版阴阳师桌面版pc端固定窗口大小多开

    阴阳师pc端固定窗口大小多开 随着阴阳师2020年周年的到来, 阴阳师官方对手机端和pc端也是进行了强制更新, 更新后导致pc端的阴阳师没法像之前一样固定游戏开启时的大小, 在网上查阅了一些资料, 在 ...

  6. 使用微信PC端的截图dll库实现微信截图功能(C++ Builder实现)

    使用微信PC端的截图dll库实现微信截图功能(C++ Builder实现) 网上有很多文章说"使用微信PC端的截图dll库实现微信截图功能",我用node实现截图也要用一下,于是找 ...

  7. 微信PC端有了新功能,快来看看你知不知道

    你们知道微信PC端更新了吗?它新增了几个功能,有兴趣了解的朋友就接着往下看吧. 1.文件路径更清晰 微信之前的文件存储路径,都是一串乱码的文件夹,不便于我们查找和管理. 微信更新后,现在接收到的文件路 ...

  8. win7下搭建小程序服务器,重磅!微信PC端支持小程序直接开启 适配Win7及以上系统...

    原标题:重磅!微信PC端支持小程序直接开启 适配Win7及以上系统 腾讯科技讯 8月9日,腾讯科技在"微信开放社区"发现,微信正在测试"PC端支持打开小程序"能 ...

  9. 基于微信PC端小程序抓包方法

    文章目录 前言 一.Proxifier介绍 二.下载及安装 三.使用配置 前言 因为微信小程序基本都是基于HTTPS的,所以抓取HTTPS数据包就是最关键的一步,通过自身实践,推荐使用Proxifie ...

最新文章

  1. 给现有MVC项目增加Web API支持
  2. 某同学配置了一台计算机,第六章 计算机硬件系统作业答案.doc
  3. 嵌入式RT3070 AP模式移植
  4. Robbers' watch CodeForces - 685A (暴力)
  5. Java-深拷贝与浅拷贝
  6. Spring系统学习:20180612--aop配置中表达式的写法
  7. 那是我夕阳下的奔跑--一个萌新的觉醒
  8. BI在企业数字化转型中的价值
  9. NoiseAsh Rule Tec All Collection for Mac(无源均衡器)
  10. 6- vue django restful framework 打造生鲜超市 -完成商品列表页(下)
  11. 现代通信原理:月考(二)答案
  12. Java并发编程实践-总结
  13. gephi java教程_gephi生成图(java版)
  14. 23_Open_Loop
  15. cython使用初步
  16. 网易2019实习生招聘笔试-牛牛的闹钟
  17. apple oauth 三方登录
  18. FI--SAP财务系统总账应用技巧
  19. 关于周报的写法和原则
  20. 什么是物理机(独立服务器)?物理机和虚拟主机有什么区别?

热门文章

  1. 攻防世界新手misc坚持60秒
  2. 工信部规范手机预装软件 专家称问题是黑山寨手机
  3. 【入门级】在Python里用while循环实现阶乘
  4. Linux下批量查看IP主机是否存活
  5. 即时聊天社交软件(二)
  6. accounting.js_使用Accounting.js格式化数字
  7. 4-ipv6服务器之-pppoev6
  8. php滴滴平台接口,滴滴API请求SDK
  9. 论文抄袭!她的硕士、博士学位,将全部撤销!
  10. FORTRAN+计算物理学学习日记(6)