大多数应用程序防止多开的方法无非就只有两种,一种是利用互斥体,另一种就是通过遍历当前窗口的方式查找是否有同名窗口。微信用是的互斥体的方法。典型的防双开的示例代码如下:
int main()
{
HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, L"AAA");
if (hMutex==NULL)
{
CreateMutex(NULL, NULL, L"AAA");
}
else
{
MessageBox(NULL, L"已经检测到有一个实例运行,即将退出", 0, 0);
return 0;
}
return 0;
}
新建一个txt文件,然后在txt上复制下面的代码
@echo off
start /d "C:\Program Files (x86)\Tencent\WeChat" WeChat.exe
start /d "C:\Program Files (x86)\Tencent\WeChat" WeChat.exe
exit
然后将后缀改为.bat,运行
此时已经打开了两个微信。这种方法的原理就是在微信创建互斥体之前把微信抢先多开。
破解微信多开的关键就在于CreateMutex这个函数,详细解释如下:
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针
BOOL bInitialOwner, // 初始化互斥对象的所有者
LPCTSTR lpName // 指向互斥对象名的指针
);
这个函数在创建互斥体的时候需要指定一个互斥对象的名称,那么如果我们能注入一个dll,然后让互斥体的名称随机改变,不就能达到多开微信的目的吗?
直接用OD打开微信,在CreateMutex函数下断点,我们需要找到微信创建的互斥体名
直接F9,程序断下(微信会创建多个互斥体,如果看见互斥体名称为NULL 继续F9即可)
可以看到微信创建了一个名为_WeChat_App_Instance_Identity_Mutex_Name的互斥体。我们临时修改这个名称看看能否实现微信多开
用CE添加互斥体名称的地址,当然你也可以直接在OD中修改(用CE修改要方便一点),然后修改互斥体名称
返回到OD,可以看到此时名称已经修改成功
清除断点,按F9运行,然后再打开微信
此时已经成功开启两个微信
用PCHunter打开微信,然后点击右键查看->查看句柄,按照句柄名排序
找到这个用于防多开的句柄,右键->关闭句柄。然后再次打开微信
成功开启了两个微信
用OD载入微信,在CreateMutexW函数下断点,
按F9让程序运行,等待断点断下
然后点击K查看调用堆栈
找到这个地址在堆栈中跟随地址
将这一行的je修改为jmp,接着复制到可执行文件,接着替换掉原来的dll
此时,微信可以开任意多个
目前微信机器人的成品已经发布,需要代码请移步Github。还请亲们帮忙点个star
https://github.com/TonyChen56/WeChatRobot