微信 消息结构分析

微信接口分析

之前搞过一次微信结构分析,想做一次记录,微信最近更新了,那就重新分析下吧。

微信版本号:

1571745519002

主要分析发送和接收消息。

用到的工具CE、x64dbg。

文中主要解决的点:

找到接收消息的关键点,实现可拦截,修改。

找到发送消息的关键点,实现可拦截,可外部调用。

先来分析接收消息吧,分析前先猜测下微信的消息处理流程。

我的过程查找如下:

  • 启动微信,并登录。
  • x64dbg附加进来(Alt + a)。
  • 启动CE,并选择微信应用。

做完上述内容后,用其他账号给当前账号发送消息,用CE搜索发送的消息内容(123)。

搜索结果如下:

1571745340960

336条太多了。

再次发送消息(2563),进行过滤:

最终出现两条结果:

1571745476665

经筛选最终选用05CA9185。

在x64dbg中下硬件写入断点。

1571745953091

为什么下写入而不是读取?因为出现新消息会写入这个地址呀。

在向电脑登陆的微信发送一条消息,由于x64dbg对中文支持不是很友好,建议发送字母或数字(567891234)。

发送消息后,程序断下,此时我们来看看调用堆栈。

1571746238446

函数调用还挺多的,当然这里的不一定全。

再来看看堆栈。

1571746278324

一直向下拉,看看有没有什么可用的信息。

1571746335556

看到上图中的我们发送的消息内容了吗?那么这附近的函数调用一定要着重观察。

各个call的分析我们就不说的,主要看call传递的参数信息是否有我们所需要的,最终找到的的call如下,地址:wechatwin:base + 0x2650F4,可能除了这个call还有其他call可以用,文中就用这个吧:

1571746692912

这个函数只压入了一个参数,消息内容就在 [[esp]] 的位置:

1571746763957

这里分别列出了微信ID和消息内容,这里的微信ID和我们在微信里看到的微信ID并不一样,具体我也不知道为什么。

这两个字符串后面跟随的4个字节就是字符串的长度,因此如修改内容需要将字符串长度一并修改。

这里实际上是一个结构体,包含的信息不止这两个内容,具体分析看文末。

接收消息搞定了,来看看发送消息吧,并且要进行。

在电脑端的微信中向文件传输助手中发送消息,发送结束后,在CE中搜索filehelper,这个就是文件传输助手的微信ID。

1571747328061

搜索出23条结果。

在向其他账号发送消息,观察CE变动的的数据。

1571747393910

变动的不多,经分析可以看出05CA814D保存的就是刚刚发送的消息的接收者的ID。

老规矩,对这个地址进行硬件写入断点:

1571747709507

再次向文件传输助手发送一条消息,断点断下。

向上文一样,找call,主要看传递的参数,再次不在赘述了。

最终找到了两个call,两个call描述如下:

  • 第一个call,传递了this指针,和其他参数,数量未知,看到this指针就把它pass了
  • 第二个call,只压入了一个参数,并且未用到寄存器传参数。

果断用第二个call,为什么?,难道会有人喜欢分析 类的结构吗?

call的地址:wechatwin:base + 0x4805FC

在此call的地址下断

再次发送消息,程序在这个call中断下。

来看看我们选中的call吧:

1571748204692

这个call传递的重要参数在[[esp] + c]中:

1571748871478

这里的参数并不是所有的都有用,有些是上层函数需要用到的。

我们自己调用这个call的话,就需要对内容进行分析,可以先将一些参数置0,然后运行,把无用的参数过滤掉,再来分析有用的参数分别代表了什么。

这个call和我上次分析的低版本用到的非常相似,我上次针对这两个接口写了个辅助工具,上次分析忘记参数位置了,好像和这次的差不多,改改还能用。

链接:https://pan.baidu.com/s/1NKz_IZqqQLy5OkUzWlEG7A
提取码:j0t4

具体功能如下:

  • 接收消息拦截,消息类型分析,发送和接收分离。
  • 发送消息

辅助编写步骤如下,未接触过win32编程的可以看下:

可以使用dll注入技术,我没有使用dll注入。

技术栈:远程代码写入(WriteProcessMemory),进程间共享内存,远程函数调用(CreateRemoteProcess)。

Author: YuanBi
Link: https://www.basicbit.cn/2018/11/16/2018-11-16-微信接口分析/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.