首页 > 上网技巧 > 电脑小技巧 > 使用x64dbg分析微信防多开功能

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

时间:2018-03-26 15:51 作者:QQ地带 我要评论

转载,侵删!
 
引言
 
大家好我是蓝铁,你们的老铁^^。
 
相信大家现在都不止一台手机,那既然两台手机,肯定也有两个微信吧,尤其是一些搞业务的童鞋,每天上班到公司第一件事就是先打开电脑然后启动微信。那么问题来了,微信默认只支持一个微信,不能同时开启两个微信,那如果又要搞业务又要联络感情,只开一个岂不是不够呀,总不能一会儿用一下电脑,一会儿用一下手机吧,这样你的老板肯定会很不开心的,所以作为逆向分析工程师的我就想要自己分析一下微信,让其多开,这样搞什么都会非常容易了,^^,那么开始吧。
 
防多开程序的一些思路
 
学习过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              // 互斥体名称
);
窗口名、类名防多开
 
 
这种防多开的技术主要就是在程序启动时会使用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
 
③ 选定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版微信,加入了校验功能,我们如果修改了动态库,会被发现,关于校验功能的分析,大家可以自行分析一些,其实现在主模块中。

标签: x64dbg
顶一下
(0)
0%
踩一下
(0)
0%

Google提供的广告