本帖最后由 XCarthGetlin 于 2020-7-30 19:44 编辑
微信只能运行一个实在有点繁琐,所以简单爆破一下。
分析关键函数
一般控制软件只运行单个实例会使用找进程名称(FindWindow),设置互斥量(CreateMutex)之类的函数,具体的在《加密与解密》中都有详细介绍了,这里就不赘述。
微信没加壳,直接IDA看WinMain函数,刚开始是一段查询系统版本以及检查程序更新的函数:
在往后就可以找到关键的函数,可以看到微信整体打开是调用WeChatWin.dll中的StartWachat 函数的:
由于在Wechat.exe程序中没有找到有效的控制单个程序实例的函数,所以再看看WeChatWin.dll中的导入函数,可以看到导入了CreateMutexW 函数以及FindWindow 函数:
查看CreateMutexW 函数上下文可以判断这个应该就是控制程序单个实例的关键函数:
而调用FindWindowW 函数的上下文就更加明显了:
使用OD载入程序,在CreateMutexW 下断点,触断后单步看。
设置的锁即控制单个实例的锁:
根据OD中最后1.5个字节"715"可以判断出这里的调用CreateMutexW 就是上面的控制单个实例锁:
继续走找到一个大跳:
跳过的内容实则为判断有没有打开了微信的窗口:
若打开了微信则跳转到该窗口,否则就函数返回进入微信启动的主要流程:
爆破
找到关键函数,那么其实思路就很多了,比如将这个确保单实例的函数nop掉,又或者将互斥量的地方nop掉,这里我改了一个字节,将大跳的je 指令改为jmp 指令,这样的情况就是当有两个互斥量时,本会走入下面的if判断,这里直接就jmp 到退出确保单实例函数的地方,并进入微信开启的流程:
导出DLL,名字改为"WeChatWin.dll"就可以同时打开多个微信了:
|