前言

在入门逆向这个行业之前,曾经以最低效的方法研究了QQ协议。在研究QQ协议的人们都知道有一个加密的函数,阻挡了抓包分析的道路。因为这个加密函数致使我们必须hook才能解开封包。而那个时候的我只能祈祷大佬们给我用用他们的工具。而通过深入学习逆向后,决定对这个函数正式开刀。

视频教程

第一步:思考如何使用加密解密函数

首先我们需要站在开发的角度去思考,如果是我,我会如何使用加密/解密函数对数据包进行处理呢。那么我大概归为以下几个步骤。

加密

  1. 获取数据
  2. 组装明文数据
  3. 调用加密call进行数据加密
  4. 调用send/sendto发送密文封包

解密

  1. 调用recv/recvfrom函数接收封包
  2. 调用解密call对密文解密
  3. 处理解密后数据

第二步:分析思路

分析方法很简单且普通,就是一个方法。利用栈回溯即可。一步一步分析他是从哪个函数得到了密文/明文。

这里我更推荐从解密call寻找,通过前辈们的经验告诉我们加密call和解密call是相邻的两个函数,那么我们找到其中一个另一个自然就能得到。

这里笔者建议从解密call入手比较方便,因为通过抓包器或者recv/recvfrom函数我们已经知道密文是什么了,只需要看到哪里对这个密文进行了操作即可。

大致过程如下:

  1. 断下recv/recvfrom函数
  2. 通过栈回溯让代码继续执行下去,查看什么地方对密文进行了传参操作
  3. 找到传参位置,查看参数的结构。因为解密密文一定需要key,密文包体等内容。这些是必不可缺的一部分。
  4. 找到符合要求的函数单步步过让他执行完,看寄存器和栈结构。查看有没有明文数据出现,如果有则代表找到解密函数附近了。
  5. 通过上述方法一步步筛查到解密函数的最终位置即可。

写在最后

本文只着重于对逆向QQ加密解密函数的思路分析,如果有所疑惑可以留言我会进行答复~。下图贴一张加密函数的样子方便你们确定是否真的找到了。
注:切勿用于非法用途!

l1w5ccal.png