使用x64dbg分析微信防多开功能

本篇原创文章参加双倍稿费活动,预估稿费为700元,活动链接请点此处

引言

大家好我是蓝铁,你们的老铁^^。
相信大家现在都不止一台手机,那既然两台手机,肯定也有两个微信吧,尤其是一些搞业务的童鞋,每天上班到公司第一件事就是先打开电脑然后启动微信。那么问题来了,微信默认只支持一个微信,不能同时开启两个微信,那如果又要搞业务又要联络感情,只开一个岂不是不够呀,总不能一会儿用一下电脑,一会儿用一下手机吧,这样你的老板肯定会很不开心的,所以作为逆向分析工程师的我就想要自己分析一下微信,让其多开,这样搞什么都会非常容易了,^^,那么开始吧。

 

防多开程序的一些思路

学习过Windows SDK的同学可能对windows下防多开的技术有所了解,由于防多开技术很多,这里只针对PC版微信涉及的防多开做些介绍。常用的windows下防多开的技术有以下几种:

  • 互斥体防多开

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

 

 

// CreateMutexA 或 CreateMutexW 的函数原型
HANDLE WINAPI CreateMutex(
_In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes,  // 
_In_     BOOL                  bInitialOwner,      // 
_In_opt_ LPCTSTR               lpName              // 互斥体名称
);                                                   // 返回值是句柄,返回NULL失败
  • 窗口名、类名防多开

这种防多开的技术主要就是在程序启动时会使用API FindWindowWFindWindowA查找窗口名或窗口类名进行比对,看窗口是否存在,存在则退出。

微信防多开主要应用到的技术是使用API CreateMutexWCreateMutexA,所以我们待会分析的时候,需要对这两个API下断,
窗口相关的API微信也用到了,只是不是用于防多开的。这里就不详细分析了。

*******
小知识
*******
Windows SDK API一般与字符串相关的API都会有两个版本
- A版,例如CreateMutexA,FindWindowA
- U版,例如CreateMutexW,FindWindowW
这两种版本代表两种字符编码方式的字符串形式
- A版,ascii版
- U版,unicode版
更多的可以使用搜索引擎查找相关信息

 

使用x64dbg对API设置断点

有了对防多开的认识之后,我们接下来就是使用x64dbg实际上手对微信进行分析。
① 首先我们要定位到PC微信的主程序。

  • 我的系统是windows 10,安装之后默认安装目录是:C:Program Files (x86)TencentWeChat,主程序就是安装目录中的 WeChat.exe


② 接下来,就是使用x64dbg调试启动WeChat.exe,然后设置API断点
使用x64dbg调试启动WeChat.exe,使用快捷键Ctrl+G,打开跳转窗口,输入API名称,找到对应名称然后点击确定。

  • 查询API,如图所示

查询API

  • 选定API,如图所示

选定API

③ 选定API,点击确定可以进入对应API的代码地址处,使用快捷键F2对API设置断点

  • A版创建互斥体

A版

  • U版创建互斥体

U版

设置好断点就可以使用快捷键F9让微信跑起来了

 

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

程序跑起来之后,等待程序断点触发,这里运气比较好,在第一次程序暂停的时候,就是最关键的创建防多开互斥体的地方。
① 分析程序暂停的堆栈信息
如下图,可以看到在堆栈信息和参数窗口中都可以看到一个字符串,大致意思是微信APP实例标识互斥体名称,可以猜测这个就是关键的互斥体(如果不是就继续跟踪)。

堆栈信息
打开调用堆栈,找到上一层调用的代码

调用堆栈
② 根据调用堆栈进一步分析
在调用堆栈窗口中查看堆栈,可以看出,对互斥体操作的模块是一个动态链接库wechatwin.dll,在调用堆栈窗口中从上到下,双击每一条调用指令,观察其中的代码,可以发现,在第二行的wechatwin.10321065代码处,看起来有一个关键跳转:

关键跳转
可以测试一下,先打开一个微信,然后使用x64dbg调试运行查看这个关键跳转的跳转情况,发现跳转并没有生效,直接F9运行,程序并未启动,而当将其跳转指令je改为jmp后,第二个微信就可以启动起来了。说明这个地方是关键跳转。

修改跳转

 

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

修改完指令之后,可以使用右键菜单中的补丁或是使用快捷键Ctrl+P保存补丁。

补丁
x64dbg会识别哪些指令修改了,我们可以保存对应的二进制文件

保存补丁
在保存文件时需要注意,修改的是哪个文件,就保存哪个文件,在这里我们修改的是模块WeChatWin.dll,所以保存的是这个模块。

保存模块
提示:如果你的系统开启了UAC,那么需要先另存为一个临时名称然后再替换。

 

测试效果

测试图

 

总结

当我们自己分析完微信的防多开之后,会发现其实大公司的产品也就那么回事,只要学好编程,学会使用x64dbg,就可以很轻松的搞定这些,所以努力学习吧,你也可以的!
还有两点需要说明:
① 在动态分析时,可以修改的地方有很多,以上的分析大家要明白的是思路而非步骤。
② 最新的PC版微信,加入了校验功能,我们如果修改了动态库,会被发现,关于校验功能的分析,大家可以自行分析一些,其实现在主模块中。

(完)