简单说下,大都通过判断Mutex、Event、File等等是否已经存在,存在则退出当前开启进程(说明已经有一个进程了),这样也就是单实例了。
那只要找到微信是通过什么标志来实现单实例的,然后干掉这个标志即可。
然后…基于这个思路,我们上工具。
使用procexp找到微信进程,然后翻了一遍句柄。
找到疑是的一段句柄。
`\Sessions\1\BaseNamedObjects\_WeChat_App_Instance_Identity_Mutex_Name \Sessions\1\BaseNamedObjects\WeChat_GlobalConfig_Multi_Process_Mutex`
* 1
* 2
感觉这两个都像,不管了,上pchunter,kill掉句柄试一下。
经过尝试,发现_WeChat_App_Instance_Identity_Mutex_Name
是单实例标志(kill句柄后可以开第二个客户端),WeChat_GlobalConfig_Multi_Process_Mutex
没用。
既然如此,那开始码代码吧。
===============================================================
可能的方案:
-
找微信判断标识的代码位置,然后直接patch掉,或者整个dll进去patch。然后大致去翻了一下,貌似代码在wechatwin.dll,然后加了vmp壳,所以就不折腾这个了。
-
直接通过代码kill掉这个Mutex的句柄(类似Pchunter操作),然后就可以开启第二个实例了,貌似明显更有优势啊。
-
额,如果觉得无所谓,每次开之前用pchunter关一次句柄也行,下面就不用看了…
这里选择第二个方案,开始代码。
流程:
1. 枚举句柄,找到_WeChat_App_Instance_Identity_Mutex_Name的mutant
2. duplicate句柄到本进程,然后close
3. 启动微信
下面是主要代码:
`//步骤1和2的代码 //获取到微信所有进程句柄 DWORD Num = GetProcIds(L"WeChat.exe", Pids); ... Status = ZwQuerySystemInformation(SystemHandleInformation, pbuffer, 0x1000, &dwSize); PSYSTEM_HANDLE_INFORMATION1 pHandleInfo = (PSYSTEM_HANDLE_INFORMATION1)pbuffer; for(nIndex = 0; nIndex < pHandleInfo->NumberOfHandles; nIndex++) { //句柄在Pids中,就是微信进程的句柄信息 if(IsTargetPid(pHandleInfo->Handles[nIndex].UniqueProcessId, Pids, Num)) { HANDLE hHandle = DuplicateHandleEx(pHandleInfo->Handles[nIndex].UniqueProcessId, (HANDLE)pHandleInfo->Handles[nIndex].HandleValue, DUPLICATE_SAME_ACCESS ); //对象名 Status = NtQueryObject(hHandle, ObjectNameInformation, szName, 512, &dwFlags); //对象类型名 Status = NtQueryObject(hHandle, ObjectTypeInformation, szType, 128, &dwFlags); //找到微信的标志 if (0 == wcscmp(TypName, L"Mutant")) { if (wcsstr(Name, L"_WeChat_App_Instance_Identity_Mutex_Name")) { //DUPLICATE_CLOSE_SOURCE标志很重要,不明白的查一查 hHandle = DuplicateHandleEx(pHandleInfo->Handles[nIndex].UniqueProcessId, (HANDLE)pHandleInfo->Handles[nIndex].HandleValue, DUPLICATE_CLOSE_SOURCE ); if(hHandle) { printf("+ Patch wechat success!\n"); CloseHandle(hHandle); } } } } } }`
* 1
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
* 10
* 11
* 12
* 13
* 14
* 15
* 16
* 17
* 18
* 19
* 20
* 21
* 22
* 23
* 24
* 25
* 26
* 27
* 28
* 29
* 30
* 31
* 32
* 33
* 34
* 35
* 36
* 37
* 38
* 39
* 40
* 41
* 42
* 43
* 44
* 45
* 46
### 最后
我还为大家准备了一套体系化的架构师学习资料包以及BAT面试资料,供大家参考及学习
已经将知识体系整理好(源码,笔记,PPT,学习视频)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/c175421309e64351f425aa93171e04e3.webp?x-oss-process=image/format,png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/ad03fd90247edcf68a82ff51e07ce284.webp?x-oss-process=image/format,png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/81bb9220a809d912701fa14ae292512a.webp?x-oss-process=image/format,png)
## 最后
我还为大家准备了一套体系化的架构师学习资料包以及BAT面试资料,供大家参考及学习
已经将知识体系整理好(源码,笔记,PPT,学习视频)
[外链图片转存中...(img-FfWpVggB-1714698285585)]
[外链图片转存中...(img-5eTvkSNs-1714698285585)]
[外链图片转存中...(img-D7UZZHgq-1714698285586)]
> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/topics/618154847)收录**