【原创】PC微信逆向分析のWeTool内部探秘

作者:zmrbak(赵庆明老师)

前言:

先不说微信在社交领域的霸主地位,我们仅从腾讯公司所透露的在研发微信过程中踩过的无数的坑,以及公开的与微信相关的填坑的源代码中,我们可以感受到,单从技术上讲,微信是一款非常伟大的产品。然而,伟大的产品,往往会被痴迷于技术的人送进实验室大卸八块,以参悟其伟大之所在!

WeTool,一款免费的微信社群管理软件,正是这群痴迷于技术的人对于这个伟大的PC微信的研究成果。在微商界,这个软件真可谓是鼎鼎大名、如雷贯耳。如果你还不知晓这个软件,那么你肯定不是微商界的人。如果你想对你的微信群进行管理,而又不想花钱,也许这个软件就是你最佳的选择。当然,免费软件的套路都是一样的,WeTool“有意地”不满足你的一些需求,会保留其中一部分功能。如果你有特殊的需求的话,当然是要付费的,那就购买“企业版”吧。

但是,对于一个对技术有强烈兴趣的人来说,研究WeTool与研究PC微信一样有趣,在这里,我把它们两个一起送进实验室,一窥其中的奥秘!

微信中的WeTool

由于腾讯干预,目前WeTool免费版本已经不再公开提供下载。但,之前的旧版本仍然可以自动升级到最新版本。如果你想获得WeTool这个软件,我想,你应该知道该怎么做了吧。如果你还是不知道,很抱歉,这篇文章对你来说太深奥了。那么我对你的建议是:关掉这个网页吧。

WeTool在启动时,会检查当前计算机上是否安装了版本匹配的PC微信。倘若找不到,或者版本不匹配,WeTool会引导你到它的官网去下载一个版本匹配的PC微信(可能比较旧,但能用)。下载完毕后,需要你手动去安装一下。

在WeTool启动的时候,还会检查微信的登录状态,如果微信还未完成登录,WeTool会等待微信登录之后,再开启自己的管理界面。

这里的问题是:WeTool是如何得知微信是否已经登录了呢?

在这里,我们使用PCHunter来检查一下微信(WeChat.exe)的进程模块。我们可以看到,在微信的进程中加载了一个特殊的DLL文件(WeHelp.dll),而它的父目录是一个特殊的字符串:“2.6.8.65”,恰好与我们当前运行的微信版本一致。再上一层的目录,“WeToolCore”,很明显,这个文件是WeTool的一部分。恰恰是这个DLL文件帮助WeTool完成了与微信之间的各种互动。也就是说,WeTool通过WeHelp.dll这个文件,可以感知到微信的各种活动,当然也包括微信是否已经登录等等…
【原创】PC微信逆向分析のWeTool内部探秘_第1张图片

窥探WeTool

在不经意之间关闭了WeTool之后,我们发现微信也被关闭。

这又是为什么呢?

如果你曾经用OD调试过软件,你会发现当你的OD被关闭的时候,被OD所调试的那个软件也被关闭掉了。因此,我们猜想,WeTool对于微信来说,应该使用的是类似于OD之于其他软件相同的原理,那就是“调试”。

在WeTool管理你的微信的时候,你也会发现,这时候微信无法被OD所附加。其实,还是“调试”。当一个软件在一个调试器的“调试”之下,为了防止出错,这个调试器会阻止自己对这个已经被调试中的软件的进行调试。这进一步印证了WeTool对于微信的“调试”的事实。然而就是这么一个“小小的”设置,就击碎不少“小白”想调试WeTool美梦。

既然我们找到了WeTool对于微信的关键,那就是文件“WeHelp.dll”。那么,我们就把这个文件请入我们的实验室,让我们把它拆开,细细探寻其中的一点一滴。

拆解WeTool

在动手拆解之前,我们还是先了解一下WeTool到底向我们的计算机上安装了些什么东东。顺着桌面上的“WeTool 免费版”,我们找到了WeTool安装的目录,安装目录之下22个文件夹和84个文件。当然,让我们比较感兴趣的就是“WeChatVersion”这个文件夹,因为它的名字与微信(WeChat)太让人能联想到一起了。
【原创】PC微信逆向分析のWeTool内部探秘_第2张图片
双击“WeChatVersion”,我们看到如下结果。恰好是用微信曾经的一个个版本号来做文件夹的名字。我们猜想,这个文件夹一定与这个版本的微信之间存在中某种联系。目前,我们可以得到最新的微信版本是2.6.8.68(此版本为更新版;从腾讯官网可下载到的版本仅为2.6.8.65),这里恰好有一个以该版本号命名的文件夹“2.6.8.65”。
【原创】PC微信逆向分析のWeTool内部探秘_第3张图片
我们双击打开“2.6.8.65”这个文件夹。文章前面所提到的“WeHelp.dll”文件赫然在目。点开其他类似微信版本号的文件夹,同样,每个文件夹中都有这两个文件。唯一的区别就是文件的大小不一样。由于我们使用的微信版本是2.6.8.65,那么我们就针对2.6.8.65文件夹下的这个“WeHelp.dll”进行研究。通过二进制对比,我们发现该文件夹下的文件与微信中加载的“WeHelp.dll”为同一个文件。
【原创】PC微信逆向分析のWeTool内部探秘_第4张图片
由此,我们得出结论:WeTool为不同版本的微信分别提供了不同的WeHelp.dll文件,在WeTool启动的时候,把WeChatVersion中对应与当前版本微信号的文件夹复制到当前Windows登录用户的应用程序数据文件夹中,然后再将里面的“WeHelp.dll”加载到微信进程的内存中。

WeHelp解析

WeTool为“WeHelp.dll”设置了一道阻止“动态调试”的障碍,这让所有的动态调试器,在没有特殊处理前,对它根本无法下手。如果能绕道而行,那何必强攻呢?于是我们请出静态分析的利器——IDA PRO 32。注意,这里务必使用32位版本的,因为只有在32位版本中,才可以把汇编代码转换成C语言的伪代码。相比于汇编代码来说,C代码就直观的多了。

打开IDA,选中GO,然后把WeHelp.dll拖入其中,接下来就是十几秒的分析,解析完毕后,界面如下:
【原创】PC微信逆向分析のWeTool内部探秘_第5张图片
从IDA解析的结果中,让我们很惊奇的是,居然未发现什么加壳啊、加密啊、混淆啊等等这些对于程序版权保护的技术。也许是WeTool太自信了吧!毕竟WeTool是事实上的业界老大,其地位无人可以撼动。对于和微信之间交互的这部分功能来说,其实对于一个刚入门的、比较勤奋的逆向新手,只需经过半年到一年时间的练手,这部分功能也是可以完成。对于WeTool来说,其真正的核心价值不在这里,而在于其“正向”的管理逻辑,以及自己后台的Web服务器。在它的管理界面,各种功能实现里逻辑错综复杂,如果你想逆向的话,还不如重写算了,毕竟它都免费给你用了。当然,它自己后台的服务器,你根本就碰不到。

从IDA解析的结果中,可以看到WeHelp中各个函数、方法,毫无遮拦地完全展示在眼前。而在右侧的窗口中,按下F5,瞬间汇编代码变成了C语言的伪代码。 【原创】PC微信逆向分析のWeTool内部探秘_第6张图片
对于一个稍稍有一些Window API编程经验的人来说,这些全部都是似曾相识的C代码,只需简单地猜一猜,就能看明白写的是啥。如果还是不懂的话,那就打开Visual Studio,对照着看吧。这里是DllMain,也就是DLL的入口函数。那么,我们先创建一个C++的动态链接库的项目,来对照着看吧:
【原创】PC微信逆向分析のWeTool内部探秘_第7张图片
fdwReason=1,恰好,DLL_PROCESS_ATTACH=1。一旦DLL被加载,则马上执行DllMain这个函数中的DLL_PROCESS_ATTACH分支。就是说,DLL被加载后,下面这两个函数会马上执行。
【原创】PC微信逆向分析のWeTool内部探秘_第8张图片
鼠标双击第一个函数(sub_10003040),到里面去看看这个函数里面有啥,如下图,它的返回值来自于一个Windows Api(桃红色字体)——“RegisterWindowMessageW”,查看MSDN后,发现,原来是注册Windows消息。
【原创】PC微信逆向分析のWeTool内部探秘_第9张图片
这不是我们最想要的,按ESC键,返回。鼠标双击下一个函数(sub_100031B0),页面变成这个啦。很明显,在注册一个窗口类。对于一个窗口来说,最重要的就是它的回调函数,因为要在回调函数中,完成对窗口的所有事件处理。这里,lpfnWndProc= sub_10003630,就很明显了,回调函数。
【原创】PC微信逆向分析のWeTool内部探秘_第10张图片
双击sub_10003630这个函数,窗口切换为如下内容。除了第一条语句的if之外,剩下的if…else if…else if是那么的惹人注目。每一个判断之后,都调用了一个函数。而判断的依据是传入的参数“lParam”要与一个dword的值比较。我们猜测,这些函数大概是WeHelp和微信之间交互相关的函数吧。当然,这只是猜测,我们还要进一步验证才行。
【原创】PC微信逆向分析のWeTool内部探秘_第11张图片
sub_10003630这个函数,是窗口的回调函数,我们要重点关注。那么,我们先给它改个名字吧。在函数名上点右键,选中“Rename global item”,我们取个名字叫“Fn_WndProc”吧。于是页面就变成了这样:
【原创】PC微信逆向分析のWeTool内部探秘_第12张图片
虽然在IDA中,函数全部显示出来了,但是也有40多个呢,我们找个简单一点的来试试。CWeHelp::Logout(void),这个函数没有参数,那么我们就选这个吧。在左侧函数窗口中双击CWeHelp::Logout(void),右侧窗口换成了这个函数的C语言伪代码(如果你显示的还是汇编,请点击汇编代码后按F5)。
【原创】PC微信逆向分析のWeTool内部探秘_第13张图片
在前面,我们看到在回调函数中,lParam要与一个dword值进行比较。在这个函数中,我们发现,这里为lParam赋了一个dword类型的值。为了方便记忆,我们把这个dowrd值改个名字吧,因为是Logout函数中用到的数字,那么就叫做“D_Logout”吧。
【原创】PC微信逆向分析のWeTool内部探秘_第14张图片
接下来,我们要看看”还有谁”在用这个数值。在我们修改后的“D_Logout”上点右键,选择“Jump to xref…”。原来这个数值只有两个地方使用,一个就是当前的“Logout”函数,而另一个却是在”Fn_WndProc”中,那不就是前面的那个窗口的回调函数嘛!选中“Fn_WndProc”这一行,点击OK!
【原创】PC微信逆向分析のWeTool内部探秘_第15张图片
又一次看到了熟悉的if…else if…,还有和“D_Logout”进行比较的分支,而这个分支里面只调用了一个函数sub_10005940,而且不带参数。
【原创】PC微信逆向分析のWeTool内部探秘_第16张图片
双击函数“sub_10005940”后,发现这个函数很简单。核心语句只有两条,首先调用了sub_100030F0函数,然后得到一个返回值。接下来,为这个返回值加上一个数值“0x3F2BF0”,再转换成一个函数指针,再给一个0作为参数,再调用这个函数指针。最后返回结果。
【原创】PC微信逆向分析のWeTool内部探秘_第17张图片
我们这里要关注,来自于“sub_100030F0”函数的返回值result到底是什么?

同样,双击这个函数(sub_100030F0),进去看看呗!原来,调用了一个Windows API函数(GetModuleHandleW),查看MSDN后,发现原来这个函数的功能就是取微信的基址(WeChatWin.dll)。
【原创】PC微信逆向分析のWeTool内部探秘_第18张图片
那就简单多了,是不是说,如果我们在微信中执行“((int (__stdcall *)(_DWORD))(weChatWinBaseAddress + 0x3F2BF0))(0);”这么一句代码,就可以实现Logout功能呢?当然,我们需要验证。打开原来创建的C++的动态链接库项目,把 case分支DLL_PROCESS_ATTACH换成如下内容:

case DLL_PROCESS_ATTACH:
	{
		DWORD weChatWinBaseAddress = (int)GetModuleHandleW(L"WeChatWin.dll");
		((int(__stdcall*)(DWORD))(weChatWinBaseAddress + 0x3F2BF0))(0);
	}

注意:把IDA中拷贝过来的代码里的“_DWORD”中的下划线去掉,就可以编译通过了。
【原创】PC微信逆向分析のWeTool内部探秘_第19张图片
启动微信,登录微信(这时候,手机微信中会显示“Windows微信已登录”)。

使用OD附加微信(确保WeTool已经退出,否则OD附加不成功)。

在OD汇编代码窗口点右键,选择”StrongOD\InjectDll\Remote Thread”,选中刚才Visual Studio中编译成功的那个dll文件。 【原创】PC微信逆向分析のWeTool内部探秘_第20张图片
一秒钟!OK,神奇的事情发生了:微信提示,你已退出微信!

同时,手机微信上原来显示的 “Windows微信已登录”,也消失了。从这里我们可以确定,微信“真的”是退出了,而不是崩掉了。
【原创】PC微信逆向分析のWeTool内部探秘_第21张图片

总结:

其实逆向研究,并不只是靠苦力,更重要的是强烈的好奇心和发散的思维。也许一个瞬间,换一下思维模式,瞬间一切都开朗了。一个人的力量是有限的,融入一个圈子,去借鉴别人的成功经验,同时贡献自己成功经验,你会发现,逆向研究其实是非常好玩的一件事。当然,我研究的后编写源码都是公开的,你可以到GitHub(https://github.com/zmrbak/PcWeChatHooK)上和我一起研究和学习。

后记:

2019年3月17日,本人对WeTool进行过探索,始终没有取得进展。时隔2月后,突然有所发现,于是在2019年5月29日将我的探索成果录制成一个个视频,分享给和我一起研究和探索微信的好朋友,在他们中激起了强烈的反响。其中有不少的朋友的进展迅速,还有几个朋友短短几日就远远超越了我的研究进度。看到这样的场景,让我的内心充满欢喜。当然,还有不少朋友的评价,更是让我开心,现摘录如下:
【原创】PC微信逆向分析のWeTool内部探秘_第22张图片
【原创】PC微信逆向分析のWeTool内部探秘_第23张图片
【原创】PC微信逆向分析のWeTool内部探秘_第24张图片
【原创】PC微信逆向分析のWeTool内部探秘_第25张图片
【原创】PC微信逆向分析のWeTool内部探秘_第26张图片
【原创】PC微信逆向分析のWeTool内部探秘_第27张图片

【原创】PC微信逆向分析のWeTool内部探秘_第28张图片
【原创】PC微信逆向分析のWeTool内部探秘_第29张图片
【原创】PC微信逆向分析のWeTool内部探秘_第30张图片
【原创】PC微信逆向分析のWeTool内部探秘_第31张图片
【原创】PC微信逆向分析のWeTool内部探秘_第32张图片

源码分享:

https://github.com/zmrbak/PcWeChatHooK

交流QQ群:

456197310 PC微信HOOK逆向分析

你可能感兴趣的:(C++技术)