分析微信防多开功能

分析微信防多开功能

防多开程序的一些思路

常用的windows下防多开的技术有以下几种:
互斥体防多开
这种防多开技术主要就是在第一次程序运行开始的时候,会使用 CreateMutexW或CreateMutexA创建一个以当前程序为相关名称的互斥体,当第二次启动程序时,会检测是否创建相同的互斥体,如果有,则会退出程序。
一般 CreateMutexW或CreateMutexA调用完之后,返回值为NUL即为失败,可以使用 API GetLastError获取错误码。如果句柄已经存在了,返回值不是0,也可以使用 API GetLastError获取错误码ERROR_ALREADY_EXISTS,值是0xB7。
窗口名、类名防多开
这种防多开的技术主要就是在程序启动时会使用FindWindowW或FindWindowA查找窗口名或窗口类名进行比对,看窗口是否存在,存在则退出。

微信防多开主要应用到的技术是使用互斥体防多开,所以需要对这两个API下断。
知识补充:

Windows SDK API一般与字符串相关的API都会有两个版本
- A版,例如CreateMutexA,FindWindowA
- U版,例如CreateMutexW,FindWindowW
这两种版本代表两种字符编码方式的字符串形式
- A版,ascii版
- U版,unicode版

使用x64dbg对API设置断点
有了对防多开的认识之后,接下来就是使用x64dbg实际上手对微信进行分析。
① 首先要定位到PC微信的主程序WeChat.exe。
在这里插入图片描述
② 接下来,就是使用x64dbg调试启动WeChat.exe,然后设置API断点
使用x64dbg调试启动WeChat.exe,使用快捷键Ctrl+G,打开跳转窗口,输入API名称,找到对应名称然后点击确定。

查询API,如图所示
在这里插入图片描述
在这里插入图片描述
③ 选定API,点击确定可以进入对应API的代码地址处,使用快捷键F2对API设置断点

A版创建互斥体
在这里插入图片描述
U版创建互斥体
在这里插入图片描述
设置好断点就可以使用快捷键F9让微信运行起来了

使用x64dbg对断下的栈信息进行分析

程序运行起来之后,等待程序断点触发,这里运气比较好,在第一次程序暂停的时候,就是最关键的创建防多开互斥体的地方。
① 分析程序暂停的堆栈信息
如下图,可以看到在堆栈信息和参数窗口中都可以看到一个字符串,大致意思是微信APP实例标识互斥体名称,可以猜测这个就是关键的互斥体(如果不是就继续跟踪)。
在这里插入图片描述
打开调用堆栈,找到上一层调用的代码
在这里插入图片描述
② 根据调用堆栈进一步分析
在调用堆栈窗口中查看堆栈,可以看出,对互斥体操作的模块是一个动态链接库wechatwin.dll,在调用堆栈窗口中从上到下,双击每一条调用指令,观察其中的代码,可以发现,在第二行的wechatwin.58990985代码处,看起来有一个关键跳转:
在这里插入图片描述
可以测试一下,先打开一个微信,然后使用x64dbg调试运行查看这个关键跳转的跳转情况,发现跳转并没有生效,直接F9运行,程序并未启动,而当将其跳转指令je改为jmp后,第二个微信就可以启动起来了。说明这个地方是关键跳转。

在这里插入图片描述

使用x64dbg的补丁功能保存修改

修改完指令之后,可以使用右键菜单中的补丁或是使用快捷键Ctrl+P保存补丁。
x64dbg会识别哪些指令修改了,我们可以保存对应的二进制文件
在这里插入图片描述
在保存文件时需要注意,修改的是哪个文件,就保存哪个文件,在这里修改的是模块WeChatWin.dll,所以保存的是这个模块。
在这里插入图片描述
提示:如果你的系统开启了UAC,那么需要先另存为一个临时名称然后再替换。
测试结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42636435/article/details/88640475
今日推荐