您也可以打开更多微信计算机
最近,我不小心从我的好朋友那里学到,他的计算机实际上可以同时访问两个微信帐户。
我知道,华为和小米等手机已经支持了这一点,但是如何在运行系统的计算机上启动两个微信?这引起了我的好奇心。
告诉我他这样做并写了一批:
start D:\WeChat\WeChat.exe
start D:\WeChat\WeChat.exe
然后,双击批处理文件以启动两个微信进程。
我尝试了,事实证明是如此!
然后我添加了另一行,可以再启动3个:
然后我搜索了互联网,发现此举很久以前就使用了。似乎是我在火星上。但是我真的很想知道为什么我可以以这种方式打开更多。
提示:如果您对技术分析部分不感兴趣,则可以跳到直接到后部分的真相部分。
微信的模型
在正常情况下,如果您手动双击微信号开始,则该过程稍后将进行全局模式检查。如果发现已经存在一个微信过程,则将直接激活相应过程的微信窗口,将其定位在桌面的前面,然后独自退出。
但是,为什么我们可以在上述方法中启动其中两个呢?让我们找出答案。
首先,让我们分析上述微信的单个实例如何实现。
正在开发平台应用程序的朋友可能会熟悉这一点。通常,在过程启动后,创建了具有全球唯一名称的静音。如果创建成功,它将正常启动。如果创建失败,它将确定二线是否已经存在。如果已经存在,则意味着相应的程序在启动之前已经启动。
使用此猜想,使用该工具查看由微信过程打开的所有内核对象,并找到静音部分:
果然,有一个哑光。从这个名称可以猜测,这绝对与微信的模式有关。
接下来,启动工件,可以帮助您监视指定过程的API调用状态,并检查其两个API功能。当微信已经运行时,请使用此工具开始微信流程并查看功能调用情况:
您可以看到,在使用此名称创建静音后,该函数被调用并返回以查看手册,这意味着:
表明它已经存在。
让我们看一下此通话的堆栈,看看代码在何处创建此全局互斥:
从堆栈中,呼叫来自微信目录中的 .dll。具体位置是偏移量的先前指令。
接下来,我们将在著名的拆卸软件IDA中使用工件。这个人支持对X86,X64,ARM,MIPS和各种系统平台等各种处理器体系结构的计划分析,,,,,,,一种,,,,,,,,,,,,一种,,,
使用IDA打开此.dll文件,并在偏移量中找到它:
如上图所示,创建静音的作用发生在函数中。
上层是调用它的功能:
上图反映了创建静音后的判断逻辑:
问题在于上述判断。装配代码看起来有点引人注目。让我们在F5中还原C代码(仅能完成恢复效果,只需清楚地阅读逻辑):
上图中的注释已经解释说,该函数的返回值将确定是启动微信实例过程还是直接退出。
只有一个真理
事实在这一点上已经揭示了,让我们总结一下。
确定是否在微信上开始的两个条件:
使用伪代码来表达它:
if (CreateMutex() == SUCCESS) {
启动微信
} else {
if (FindWindow() == SUCCESS) {
将已有窗口置顶
} else {
启动微信
}
}
对于直接从脚本开始的多个过程,尽管操作系统内核级别可确保静音的唯一性,因为启动速度的差异很小,但尚未创建相应的窗口,这导致了上面的第二个启动逻辑,因此可以启动多个实例。
小发现
在分析过程中,发现了一个有趣的事情:
在.dll中,以上创建的以先前的级别函数命名,该功能也由DLL导出为导出函数:
我不知道这是故意的还是在微信上写的。如果是错别字,这位程序员的同学看到了它,然后去秘密修改它。
- eof-