微信电脑端也能多开

昨天,偶然从好朋友小林(微信公众号:小林Coding)处得知,他的电脑居然可以同时上两个微信号。

手机端多开微信我知道,像华为、小米等手机系统都对此做了支持,不过在运行Windows系统的电脑上怎么启动两个微信呢,这倒是一下引起了我的好奇。

小林告诉我他是这样做的,写了一个批处理:

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

然后直接双击批处理文件,就能启动两个微信进程。

我试了一下,果然如此!

随后我又加了一行,竟然还能启动3个:

接着我在网络上搜了一下,原来这一招早就被人用过了,看来是我火星了。不过到底为什么用这种方式就能多开,我倒是很想知道这个迷底。

TIPS:如果对技术分析部分不感兴趣,可以跳过直接来到后面的真相部分。

微信的单例模式

正常情况下,直接手动双击微信图标启动,后面启动的进程会进行全局单例模式检查,如果发现已经存在微信进程,就会直接把对应进程的微信窗口激活,定位到桌面最前面,随后自己退出。

但为什么用上面的方式就能启动俩呢?我们来一探究竟。

首先,分析一下上面描述的微信单个实例是如何实现的。

做过Windows平台应用程序开发的朋友可能对此比较熟悉,一般是进程启动后创建一个全局唯一名字的互斥体,创建成功则正常启动,创建失败则判断一下是否这个互斥体已经存在。如果已经存在则说明已经有对应程序之前启动。

带着这种猜想,用工具procexp查看一下微信进程打开的所有内核对象,并找到互斥体部分:

果然,这其中有一个名字叫 _WeChat_App_Instance_Identity_Mutex_Name 的互斥体,从这个名字可以猜出,这个跟微信的单例模式绝对有关系。

接着,启动神器APIMonitor,它可以帮你监控指定进程的API调用情况,勾选上CreateMutexGetLastError这两个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,表示出现了错误,则依次判断WeChatMainWndForPCWeChatLoginWndForPC两个窗口是否存在,如果存在则使用BringWindowToTop函数将其置顶弹出。这两个窗口分别代表的是微信的主界面窗口和登陆界面窗口,如果一个微信实例已经存在,则势必处于这两种状态之一。

问题就出在上面这个判断中,汇编代码看起来有点辣眼睛,咱们F5来还原一下C代码(还原效果只能凑合看,能看清楚逻辑就行):

上面图片的注解已经说明了,函数sub_108e2660的返回值将决定是否启动微信实例进程,还是直接退出。

真相只有一个

事情到这里就真相大白了,来总结一下。

微信判断是否启动的2个条件:

  • 如果能成功创建互斥体对象,则启动微信
  • 如果不能创建互斥体:
    • 如果找到对应窗口,则置顶之,自己退出
    • 如果没有找到,则启动微信

用伪代码来表示一下:

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

而直接使用脚本启动的多个进程,虽然操作系统内核层面保证了互斥体的唯一,但由于启动速度相差不大,相应的窗口还没有来得及创建出来,导致走入上面的第二个启动逻辑,从而可以启动多个实例。

小发现

在分析的过程中,发现了一个有趣的事情:

在WeChatWin.dll中,上面的创建互斥体再上一级函数名字叫StartWaChat,也是作为导出函数被该DLL导出:

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

往期TOP5文章

CPU明明8个核,网卡为啥拼命折腾一号核?

因为一个跨域请求,我差点丢了饭碗

完了!CPU一味求快出事儿了!

哈希表哪家强?几大编程语言吵起来了!

一个HTTP数据包的奇幻之旅

揭开电脑上登录多个微信的秘密相关推荐

  1. 电脑开两个微信_电脑上登录两个微信或是多个微信?

    现在越来越多的人都有两个甚至多个微信号,一个用作跟客户生意,一个用来与家人朋友聊天. 今天,我就给大家讲讲,怎样在一台电脑上同时登录两个微信甚至是多个微信号,即微信多开? 第一种:代码双开 Windo ...

  2. 上微信怎么同时用计算机,想同时在电脑上登录多个微信(微信多开)?用start指令可以解决...

    微信目前也是有电脑版的,这个很多微信用户都知道.电脑版微信可以与手机版微信同时登录,同时接收微信消息和文件. 很多微信用会发现电脑微信还不能像QQ那样,同时多个一起登录.其实可以在命令提示符,使用&q ...

  3. 微信多开txt_电脑上登录多个微信(微信多开)教程

    各位新老司机朋友晚上好,我是隔壁老王! 现在很多人都在已经放弃了QQ,转移到微信上了,因为现在每次登录都必须要手机扫码验证,虽然说有人觉得这样不容易被盗,其实这也是有麻烦的地方.万一哪天手机丢失或者工 ...

  4. 在电脑上登录两个微信

    第一步.找到微信图标,右键打开属性,复制目标中的路径 第二步.新建一个txt文件,将刚刚复制的内容粘贴到文本里 第三步.修改文件格式 如:start C:"Program Files (x8 ...

  5. 怎样操作在电脑临时登录微信?技巧经验!如何在电脑上登录微信?

    微信对于我们大家生活中已经算是日常使用很为频繁的软件了,对于我们有一些特殊事情在手机微信上不好处理,怎么能在电脑上来进行完成呢?怎样临时使用电脑版的微信?下面小编就为大家分享如何在电脑上临时登录微信. ...

  6. 上微信怎么同时用计算机,1个电脑怎么开2个微信_让电脑同时登录两个微信的方法-系统城...

    工作时,看到别人电脑端同时登陆 2个及以上微信号,看着很厉害的样子,看到自己电脑只能登录一个微信号,办事情都不方便.那么有什么办法让电脑同时登录两个微信?其实方法是有的,现在小编分享让1个电脑同时开2 ...

  7. 微信在诺基亚手机登录服务器繁忙,马化腾正式宣布:禁止在该手机上登录QQ和微信?网友:诺基亚再见...

    原标题:马化腾正式宣布:禁止在该手机上登录QQ和微信?网友:诺基亚再见 大家都知道手机已经成了我们生活中必不可少的东西,而手机的品牌也特别多,包括国产手机和三星 苹果等手机.而手机的的 品牌 价格 体 ...

  8. 一个电脑如何登录两个微信,电脑企业版怎么多开双开呢,最新不限登录

    有的朋友由于工作的原因会需要在电脑上用到两个微信或者是两个以上的微信,那么在我们电脑上其实是有限制的只能规定登录一个账号,那么规矩是死的可人是活的呀,那么如何在电脑上登录两个或以上的微信呢?其实办法有 ...

  9. 服务器里微信怎么多开,电脑上如何多开微信?三个微信多开方法分享,超详细步骤!...

    原标题:电脑上如何多开微信?三个微信多开方法分享,超详细步骤! 在我们日常工作和日常生活中,有时我们在电脑办公室时经常使用微信,但我们知道电脑上微信不能像QQ一样同时登陆多个账号.但是对很多营销人员来 ...

最新文章

  1. android 相机智能补光,美图秀秀智能补光功能应用详解
  2. Lucene学习总结之二:Lucene的总体架构
  3. xtrabackup mysql 5.6_MySQL 5.6对于Xtrabackup的影响
  4. 什么是pisa测试_PISA测试排名世界第一,中国教育已是世界冠军?
  5. selenium与chromedriver的操作
  6. 第一讲:使用html5——canvas绘制奥运五环
  7. Zabbix 5.0 监控 SSH 登录
  8. Linux编译链接环境变量
  9. 联通光猫创维DT741-csf如何获取超级账户
  10. 后端---史上最全最小白最简单最细致的Java接入微信支付接口(Native接入)
  11. 程序员键盘使用进阶技巧
  12. Android 修改zxing二维码样式
  13. 【图像超分辨率重建】——HAN论文阅读笔记
  14. Stetman读paper小记:BackdoorBench - A Comprehensive Benchmark of Backdoor Learning
  15. 5、树莓派连接官方CSI摄像头的使用
  16. 软件工程毕业设计题目安卓Android移动端推荐
  17. 黑马程序员----字典、NSDictionary
  18. centos7搭建owncloud私有云
  19. CTF密码学中RSA学习以及总结
  20. 香橙派OrangePi Zero2开发板外接USB无线网卡测试示例

热门文章

  1. 写一个freeRTOS
  2. CSS库 Tailwind
  3. 场内场外交易成本_场内基金与场外基金各有什么优劣势?
  4. 源码解读 Spring中Bean扫描的原理
  5. Android:在同一WiFi下通讯(局域网下服务端和客户端通讯)
  6. IFR报告显示过去五年全球工业机器人销量翻番
  7. Python全栈面试题
  8. python实战:合并多个不同样式的excel的sheet到一个文件中
  9. 基于STM32F767IGT6的RT-thread工程
  10. unity urp内置lit材质源码解析(上)