微信电脑端也能多开
昨天,偶然从好朋友小林(微信公众号:小林Coding)处得知,他的电脑居然可以同时上两个微信号 。
手机端多开微信我知道,像华为、小米等手机系统都对此做了支持,不过在运行windows系统的电脑上怎么启动两个微信呢,这倒是一下引起了我的好奇 。
小林告诉我他是这样做的,写了一个批处理:
start D:WeChatWeChat.exestart D:WeChatWeChat.exe
然后直接双击批处理文件,就能启动两个微信进程 。
我试了一下,果然如此!
随后我又加了一行,竟然还能启动3个:
文章插图
接着我在网络上搜了一下,原来这一招早就被人用过了,看来是我火星了 。不过到底为什么用这种方式就能多开,我倒是很想知道这个迷底 。
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函数将其置顶弹出 。这两个窗口分别代表的是微信的主界面窗口和登陆界面窗口,如果一个微信实例已经存在,则势必处于这两种状态之一 。
文章插图
上面图片的注解已经说明了,函数sub_108e2660的返回值将决定是否启动微信实例进程,还是直接退出 。
真相只有一个事情到这里就真相大白了,来总结一下 。
微信判断是否启动的2个条件:
推荐阅读
- 抖音上买东西存在哪些官方途径 抖音买东西有没有保障
- 手机充电器一直插在插座上会耗电吗?看完文章终于懂了!
- 历史上刘禅是个什么人物 三国的刘禅真正历史是什么样
- 微信外挂功能强大但可能犯法!这个研发团伙就被上海警方抓了
- 汉族战斗力 汉族厉害吗
- 苹果在可穿戴设备上再获多项专利批准,剑指运动健康
- 华为汽车BU总裁王军首次参加行业峰会登上了谁的舞台?
- 世界上最小的乌龟有多大?
- 手部全息反射区
- 承满穴