背景:
以前写了一篇文章有关PC微信多开的文章,那篇文章用的窗口hook 和释放句柄的方案,这种方案会导致全局多开,你只要打开我的程序,那么你点击微信的图标就可以无限多开。但我们开发产品的时候,一般会希望通过我们产品开一个。正好自己有这样子的需求,于是自己就有这篇文章。
思路:
采用新的方案: 远程DLL注入, HOOK CreateMutexW�0�2 替换 创建互斥体的名字(原来微信互斥体名字:_WeChat_App_Instance_Identity_Mutex_Name) 加上随机数字,你可以时间戳+随机数字。基本不会重复。
开发遇到问题:
1:�0�2 IAT HOOK 和 EAT HOOK的选择 (通过IDA和OD 分析发现直接调用,那么就是IAT HOOK)
2:没有现存IAT HOOK代码 ,GOOGLE�0�2 复制代码
3:CreateProcess 直接启动微信,IAT HOOK 发现没有任何效果(加日志,发现微信没有调用我的hook的CreateMutexW , 郁闷好久,思考HOOK时机不对,因为微信启动就会就调用CreateMutexW, 我启动再hook 没有保证在微信调用之前hook,于是CreateProcess 传入参数 直接挂起进程)
4:采用CreateProcess ,发现IAT HOOK挂起失败,快要奔溃了。 最后分析出2个问题,一个IAT HOOK的代码有问题,他hook的模块是GetModuleHandle(0); 他修改是主模块,不是自己想要的模块。于是改成GetModuleHandle(L”WeChatWin”); 感觉就要胜利,点击启动注入,妈蛋还是失败,感觉彻底绝望了。
5:想了好久不明白为什么?然后静下心来,仔细分析我挂起进程应该是WeChatWin都没有加载,所以我只能自己手动LoadLibrary(L”WeChatWin”); 然后hook就可以了。
结论:
虽然遇到很多问题,但只要思路是对的,总能找到合适解决方案。(这个方案我排除了窗口钩子,因为钩子导致每个窗口进程都加载DLL,虽然谈不上多么消耗性能,但感觉很怪,可能导致被别的程序提交上传到云端进行分析。。。)。