微信PC hook学习笔记(五) 定位发送消息的call [复制链接]
电梯直达
跳转到指定楼层楼主
作者侃遍天下无二
调



试过程
确定观察列表
首先,启动OD,并用OD打开微信。随后启动CE,并载入微信。
为了方便定位消息发送方,不妨先从文件传输助手下手,从手机app上我们得知文件传输助手的微信号(wxid)就是filehelper
在这里插入图片描述
在PC端选择文件传输助手,同时在CE中搜索,发现上百个结果:
在这里插入图片描述
在这里插入图片描述
此时,切换到普通好友,观察这上百个变量,会发现有少数变成了wxid开头的,不妨再次搜索以筛选,并将剩余变量全部加入到观察列表:
在这里插入图片描述


锁定变量确定接收方所在内存地址
将字符串显示范围扩大10倍,并在不同好友间反复切换,将没有变化的项目删除。最终还有10个左右的变量。在UI界面切换到好友,同时锁定前一半变量,然后在UI中切换到文件传输助手,发现数据变化如下:
在这里插入图片描述
同时,我们发现选中文件传输助手时,左侧的深色框总是定在我的好友身上,这说明其中一个变量用于决定将谁选中。现在想文件传输助手发送321,同时在手机端观察究竟谁收到了消息(PC端因为锁变量我也分不清谁是谁了)
在这里插入图片描述
结果是kbtx收到了消息,说明被锁变量其中之一决定了接收方。
将未锁定变量删除,同时将锁定变量的后一半解锁,切换到第三者,然后切换回好友,再切换回文件传输助手:
在这里插入图片描述

发送消息后,发现文件传输助手正确接收,说明接收方变量此时未锁定。删除所有被锁定的变量,将未锁定变量的前一半锁定,重复测试。最终,我们确定了表示接收方的变量所在地址为 0x13C5B030,只锁定这一个变量时,无论选中那个窗口,消息都会发送给小号 (注意不要把会话拖出微信主界面,否则变量会被重新分配,需要重复上述操作)
寻找发送消息的关键函数
进入OD,在这个位置下一个内存访问断点,很快微信断下:
在这里插入图片描述
放过所有无关断点,然后快速在当前窗口输入一段文本,点击发送,微信再次断下(记得放过点击发送之前的所有断点)。

观察堆栈,注意到这个函数接受了两个参数,其中一个是wxid,因此这个call很可能是用于发送消息的,不妨删除现有内存断点,下断:
在这里插入图片描述
微信再次断下后,我们只看到了wxid,没看到发送的具体消息,不妨向上寻找此函数开头下断点:
在这里插入图片描述
微信在此处断下后,观察堆栈,跳转到上级函数:
在这里插入图片描述
我们不妨观察一下ecx和eax里面存了些啥,发现ecx中疑似存储了用户信息,eax中则是一个数据结构的指针:
在这里插入图片描述在这里插入图片描述
当然,结合前面的分析,不难发现 ecx+0x18 处就是接收方的wxid,我们先前仅仅修改了这个值就把消息转给了别人,[eax]中似乎是一个结构体,由 int, char*, int, int 组成,多测试几次会发现第一个int始终为1,第三个始终表示消息的字节数,第四个则是大于字节数的最小的偶数或者与字节数相等:

在这里插入图片描述
在这里插入图片描述
当然,实际上根本不用这么麻烦,我们观察一下内存,会发现这个字符串以空字符(红色)结束,因此第三个和第四个整数我们给大点无伤大雅,最多也就是浪费一点内存空间,消息发完就回收了,因此不妨均设为消息字节数的2倍。(ecx的wxid也有类似的规律)
在这里插入图片描述
侵权删之
举报 0