微信接口分析
之前搞过一次微信结构分析,想做一次记录,微信最近更新了,那就重新分析下吧。
微信版本号:
主要分析发送和接收消息。
用到的工具CE、x64dbg。
文中主要解决的点:
找到接收消息的关键点,实现可拦截,修改。
找到发送消息的关键点,实现可拦截,可外部调用。
先来分析接收消息吧,分析前先猜测下微信的消息处理流程。
我的过程查找如下:
- 启动微信,并登录。
- x64dbg附加进来(Alt + a)。
- 启动CE,并选择微信应用。
做完上述内容后,用其他账号给当前账号发送消息,用CE搜索发送的消息内容(123)。
搜索结果如下:
336条太多了。
再次发送消息(2563),进行过滤:
最终出现两条结果:
经筛选最终选用05CA9185。
在x64dbg中下硬件写入断点。
为什么下写入而不是读取?因为出现新消息会写入这个地址呀。
在向电脑登陆的微信发送一条消息,由于x64dbg对中文支持不是很友好,建议发送字母或数字(567891234)。
发送消息后,程序断下,此时我们来看看调用堆栈。
函数调用还挺多的,当然这里的不一定全。
再来看看堆栈。
一直向下拉,看看有没有什么可用的信息。
看到上图中的我们发送的消息内容了吗?那么这附近的函数调用一定要着重观察。
各个call的分析我们就不说的,主要看call传递的参数信息是否有我们所需要的,最终找到的的call如下,地址:wechatwin:base + 0x2650F4,可能除了这个call还有其他call可以用,文中就用这个吧:
这个函数只压入了一个参数,消息内容就在 [[esp]] 的位置:
这里分别列出了微信ID和消息内容,这里的微信ID和我们在微信里看到的微信ID并不一样,具体我也不知道为什么。
这两个字符串后面跟随的4个字节就是字符串的长度,因此如修改内容需要将字符串长度一并修改。
这里实际上是一个结构体,包含的信息不止这两个内容,具体分析看文末。
接收消息搞定了,来看看发送消息吧,并且要进行。
在电脑端的微信中向文件传输助手中发送消息,发送结束后,在CE中搜索filehelper,这个就是文件传输助手的微信ID。
搜索出23条结果。
在向其他账号发送消息,观察CE变动的的数据。
变动的不多,经分析可以看出05CA814D保存的就是刚刚发送的消息的接收者的ID。
老规矩,对这个地址进行硬件写入断点:
再次向文件传输助手发送一条消息,断点断下。
向上文一样,找call,主要看传递的参数,再次不在赘述了。
最终找到了两个call,两个call描述如下:
- 第一个call,传递了this指针,和其他参数,数量未知,看到this指针就把它pass了
- 第二个call,只压入了一个参数,并且未用到寄存器传参数。
果断用第二个call,为什么?,难道会有人喜欢分析 类的结构吗?
call的地址:wechatwin:base + 0x4805FC
在此call的地址下断
再次发送消息,程序在这个call中断下。
来看看我们选中的call吧:
这个call传递的重要参数在[[esp] + c]中:
这里的参数并不是所有的都有用,有些是上层函数需要用到的。
我们自己调用这个call的话,就需要对内容进行分析,可以先将一些参数置0,然后运行,把无用的参数过滤掉,再来分析有用的参数分别代表了什么。
这个call和我上次分析的低版本用到的非常相似,我上次针对这两个接口写了个辅助工具,上次分析忘记参数位置了,好像和这次的差不多,改改还能用。
链接:https://pan.baidu.com/s/1NKz_IZqqQLy5OkUzWlEG7A
提取码:j0t4
具体功能如下:
- 接收消息拦截,消息类型分析,发送和接收分离。
- 发送消息
辅助编写步骤如下,未接触过win32编程的可以看下:
可以使用dll注入技术,我没有使用dll注入。
技术栈:远程代码写入(WriteProcessMemory),进程间共享内存,远程函数调用(CreateRemoteProcess)。