项目需求:
为游戏聊天功能制作增强功能,能够使用户在脱离游戏界面的情况下使用窗口化助手进行聊天,能够设置自动回复,记录关键聊天记录,自动说话等
游戏聊天功能本身比较不容易找到切入点,类似这种不容易找到切入点的功能,我们都可以通过解析网络游戏的通信系统,来找到切入点,另外一个软件或者网络的通信系统是一个程序的核心命脉,全面解读通信系统有助于我们二次开发
首先是网络通信系统的解读和还原
应用程序网络通信的经典流程
- 组织数据-> 加密数据 -> 发送数据
- 接收数据 -> 解密数据 -> 处理数据
一般游戏里加密都是 凯撒密码的变种 它的特点就是替换 或者加偏移 加密前后大小不变
发送的时候可能有中间人攻击,就是这个数据会被截取,那么有了加密算法加密以后,中间人没有加密算法的话,只要做个变种,就算知道是凯撒密码,稍微调一下,破解难度还是比较大的,攻击成本就变高了
加密完了就是发送
服务器处理完了还要把数据传回来,就要接收数据,服务器一般也会对数据加密,接着就解密,然后处理数据...
所有的基本都是这个流程
应用程序网络通信的两种架构:
一、单线程通信
- 组织数据->加密数据->发送数据
- 接收数据->解密数据->处理数据
二、多线程通信
- 组织数据->加密数据->投递数据进入发送队列
读取发送队列->发送数据 - 接收数据->解密数据->投递数据进入处理队列
读取处理队列->处理数据
一般找切入点是找发送数据去回溯,如果是多线程通信 那么只能找到 读取发送队列这个点
就要监视它的读取和写入情况就能顺利切换到 投递数据进入发送队列这个位置上
这两个有连接的一个点
接收数据也是同样的道理
应用程序网络通信的常用函数:
recv send sendto recvfrom WSARecv WSASend
recv send 多采用多线程通信架构
WSASend WSARecv 多采用单线程通信架构,并且配合完成端口使用
recv 和 send 是比较老式的函数,容易造成阻塞,这个函数没发送完以前是啥也干不了的
WSASend WSARecv 这两个支持完成端口,那么这两个是支持异步操作的,一般出现了这个就没必要用多线程了
定位铭文发送数据的关键函数
不管是单线程还是多线程,组织数据对我们不是很重要,主要是要找到组织数据到加密数据的这个过程,因为这个地方的数据是我们看得懂的,到了加密以后的数据就看不懂了,发送数据就对我们没有意义。
组织数据是一个统称,在不同的过程都有不同的组织形式,比如跑步室是有跑步的方式,上线有上线的方式没说话是说话的方式,最后统一都会来到这个组织数据的这个地方,然后再统一有一个加密的地方,一般都是明文的。这个地方加密的可能性不高,因为其实加密了也没啥用,到前面又找到了,而且加密了到服务器还得解密,到服务器也不好处理。
那么怎么找到明文的地方呢?,如果是从前面开始,比如聊天,那么就从读取对话框文本内容开始。如果倒着来,那么就从发送数据开始,找到认识的地方就是个头,比如 使用物品就 物品id..
当然最好的方式就是从聊天入手,因为聊天这个接口是可以自己去指定内容的,但是要注意,有的软件里是有两套系统的聊天是一套通信系统,其他操作是一套通信系统,所以也要区分,但有一说一,破解了其中一套再去破解另外一套也是很方便的.
这次就通过聊天系统来找把。。这里面有几个关键信息,发送一个数据包,肯定要给一个数据包的地址,还有数据包长度,所以一般就是个指针指向数据包,还有就是数据包长度这就是比较敏感的信息.
掏出调试工具
发送这个 断下
往上追了两层
看看esi
内存窗口并不能看到什么和1111有关的东西,这里可能是已经加密过了
再往前
这里就有点像了
但0不好理解
看eax还是看不到
再往前
看一眼edx 出现了1111
发送函数是包含了这个数据的,这个数据在这是没发出去,因此改变这个数据会导致发送 出去的数据是会发生变化的 这个数据看一眼是不太好解读,前面那一片可能是记录的数据包
长度数据倒是那个03
这个地方解读也不是很明确,看看有没有更好的地方
结构体还是没啥。。
再往前
这个数据还是没啥变
再往前
还是没啥变化的样子,但我们发现了这个数据来自edi
我们还要看edi是不是来自上级菜单,再往前,
这个时候就不能继续往前了不然就去细节组织数据 那边了,我们只是想找通用过程
发现栈里有关键性数据
看看这个函数也不是很大。
edx+2c 是个虚函数
上面那个12A3AB0就是网络类了
刚刚这一步一步分析,过程还是比较长的,
一个字符串传递 那就变成了参数,它的内存空间在栈上,也有可能是局部变量,也在栈上,一路走来,可能有N个函数 A->B->C->D->send 如果B是明文 也就是要找的这个点,那么参数就出现在A函数或者A以前,那么栈里面就一定存在相应的关键信息,所以可以直接看栈,通过栈里的信息来看
最精确的就这地方 最近的一次出现直接一步到位
前提是有一个明确的确定的消息去用