PC微信逆向:分析@群成员call

文章目录

    • 发送消息函数的分析
    • 定位组装的数据格式
      • 追踪ebx+0x14
      • 追踪esi+0x4
      • 追踪eax
      • 追踪ebp-0x24
      • 分析组装数据的call
      • 测试组装数据的call是否有效

接上一篇文章,PCXX逆向:发送与接收消息的分析与代码实现:https://blog.csdn.net/qq_38474570/article/details/93339861

发送消息函数的分析

首先定位到发送消息的call

PC微信逆向:分析@群成员call_第1张图片

接着发送一条艾特消息让程序断下
PC微信逆向:分析@群成员call_第2张图片

普通消息和艾特消息的区别就在于eax结构体的区别,所以我们查看一下eax的值

PC微信逆向:分析@群成员call_第3张图片

此时eax指向一个结构体,我们数据窗口跟随看看第一个地址里面保存的是什么

PC微信逆向:分析@群成员call_第4张图片

里面保存的是被艾特人的微信ID

PC微信逆向:分析@群成员call_第5张图片

然后再查看一下ebx消息文本的指针,格式必须是@微信昵称 文本内容

定位组装的数据格式

在这里插入图片描述

想要调用微信发送艾特人消息的关键就在于如何组装这样一个数据格式,

PC微信逆向:分析@群成员call_第6张图片

这两个地址的内容对于我们来说都是未知的,所以我们要找到组装这个数据格式的call,然后我们直接调用call拿到这个数据格式,再发送艾特消息

追踪ebx+0x14

PC微信逆向:分析@群成员call_第7张图片

从这里可以得出eax来自于[ebx+0x14],接下来我们要找[ebx+0x14]来自于哪里

PC微信逆向:分析@群成员call_第8张图片

我们直接拉到函数头部下断点,发送一条艾特消息让程序断下

PC微信逆向:分析@群成员call_第9张图片

查看[ebx+0x14]的内容,发现里面为空,接着我们单步,看这个地方是在哪里被赋值

PC微信逆向:分析@群成员call_第10张图片

单步到这里我们发现这一句将[esi+0x4]的值赋值给了ebx,也就是说[esi+0x4+0x14]的位置会被赋值到[ebx+0x14],我们查看[esi+0x4+0x14]的值,发现就是我们要组装的数据结构。所以,现在我们要查找[esi+0x4]的值来自于哪里。

追踪esi+0x4

我们再次定位到函数头部,发消息让程序断下

PC微信逆向:分析@群成员call_第11张图片

当单步过mov esi,dword ptr ds:[eax]时,esi+0x14+0x4被赋值为我们追踪的数据结构

PC微信逆向:分析@群成员call_第12张图片

此时我们将esi替换为[eax],查看[eax]+0x14+0x4的内容,就是我们需要的数据结构

PC微信逆向:分析@群成员call_第13张图片
此时我们查看eax寄存器,指向了一个地址

PC微信逆向:分析@群成员call_第14张图片

这个地址偏移0x18的地方就是我们要找的数据结构,所以我们现在就要追溯eax来自于哪里

追踪eax

PC微信逆向:分析@群成员call_第15张图片

eax来自于这个函数的参数,所以我们定位到函数头,找到返回地址,反汇编窗口跟随,在返回地址前面一个call下断点

PC微信逆向:分析@群成员call_第16张图片

这里我们发现eax来自于ebp-0x24,所以可以将eax换成ebp-0x24,我们查看一下[ebp-0x24]+0x14+0x4的内容

PC微信逆向:分析@群成员call_第17张图片

就是我们在找的数据结构,继续往上追,在这个函数的头部下断点,我们要追溯[ebp-0x24]的内容来自于哪里?

追踪ebp-0x24

PC微信逆向:分析@群成员call_第18张图片

当我们步过这个call的时候发现ebp-0x24]+0x14+0x4被赋值为这个结构体,说明这个call非常关键,有可能就是用来组装数据的call

分析组装数据的call

PC微信逆向:分析@群成员call_第19张图片

这个call将eax当作参数传入了堆栈,而eax现在是个空白的缓冲区,我们F7单步跟进去

PC微信逆向:分析@群成员call_第20张图片

这里发现了一个call,传入了一个空白的缓冲区

PC微信逆向:分析@群成员call_第21张图片

还有艾特消息的文本格式,F8步过这个call

PC微信逆向:分析@群成员call_第22张图片

此时缓冲区内存放了我们需要的数据,说明这个就是我们需要的组装数据格式的call

测试组装数据的call是否有效

  1. 另找一块缓冲区,替换掉组装数据的call写数据的缓冲区
  2. 发一条普通的文本消息,然后替换eax的值为缓冲区的地址 看是否会发出艾特消息
  3. 将文本内容改成艾特的结构->@微信昵称 文本内容

目前微信机器人的成品已经发布,需要代码请移步Github。还请亲们帮忙点个star
https://github.com/TonyChen56/WeChatRobot

你可能感兴趣的:(软件逆向)