这应该是该系列的最后一节了,感谢大家的关注。
下图的红框位置就是调试寄存器组Dr0~Dr7,Dr0,Dr1,Dr2,Dr3是用于设置硬件断点的,由于只有4个硬件断点寄存器,所以同时最多只能设置4个硬件断点。它产生的异常是单步异常。
这里不对原理做过多介绍,详细知识请参考《加密与解密》第二章2.1.4节
这方面的知识可以看我以前的帖子,这里给上链接https://bbs.pediy.com/thread-252468.htm。
一般客户端的通讯协议常用的是tcp或者udp,他们对应的API:
协议 函数
tcp send
udp sendto
版本信息
1.寻找给send函数下断点,根据我以前的帖子可以知道send函数是在ws2_32.dll这个模块。
所以我们在符号——>选中ws2_32.dll模块——>搜索send——>下断点。
打开微信随意给一个人发信息,这个时候程序断下,由于这个属于系统模块,我们不做分析,直接Ctrl+F9运行到程序模块。
接下来我们看下send函数,对我们有用的是第二个,所以这个参数我们需要着重关注。
通过分析后发现buf中是一个数值,这个数值是随着消息的不同而改变的。这里给该地址处下一个硬件写入断点。
运行程序后会在下图的位置断下。这个时候分析了好久的汇编,感觉收获不大,所以这个时候试着在堆栈中寻找信息。
在堆栈中得到一个可疑信息,但是并没有发现发送的文本信息,所以我们试着分析该字符出现的函数处。
我们在wechatwin.dll中进行字符串搜索寻找”newsendmsg“字符串,运气不错,这里只发现了一处代码。
在断点标签栏处,取消其他断点,然后重新发送信息,程序在下图处断下,通过分析后发现收益不大,继续通过观察堆栈查找信息。
在堆栈中发现了下图的关键信息。”1234“这个就是我们发送的信息。在该地址处下一个硬件写入断点。
重新发送信息后,程序在下图位置断下。这里的函数看着很难受,直接运行到返回处查看上一层代码。
下图就是上一层代码的调用处,这个函数也就是发送消息的函数了。
进去查看函数代码,这里我们发现代码似乎是加了混淆。
查看区段果然有一个区段加了VMP。
#小节
找到此位置我们可以做很多操作,比如自己做个发送消息的程序等等,因为本节的知识是硬件断点,所以就不带着大家写代码了。
知乎:https://www.zhihu.com/people/yi-gu-mi-li-47
公众号:一谷米粒
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)