wechat逆向

2024/7/4 13:25:02

根据youtube上的实战微信逆向教程,测试环境 win10 版本:3.9.11.16 x86

工具:od 吾爱破解版本、ce

实现微信多开

程序启动时会使用CreateMutex(...)创建互斥体,每次启动时检查是否存在同名的互斥体,存在就不重复打开。

使用od打开微信,先不点继续。搜索CreateMutex函数,下断。点击运行,然后查看堆栈中CreateMutex传入的名称。使用ce手动添加该地址,然后修改里面的内容,取消断点,点击继续运行。在启动一个微信就能实现开两个了。od中对createmutexw断点,向上回溯查看互斥名的来源,定位到一个push wechatwin.xxxx那么这个xxx可能就是地址

计算出该地址的call指令的地址基于wechatwin.dll的偏移3CD 68E0

获取微信登录二维码

google搜索png文件头格式查看。可以使用ue查看png文件头的二进制来查看。

打开微信停留到没有二维码的界面,ce搜索未初始化的值,然后切换到二维码的界面,ce在过滤到改变的值。重复上面的操作,缩小地址的数量。滑动到最下面,将剩下的绿色的基值添加到下面。将当前基值中的值记录到描述中,对比是否存在变化。然后到二维码界面不停拖动程序等,直到留下来的一个地址。

od中对该地址下内存写入断点,然后全部过掉,wx调到没有二维码的界面。随后调出二维码,od中会出现暂停,查看wx界面中二维码即将显示出来但没有显示出来时的断点。

此时对堆栈中的wechatwin.dll调用的函数一个一个添加断点。然后全部过掉,删除内存写入断点,重复上面的操作,当界面停留在即将出现二维码时,查看程序中调用状态,分析传入的参数等。查看到ecx中放着png文件数据的地址。dc [ecx]查看,ecx+04存放的长度。

//od打印数据的命令,打印到wx的安装目录下
dm 打印的地址,数据长度,"文件的名称"
ret

计算出该地址的call指令的地址基于wechatwin.dll的偏移157 FEAD

获取微信发送消息call

网上查询相关资料能得知文件传输助手的wxid为filehelper

打开ce,微信切换到文件助手的界面,搜索utf16字符串filehelper,然后切换到另一个人的窗口,搜索wxid_得到结果中通过改变type长度查看wxid的全称,记录下来。然后两个窗口来回切换,通过改变wxid过滤得到一些内存地址。将内存地址添加到下面,然后对所有选中,然后wx界面切换到一个人的界面,对所有地址中的value改为filehelper,点击发送消息,看能否发送到文件助手,能发送到文件助手说明存放wxid的内存就在其中。然后改变上面一半的内容看能否改变发送对象,不能的话正确的地址就另一半。不停重复后,得到一个唯一的地址。

对该地址在od中下内存访问断点,然后发送消息,查看堆栈中访问他的函数。分析每个函数调用的堆栈与寄存器值,看能否找到发送内容与wxid。

确定call后下断。发送消息,对该call时的发送内容值在ce中改变,看能否改变真实的发送内容。

计算出该地址的call指令的地址基于wechatwin.dll的偏移13C 0301

获取微信接受消息call

打开wx,通过ce搜索发送的消息,通过多次过滤新消息最后定位到几个地址,添加到ce的下面。改变类型,修改字符串的长度观察后续的信息。我们对这里的每个值下一次断点,观察断点时哪些值改变了就删除掉。最后定位到最早的消息地址。

下断分析堆栈中的call,观察寄存器和堆栈中的值,最后定位到一个call,执行到该call时,edx,ebx中保存了新消息内容,同时附近内存地址中也存在一个类似与xml的字符串,疑似消息类型的描述信息。

计算出该地址的call指令的地址基于wechatwin.dll的偏移2A3 8EA9