微信PC端多开的隐秘

admin 3个月前 (07-24) 科技 54 0

微信电脑端也能多开

昨天,有时从好同伙小林(微信民众号:小林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,查看手册,其寄义:

微信PC端多开的隐秘 第1张

示意已经存在。

来看一下,这个CreateMutex挪用的客栈,看看是哪个地方的代码在建立这个全局互斥体:

微信PC端多开的隐秘 第2张

从客栈看出,挪用来自于微信目录下的一个动态库WeChatWin.dll。具体位置在偏移0x8e271b处的前一条指令。

接下来就要祭出神器中的神器,赫赫有名的反汇编软件IDA,这家伙支持x86、x64、ARM、MIPS等多种处理器架构和Windows、Linux、Android、MacOS、JVM等多种系统平台的程序剖析。

用IDA打开这个WeChatWin.dll文件,并定位到偏移0x8e271b处:

微信PC端多开的隐秘 第3张

如上图所示,建立互斥体的动作,发生在函数sub_108e26d0。

上层是sub_108e2660函数在挪用它:

微信PC端多开的隐秘 第4张

上面这张图反映了建立互斥体后的判断逻辑:

  • 若是sub_108e26d0的返回值为0,示意没有错误,当前函数也直接返回0。
  • 若是sub_108e26d0的返回值不为0,示意泛起了错误,则依次判断WeChatMainWndForPCWeChatLoginWndForPC两个窗口是否存在,若是存在则使用BringWindowToTop函数将其置顶弹出。这两个窗口划分代表的是微信的主界面窗口和上岸界面窗口,若是一个微信实例已经存在,则势必处于这两种状态之一。

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

微信PC端多开的隐秘 第5张

上面图片的注解已经说明晰,函数sub_108e2660的返回值将决议是否启动微信实例历程,照样直接退出。

真相只有一个

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

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

  • 若是能乐成建立互斥体工具,则启动微信
  • 若是不能建立互斥体:
    • 若是找到对应窗口,则置顶之,自己退出
    • 若是没有找到,则启动微信

用伪代码来示意一下:

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

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

小发现

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

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

微信PC端多开的隐秘 第6张

这里不知道是有意照样不小心把微信的WeChat写成了WaChat,若是是笔误,这位程序员同砚看到了赶快偷偷去改一下吧。

往期TOP5文章

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

由于一个跨域请求,我差点丢了饭碗

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

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

一个HTTP数据包的奇幻之旅

微信PC端多开的隐秘 第7张

微信PC端多开的隐秘 第8张

,

Allbet Gmaing开户

欢迎进入Allbet Gmaing开户(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

Allbet声明:该文看法仅代表作者自己,与本平台无关。转载请注明:微信PC端多开的隐秘

网友评论

  • (*)

最新评论

站点信息

  • 文章总数:438
  • 页面总数:0
  • 分类总数:8
  • 标签总数:981
  • 评论总数:120
  • 浏览总数:3091