一般而言,在Windows系统里面要实现单实例运行,基本都是用互斥体来实现的(微信也是这样做的)。

互斥体,只能同时被一个线程持有, 只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。下面先给出限制只允许单个实例运行用到的代码:

#include <windows.h> class CSingleInstance
{
public:CSingleInstance(TCHAR *strMutexName){// 创建互斥量m_hMutex = CreateMutex(NULL, FALSE, strMutexName); // 检查错误代码m_dwLastError = GetLastError();}~CSingleInstance(){if (m_hMutex){CloseHandle(m_hMutex);m_hMutex = NULL;}}BOOL IsOtherInstanceRunning(){return (ERROR_ALREADY_EXISTS == m_dwLastError);}protected:DWORD  m_dwLastError;HANDLE m_hMutex;
};

要限制多开,在程序入口处,添加以下代码即可:

//程序单例检查,只允许一个程序存在
CSingleInstance _singleIns(L"WeChatExe");
if (_singleIns.IsOtherInstanceRunning())
{::MessageBox(NULL, L"《WeChat软件》正在运行!", L"提示", MB_OK);return 1;
}

微信启动时,它会检查创建的Mutex是否存在,从而限制多开!而Mutex是CreateMutex来创建的,其函数原型如下:

WINBASEAPI
_Ret_maybenull_
HANDLE
WINAPI
CreateMutexW(_In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes,_In_ BOOL bInitialOwner,_In_opt_ LPCWSTR lpName);

第一个参数是一个指向SECURITY_ATTRIBUTES结构体的指针,一般的情况下,可以是nullptr。

第二个参数类型为BOOL,表示互斥锁创建出来后是否被当前线程持有。

第三个参数类型为字符串(const WCHAR *),是这个互斥锁的名字,如果是nullptr,则互斥锁是匿名的。

微信的Mutex名字是:_WeChat_App_Instance_Identity_Mutex_Name,别问我是怎么知道的,接着往下看,你就知道了:

一、打开微信,接着打开OD,文件>附加,选择“WeChat”,然后关闭OD。

二、接着再打开OD,在菜单栏文件中,选择最近打开的文件(微信的程序执行路径),OD会自动去启动微信。使用组合键(CTRL+G),打开查找的界面,输入CreateMutexW,点击确定。它会自动定位到用到CreateMutexW的位置:

三、然后F2下断点,单步运行,注意观察右下方的模块名字(微信的是WeChatWi开头的)。

四、真相大白,找到微信用到的Mutex名字

五、打开CE,附加WeChat,手动添加地址,勾选“Unicode”,长度改为64,确定。

六、在CE下方双击刚才添加的地址,修改Mutex名字,点击确定。

七、返回OD,可以看到内存里面的Mutex名字已被修改:

八、在OD删掉断点,让程序继续往下执行,出现微信登录界面。

九、在不经过任何处理的情况下,再次启动微信,发现打开了两个微信。

以上就是程序限制多开的原理了,知道原理后,用代码来实现微信多开就会简单很多了!

附上微信多开相关的资料:

https://www.cnblogs.com/DarkBright/p/10878553.html

https://www.52pojie.cn/thread-608108-1-1.html

Windows逆向 微信是如何限制多开的相关推荐

  1. Windows实现微信双(多)开—微信分身

    最近经常需要同时开两个微信,顺便记录一下Windows系统下微信分身的过程: 1. 在桌面新建一个文本文档,命名随意: 2. 右键桌面的微信打开属性,找到微信的存储路径,复制粘贴(截图红色框里的路径) ...

  2. Windows逆向 微信登录二维码的字符串

    获取微信的登录二维码,网上已有很多教程了,这里稍作总结,大概就以下两种方式: 1.直接获取二维码的图片数据,下载到本地: 2.获取二维码所表示的字符串,利用其它库(比如:libqrencode)来生成 ...

  3. 微信公众号采集方案(基于Windows逆向)

    引言 目前主流的公众号采集方案只有以下几种方法 搜狗微信 无法采集历史了,而且搜索也不按时间排序.获取的数据的价值不高,不过可以通过它来获取公众号的biz. 微信公众平台 微信公众平台虽然可采集历史, ...

  4. 【Windows 逆向】使用 CE 工具挖掘关键数据内存真实地址 ( 查找子弹数据的动态地址 | 查找子弹数据的静态地址 | 静态地址分析 | 完整流程 ) ★

    文章目录 前言 一.查找子弹数据临时内存地址 二.查找子弹数据的静态地址 1.调试内存地址 05A59544 获取基址 05A59478 2.通过搜索基址 05A59478 获取内存地址 0E1DC1 ...

  5. 【Windows 逆向】使用 CE 工具挖掘关键数据内存真实地址 ( 完整流程演示 | 查找临时内存地址 | 查找真实指针地址 )

    文章目录 前言 一.查找子弹数据临时内存地址 二.查找子弹数据真实地址 前言 在上一篇博客 [Windows 逆向]使用 CE 工具挖掘关键数据内存真实地址 ( CE 找出子弹数据内存地址是临时地址 ...

  6. 微信3.1.0.41逆向-微信3.1.0.41HOOK接口(WeChatHelper3.1.0.41.dll)使用说明

    为了节省微信HOOK开发时间,现将微信HOOK注入DLL接口给大家,本接口从3.0.0.47版本开始,最新版本3.1.0.41,后续会根据自己的时间升级,本接口用vc++2017编写,Win32编译, ...

  7. 手把手教你逆向微信之朋友圈小视频转发(上)

    前言 此文为逆向微信二进制文件,实现朋友圈小视频转发的教程,从最开始的汇编代码入手到最后重签名安装等操作,手把手教你玩转微信!学会之后再去逆向微信其他功能易如反掌. 本篇文章由于篇幅太长分成了两篇,上 ...

  8. 【Windows 逆向】OD 调试器工具 ( 分析 OD 硬件断点处的关键代码 | 添加硬件断点 | 关键代码 | MOV 指令 | EAX 寄存器值分析 | 使用命令查看 esi+0cc 地址 )

    文章目录 一.添加硬件断点 二.关键代码 三.MOV 汇编指令格式 四.EAX 寄存器值分析 五.使用命令查看 esi+0cc 地址 一.添加硬件断点 在上一篇博客中 , 在子弹个数数据内存地址 07 ...

  9. 【Windows 逆向】OD 调试器工具 ( OD 调试数据时硬件断点对应的关键代码 | 删除硬件端点恢复运行 )

    文章目录 前言 一.OD 调试数据时硬件断点对应的关键代码 二.删除硬件端点恢复运行 前言 在 [Windows 逆向]OD 调试器工具 ( CE 中获取子弹动态地址前置操作 | OD 中调试指定地址 ...

最新文章

  1. 阿里云发布飞天专有云敏捷版 支持Docker企业版
  2. 我的第一个微信好友分析
  3. python pip install指定国内源镜像
  4. 西门子mag6000接线_电磁流量计MAG5000或MAG6000,通过脉冲输出累积流量,脉冲输出如何接线,如何设置参数?...
  5. 【Elasticsearch】了解Elasticsearch写入磁盘的数据
  6. 最强编程语言 Java 和最受欢迎之 Python 的巅峰对决
  7. Linux基础命令---检查密码文件pwck
  8. 【luogu P3931 SAC E#1 - 一道难题 Tree】 题解
  9. android按钮放图片不显示文字,Android 自定义标签 Imagebutton实现ImageButton里放置文字...
  10. 论文查重的标准是怎样的?
  11. 调查 问卷 设计 注意 - Web
  12. vs2013 打开失败 未能完成操作,不支持此接口
  13. gee引擎修改UI界面图文教程
  14. 依靠双工福禄克测试仪进行MPO电缆认证
  15. 服务器系统c盘在哪个文件夹,windows操作系统放在哪个文件夹下
  16. WebView加载网页空白问题
  17. 三核CPU不能安装SP4补丁问题
  18. 用Shell脚本实现自动从NewSmth.net的MyPhoto版下载照片
  19. 引脚密集的QFP封装的焊接
  20. 有信用就有明天!区块链+供应链金融助力企业融资的5种方式

热门文章

  1. 微信公众号认证法人信息不通过怎么办?
  2. 查询应用服务器fc端口wwn号,FC磁盘阵列 实现WWN端口绑定功能
  3. 中国十大最难懂方言 温州话高居榜首
  4. TFIDF与TextRank
  5. Logistic逻辑回归(sigmod二分类)成本函数推导 及其梯度下降
  6. Linux在fcitx框架下添加小鹤音形(挂载在中州韵输入法下)
  7. 对《侃侃那些美丽的编程语言(上)》的集中回复
  8. FFmpeg Filter简单使用
  9. Java车牌识别停车场管理系统
  10. 972真题分析 | 2023年972信息检索真题简要分析和答题思路参考