使用ida分析和x32dbg调试的方式来让PC端微信可以多开

测试版本号:
使用ida分析和x32dbg调试的方式来让PC端微信可以多开
达到效果:
使用ida分析和x32dbg调试的方式来让PC端微信可以多开

想法:微信无法多开事实很可能上是通过windows客户端使用一个叫做mutex的互斥量来完成的,通过创建一个全局的互斥量来使第二个新进程不继续正常运行,而是把旧的微信窗口弹到桌面最前端。

使用ida打开wechat.exe后按照想法可以在导入表中搜索名为createmutex的函数,但是很遗憾搜不到:但是我们找到了这些函数:
使用ida分析和x32dbg调试的方式来让PC端微信可以多开
有可能是通过遍历进程表来完成防止多开的吗?
通过分析调用这些api的函数并不是防止多开用的,我猜想很可能是用来检测更新,然后强行终止正在运行的微信:
使用ida分析和x32dbg调试的方式来让PC端微信可以多开

但是通过对这个函数查找查找交叉引用,可以直接找到winmain函数。
在通过对winmain函数分析发现这个函数其实是微信已经成功启动了以后才调用的。
关键点:
使用ida分析和x32dbg调试的方式来让PC端微信可以多开
在这个函数的前面几行就是关键的地方,wechat.exe通过getprocaddress的方式来充wechatwin.dll中获取了startwachat这个函数的函数指针,然后利用函数指针调用了这个函数。
所以我们再打开一个ida用它来分析wechatwin.dll这个动态链接库:
这是个庞大的链接库,ida分析需要耗费不少时间。
但是我们成功的在这个链接库里找到了createmutex函数:
然后查找他的交叉引用:
使用ida分析和x32dbg调试的方式来让PC端微信可以多开
经过自己的调试和分析过程,发现利用在防止多开的函数是:sub_64d926d0,前面那个不是:
这个函数是这样:
使用ida分析和x32dbg调试的方式来让PC端微信可以多开
可以上msdn查看一下这个函数用法:
使用ida分析和x32dbg调试的方式来让PC端微信可以多开
lpname参数就是用来唯一表示全局互斥量的字符串,而这个字符串正是:
L"_WeChat_App_Instance_Identity_Mutex_Name",所以我们只需要直接在调试器中修改这个字符串,然后detach就ok了。
也看看GetLastError() == 183是代表什么意思:
使用ida分析和x32dbg调试的方式来让PC端微信可以多开
就是字面意思,对象已存在。所以逻辑是十分清晰的。继续对这个函数找交叉引用:
使用ida分析和x32dbg调试的方式来让PC端微信可以多开
正是通过判断互斥量是否已经存在,如果已经存在则他就会调用findwindow函数来寻找旧的微信窗口,然后将它显示出来并放在桌面最前端。如果不存在则会返回0,这个函数的交叉引用正是wechat.exe里调用的startwachat函数。而让微信真正跑起来的则是后面这个else语句:
使用ida分析和x32dbg调试的方式来让PC端微信可以多开
现在就可以使用x32_dbg来调试微信了,由于wechat一开始不会加载wechatwin.dll所以我们必须调到刚才那一句loadlibrary之后才可以在dll中下断点。
使用ida分析和x32dbg调试的方式来让PC端微信可以多开
现在wechat.exe已经将dll加载了,然后只需要断在这里:
使用ida分析和x32dbg调试的方式来让PC端微信可以多开
对eax寄存器所指向的地址中的值进行随意修改,就可以保证这个互斥量的创建不会和旧的微信创建的互斥量产生冲突。
使用ida分析和x32dbg调试的方式来让PC端微信可以多开
把W改成了a。然后让调试器和wechat detach就可以了。
使用ida分析和x32dbg调试的方式来让PC端微信可以多开

这里也建议大家使用x64/32_dbg,od太旧了,会有很多bug。并且选用的x64_dbg有个叫做scyllahide的插件,可以有效的对抗ring3级别的反调试。(不知道微信有没有反调)

文章只用于记录过程和交流学习