中年|微信pc端居然能多开,我探究了一波多开的秘密
然后直接双击批处理文件 , 就能启动两个微信进程 。
我试了一下 , 果然如此!
随后我又加了一行 , 竟然还能启动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个条件:
- 如果能成功创建互斥体对象 , 则启动微信
- 如果不能创建互斥体:
- 如果找到对应窗口 , 则置顶之 , 自己退出
- 如果没有找到 , 则启动微信
if(CreateMutex() == SUCCESS) {启动微信} else {if(FindWindow() == SUCCESS) {将已有窗口置顶} else {启动微信}} 而直接使用脚本启动的多个进程 , 虽然操作系统内核层面保证了互斥体的唯一 , 但由于启动速度相差不大 , 相应的窗口还没有来得及创建出来 , 导致走入上面的第二个启动逻辑 , 从而可以启动多个实例 。
小发现 在分析的过程中 , 发现了一个有趣的事情:
在WeChatWin.dll中 , 上面的创建互斥体再上一级函数名字叫StartWaChat , 也是作为导出函数被该DLL导出:
本文插图
【来源:Java识堂】
声明:转载此文是出于传递更多信息之目的 。 若有来源标注错误或侵犯了您的合法权益 , 请作者持权属证明与本网联系 , 我们将及时更正、删除 , 谢谢 。邮箱地址:newmedia@xxcb.cn
【中年|微信pc端居然能多开,我探究了一波多开的秘密】
推荐阅读
- 央视新闻客户端|甘肃陇南文县泥石流灾害 堰塞湖已打开泄水口
- 微信朋友圈|微信朋友圈可以删评论了?微信拍一拍摇一摇怎么玩方法攻略介绍
- 移动互联网|微信终于有这个功能了!但尴尬的是……
- 减肥|JAMA:减肥要趁早,25岁就该开始预防中年期肥胖
- 微信朋友圈可以删评论了|微信朋友圈可以删评论了 但是被删除评论的人也能看见
- 央视新闻微信号|被叫停6年,木里矿区仍现大量存煤,盗采黑手如何伸进祁连山?
- 科技日报|功能性玉米被端上餐桌 这个数据库帮了大忙
- 苹果|再次确认如果安卓系统不支持微信,鸿蒙OS是最大赢家
- 央视新闻客户端|一架土耳其直升机在伊拉克境内坠毁 机组人员全部遇难
- 央视新闻客户端|世卫组织:全球新增250285例新冠肺炎确诊病例
