本篇原创文章参加双倍稿费活动,预估稿费为700元,活动链接请点此处
引言
大家好我是蓝铁,你们的老铁^^。
相信大家现在都不止一台手机,那既然两台手机,肯定也有两个微信吧,尤其是一些搞业务的童鞋,每天上班到公司第一件事就是先打开电脑然后启动微信。那么问题来了,微信默认只支持一个微信,不能同时开启两个微信,那如果又要搞业务又要联络感情,只开一个岂不是不够呀,总不能一会儿用一下电脑,一会儿用一下手机吧,这样你的老板肯定会很不开心的,所以作为逆向分析工程师的我就想要自己分析一下微信,让其多开,这样搞什么都会非常容易了,^^,那么开始吧。
防多开程序的一些思路
学习过Windows SDK的同学可能对windows下防多开的技术有所了解,由于防多开技术很多,这里只针对PC版微信涉及的防多开做些介绍。常用的windows下防多开的技术有以下几种:
- 互斥体防多开
这种防多开技术主要就是在第一次程序运行开始的时候,会使用API CreateMutexW
或CreateMutexA
创建一个以当前程序为相关名称的互斥体,当第二次启动程序时,会检测是否创建相同的互斥体,如果有,则会退出程序。
一般 API CreateMutexW
或CreateMutexA
调用完之后,返回值为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 FindWindowW
或FindWindowA
查找窗口名或窗口类名进行比对,看窗口是否存在,存在则退出。
微信防多开主要应用到的技术是使用API CreateMutexW
或CreateMutexA
,所以我们待会分析的时候,需要对这两个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的代码地址处,使用快捷键F2
对API设置断点
- A版创建互斥体
- U版创建互斥体
设置好断点就可以使用快捷键F9
让微信跑起来了
使用x64dbg对断下的栈信息进行分析
程序跑起来之后,等待程序断点触发,这里运气比较好,在第一次程序暂停的时候,就是最关键的创建防多开互斥体的地方。
① 分析程序暂停的堆栈信息
如下图,可以看到在堆栈信息和参数窗口中都可以看到一个字符串,大致意思是微信APP实例标识互斥体名称
,可以猜测这个就是关键的互斥体(如果不是就继续跟踪)。
打开调用堆栈,找到上一层调用的代码
② 根据调用堆栈进一步分析
在调用堆栈窗口中查看堆栈,可以看出,对互斥体操作的模块是一个动态链接库wechatwin.dll
,在调用堆栈窗口中从上到下,双击每一条调用指令,观察其中的代码,可以发现,在第二行的wechatwin.10321065
代码处,看起来有一个关键跳转:
可以测试一下,先打开一个微信,然后使用x64dbg调试运行查看这个关键跳转的跳转情况,发现跳转并没有生效,直接F9运行,程序并未启动,而当将其跳转指令je
改为jmp
后,第二个微信就可以启动起来了。说明这个地方是关键跳转。
使用x64dbg的补丁功能保存修改
修改完指令之后,可以使用右键菜单中的补丁或是使用快捷键Ctrl+P
保存补丁。
x64dbg会识别哪些指令修改了,我们可以保存对应的二进制文件
在保存文件时需要注意,修改的是哪个文件,就保存哪个文件,在这里我们修改的是模块WeChatWin.dll
,所以保存的是这个模块。
提示:如果你的系统开启了UAC,那么需要先另存为一个临时名称然后再替换。
测试效果
总结
当我们自己分析完微信的防多开之后,会发现其实大公司的产品也就那么回事,只要学好编程,学会使用x64dbg,就可以很轻松的搞定这些,所以努力学习吧,你也可以的!
还有两点需要说明:
① 在动态分析时,可以修改的地方有很多,以上的分析大家要明白的是思路而非步骤。
② 最新的PC版微信,加入了校验功能,我们如果修改了动态库,会被发现,关于校验功能的分析,大家可以自行分析一些,其实现在主模块中。