序言:
防多开的目的是为了防止多账号批量进行恶意操作(恶意营销等)。
现在很多人都有两个微信,特别对于一些搞业务的人员。然而微信默认只能运行一个,不能同时开启两个微信。于是便有了这篇文章。防多开的方法很多,常用的可以参考这里
微信使用的是互斥体防多开,此种技术主要就是使用API CreateMutexW或CreateMutexA创建一个以当前程序为相关名称的互斥体,如果返回NULL(创建失败)或错误码为ERROR_ALREADY_EXISTS(互斥体已存在),则退出程序
// CreateMutexA 或 CreateMutexW 的函数原型 HANDLE WINAPI CreateMutex( _In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针 _In_ BOOL bInitialOwner, // 初始化互斥对象的所有者 _In_opt_ LPCTSTR lpName // 指向互斥体名称的指针 ); // 返回值是句柄,返回NULL失败
软件:
微信PC 2.8.0.121
工具:
x64dbg(使用32位版本的)
开始分析:
1.首先定位到PC微信的主程序
2.使用x64dbg启动WeChat.exe,然后设置API断点。使用快捷键Ctrl+G,打开跳转窗口,输入API 名称,点击确定进入对应API的代码地址处,使用快捷键F2对API设置断点(A版与W版都下断点比较好,下面图只显示了A版,W版同理)
3.按F9让程序跑起来,等待断点的触发,我是第二次断点触发的,第一次断点停在了TLS函数断点,如果你不想程序对TLS函数下断,可以点击选项->选项,在事件中将TLS回调函数前的勾去掉
4.此时程序断在了我们之前所下的断点处,分析堆栈信息,可以看到一个字符串,大致意思是微信APP实例标识互斥体名称,可以猜测这个就是关键的互斥体(如果不是就继续跟踪),打开调用堆栈
5.根据调用堆栈窗口可以看出,对互斥体操作的模块是一个动态链接库wechatwin.dll,在调用堆栈窗口中从上到下,双击每一条调用指令,观察其中的代码,可以发现,在第二行的wechatwin.7A06AE15代码处,看起来有一个关键跳转
6.可以测试下,先打开一个微信,然后使用x64dbg调试运行查看这个关键跳转的跳转情况,发现跳转并没有生效,直接F9运行,程序并未启动,而当其跳转生效后,第二个微信就启动了。说明这个地方是关键跳转,那么我们可以将je改为jmp,然后使用右键菜单中的补丁对修改后的程序进行保存
7.x64dbg会自动识别哪些指令修改了,我们可以保存对应的二进制文件
8.在保存文件时需要注意,修改的是哪个文件,就保存哪个文件,同时最好修改前将要修改的文件进行备份,方便以后恢复,一般此时都会报修改失败,因为x64dbg在使用这个dll,所以我们可以在名称后面加个字符或数字以示区别,退出x64dbg后再进行替换
9.测试效果