• 技术文章 >Java >java教程

    如何使用Java实现在微信PC端多开?

    王林王林2023-04-21 15:04:08转载36

    微信电脑端也能多开

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

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

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

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

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

    我试了一下,果然如此!

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

    java怎么实现微信PC端多开

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

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

    微信的单例模式

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

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

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

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

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

    java怎么实现微信PC端多开

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

    接着,启动神器APIMonitor,它可以帮你监控指定进程的API调用情况,勾选上CreateMutexGetLastError这两个Windows API函数。在已经有微信在运行的情况下,用这个工具再启动一个微信进程,看一下函数调用情况:

    java怎么实现微信PC端多开

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

    java怎么实现微信PC端多开

    表示已经存在。

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

    java怎么实现微信PC端多开

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

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

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

    java怎么实现微信PC端多开

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

    上层是sub_108e2660函数在调用它:

    java怎么实现微信PC端多开

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

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

    java怎么实现微信PC端多开

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

    真相只有一个

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

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

    用伪代码来表示一下:

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

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

    小发现

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

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

    java怎么实现微信PC端多开

    以上就是如何使用Java实现在微信PC端多开?的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:亿速云,如有侵犯,请联系admin@php.cn删除
    专题推荐:Java
    上一篇:Java中使用Date和SimpleDateFormat类来处理时间的方法及用法介绍 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • Java数组的定义和使用方式• Java设计模式:模板方法模式实例解析• 如何使用Java实现考试奖励?• 如何在Java的.properties文件中写入反斜线\?• Java位运算示例代码分析
    1/1

    PHP中文网