【原创】PC逆向分析のWeTool内部探秘
作者:zmrbak(赵庆明⽼师)
前⾔:代码转换
先不说在社交领域的霸主地位,我们仅从腾讯公司所透露的在研发过程中踩过的⽆数的坑,以及公开的与相关的填坑的源代码中,我们可以感受到,单从技术上讲,是⼀款⾮常伟⼤的产品。然⽽,伟⼤的产品,往往会被痴迷于技术的⼈送进实验室⼤卸⼋块,以参悟其伟⼤之所在!
WeTool,⼀款免费的社管理软件,正是这痴迷于技术的⼈对于这个伟⼤的PC的研究成果。在微商界,这个软件真可谓是⿍⿍⼤名、如雷贯⽿。如果你还不知晓这个软件,那么你肯定不是微商界的⼈。如果你想对你的进⾏管理,⽽⼜不想花钱,也许这个软件就是你最佳的选择。当然,免费软件的套路都是⼀样的,WeTool“有意地”不满⾜你的⼀些需求,会保留其中⼀部分功能。如果你有特殊的需求的话,当然是要付费的,那就购买“企业版”吧。
但是,对于⼀个对技术有强烈兴趣的⼈来说,研究WeTool与研究PC⼀样有趣,在这⾥,我把它们两个⼀起送进实验室,⼀窥其中的奥秘!
中的WeTool
由于腾讯⼲预,⽬前WeTool免费版本已经不再公开提供下载。但,之前的旧版本仍然可以⾃动升级到最新版本。如果你想获得WeTool这个软件,我想,你应该知道该怎么做了吧。如果你还是不知道,很抱歉,这篇⽂章对你来说太深奥了。那么我对你的建议是:关掉这个⽹页吧。
WeTool在启动时,会检查当前计算机上是否安装了版本匹配的PC。倘若不到,或者版本不匹配,WeTool会引导你到它的官⽹去下载⼀个版本匹配的PC(可能⽐较旧,但能⽤)。下载完毕后,需要你⼿动去安装⼀下。
在WeTool启动的时候,还会检查的登录状态,如果还未完成登录,WeTool会等待登录之后,再开启⾃⼰的管理界⾯。
这⾥的问题是:WeTool是如何得知是否已经登录了呢?
在这⾥,我们使⽤PCHunter来检查⼀下()的进程模块。我们可以看到,在的进程中加载了⼀个特殊的DLL⽂件(WeHelp.dll),⽽它的⽗⽬录是⼀个特殊的字符串:“2.6.8.65”,恰好与我们当前运⾏的版本⼀致。再上⼀层的⽬
录,“WeToolCore”,很明显,这个⽂件是WeTool的⼀部分。恰恰是这个DLL⽂件帮助WeTool完成了与之间的各种互动。也就是说,WeTool通过WeHelp.dll这个⽂件,可以感知到的各种活动,当然也包括是否已经登录等等…
窥探WeTool
在不经意之间关闭了WeTool之后,我们发现也被关闭。
这⼜是为什么呢?
如果你曾经⽤OD调试过软件,你会发现当你的OD被关闭的时候,被OD所调试的那个软件也被关闭掉了。因此,我们猜想,WeTool对于来说,应该使⽤的是类似于OD之于其他软件相同的原理,那就是“调试”。
在WeTool管理你的的时候,你也会发现,这时候⽆法被OD所附加。其实,还是“调试”。当⼀个软件在⼀个调试器的“调试”之下,为了防⽌出错,这个调试器会阻⽌⾃⼰对这个已经被调试中的软件的进⾏调试。这进⼀步印证了WeTool对于的“调试”的事实。然⽽就是这么⼀个“⼩⼩的”设置,就击碎不少“⼩⽩”想调试WeTool美梦。
既然我们到了WeTool对于的关键,那就是⽂件“WeHelp.dll”。那么,我们就把这个⽂件请⼊我们的实验室,让我们把它拆开,细细探寻其中的⼀点⼀滴。
拆解WeTool
在动⼿拆解之前,我们还是先了解⼀下WeTool到底向我们的计算机上安装了些什么东东。顺着桌⾯上的“WeTool 免费版”,我们到了WeTool安装的⽬录,安装⽬录之下22个⽂件夹和84个⽂件。当然,让我们⽐较感兴趣的就是“WeChatVersion”这个⽂件夹,因为它的名字与(WeChat)太让⼈能联想到⼀起了。
双击“WeChatVersion”,我们看到如下结果。恰好是⽤曾经的⼀个个版本号来做⽂件夹的名字。我们猜想,这个⽂件夹⼀定与这个版本的之间存在中某种联系。⽬前,我们可以得到最新的版本是2.6.8.68(此版本为更新版;从腾讯官⽹可下载到的版本仅为
2.6.8.65),这⾥恰好有⼀个以该版本号命名的⽂件夹“2.6.8.65”。
我们双击打开“2.6.8.65”这个⽂件夹。⽂章前⾯所提到的“WeHelp.dll”⽂件赫然在⽬。点开其他类似版本号的⽂件夹,同样,每个⽂件夹中都有这两个⽂件。唯⼀的区别就是⽂件的⼤⼩不⼀样。由于
我们使⽤的版本是2.6.8.65,那么我们就针对2.6.8.65⽂件夹下的这个“WeHelp.dll”进⾏研究。通过⼆进制对⽐,我们发现该⽂件夹下的⽂件与中加载的“WeHelp.dll”为同⼀个⽂件。
由此,我们得出结论:WeTool为不同版本的分别提供了不同的WeHelp.dll⽂件,在WeTool启动的
时候,把WeChatVersion中对应与当前版本号的⽂件夹复制到当前Windows登录⽤户的应⽤程序数据⽂件夹中,然后再将⾥⾯的“WeHelp.dll”加载到进程的内存中。
WeHelp解析
WeTool为“WeHelp.dll”设置了⼀道阻⽌“动态调试”的障碍,这让所有的动态调试器,在没有特殊处理前,对它根本⽆法下⼿。如果能绕道⽽⾏,那何必强攻呢?于是我们请出静态分析的利器——IDA PRO 32。注意,这⾥务必使⽤32位版本的,因为只有在32位版本中,才可以把汇编代码转换成C语⾔的伪代码。相⽐于汇编代码来说,C代码就直观的多了。
打开IDA,选中GO,然后把WeHelp.dll拖⼊其中,接下来就是⼗⼏秒的分析,解析完毕后,界⾯如下:
从IDA解析的结果中,让我们很惊奇的是,居然未发现什么加壳啊、加密啊、混淆啊等等这些对于程序版权保护的技术。也许是WeTool太⾃信了吧!毕竟WeTool是事实上的业界⽼⼤,其地位⽆⼈可以撼动。对于和之间交互的这部分功能来说,其实对于⼀个刚⼊门的、⽐较勤奋的逆向新⼿,只需经过半年到⼀年时间的练⼿,这部分功能也是可以完成。对于WeTool来说,其真正的核⼼价值不在这⾥,⽽在于其“正向”的管理逻辑,以及⾃⼰后台的Web服务器。在它的管理界⾯,各种功能实现⾥逻辑错综复杂,如果你想逆向的话,还不如重写算了,毕竟它都免费给你⽤了。当然,它⾃⼰后台的服务器,你根本就碰不到。
从IDA解析的结果中,可以看到WeHelp中各个函数、⽅法,毫⽆遮拦地完全展⽰在眼前。⽽在右侧的窗⼝中,按下F5,瞬间汇编代码变成了C语⾔的伪代码。
对于⼀个稍稍有⼀些Window API编程经验的⼈来说,这些全部都是似曾相识的C代码,只需简单地猜⼀猜,就能看明⽩写的是啥。如果还是不懂的话,那就打开Visual Studio,对照着看吧。这⾥是DllMain,也就是DLL的⼊⼝函数。那么,我们先创建⼀个C++的动态链接库的项⽬,来对照着看吧:
fdwReason=1,恰好,DLL_PROCESS_ATTACH=1。⼀旦DLL被加载,则马上执⾏DllMain这个函数中的DLL_PROCESS_ATTACH 分⽀。就是说,DLL被加载后,下⾯这两个函数会马上执⾏。
⿏标双击第⼀个函数(sub_10003040),到⾥⾯去看看这个函数⾥⾯有啥,如下图,它的返回值来⾃于⼀个Windows Api(桃红⾊字体)——“RegisterWindowMessageW”,查看MSDN后,发现,原来是注册Windows消息。
这不是我们最想要的,按ESC键,返回。⿏标双击下⼀个函数(sub_100031B0),页⾯变成这个啦。很明显,在注册⼀个窗⼝类。对于⼀个窗⼝来说,最重要的就是它的回调函数,因为要在回调函数中,完成对窗⼝的所有事件处理。这⾥,lpfnWndProc=
sub_10003630,就很明显了,回调函数。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。