1.封包,协议
什么是封包?封包就是按照某种协议组成的一段字节集.这个很容易理解
那为什么要按照某种协议呢?这个我们一会再说
所有联网的软件,包括网络游戏,客户端和服务端进行通信都是通过封包进行的.
大家可以想象成2个人打电话,封包就是说话的内容.
而协议呢?就是封包的语种, 2个人打电话一个用日语,一个用英文
もしもし、韓さんです。 那边接电话 What are you talking? 这怎么交流啊?
好,那么我们定好协议,本通电话我们全部采用中文,这样就可以正常交流了对吧?
这就是协议
一句话概括, 联网软件,客户端和服务端通过约定好的协议用封包来进行通信.
2.收发包
上面了解了什么是封包协议,我们来看下什么是收发包
网络游戏和单机游戏的区别就在于时刻要和服务器进行通信,也就是收发包.我们发给服务器的叫做发包, 我们收到服务器发给我们的叫做收包,
当然这是相当于我们而言.反之一样.
来一个简单的例子:
我们进入游戏说一句:你好! 为什么别的玩家可以看到?
通过这个流程我们就会了解收发包以及服务器的作用.
首先我们发送要和周围人说你好的封包给服务器,
服务器收到我们的封包以后, 一般会给我们回一个封包,说OK没问题,当然也可能高冷的不回啊.
然后服务器会执行代码判断我周围都有哪些玩家,然后对这些玩家逐个发包
这些玩家收到服务器的封包以后,就会看到我们的喊话内容了.
了解了什么是收发包
我们就要知道调用什么函数来实现.
这里的三大快递公司
就是三个发包函数 send sendto WSASend 以及对应的 3个收包函数 recv recvfrom WSARecv
用哪一组都是可以的.
例如 口袋西游是 send recv
幻想神域是 WSASend WSARecv
3.心跳包
上面了解了封包协议,收发包,我们来看下什么是心跳包?
心跳包也是封包,只是一种比较特殊的封包.
他可以证明我们的客户端还活着,顾名思义,有心跳就是活着.
举个简单的例子:
2个人打电话, A: 喂在吗? B:... A:在吗? B....A:挂了. 多次没得到回应直接就挂断了.
心跳包也一样,当服务器给我们发包,我们没有回复的时候,服务器就有可能把我们强制踢下线. 当然也有可能我们定时主动发送
1-2次服务器可能会认为偶尔丢包,如果2个以上应该就会直接认为我们掉线,直接强制踢下线了.
心跳包有很多好处:
1.一定程度防止脱机外挂
2.掉线立刻下线, 比如以前的老游戏,电脑蓝屏关机了,由于没有自然下线, 心跳也特别少,人物可能还在上面很长一段时间,这是不安全的,比如传奇2
4.针对发包函数的保护方法
了解了封包的概念,我们发现发包函数非常重要,
监听了发包函数就相当于掌握了所有功能实现的方法,可以替代所有call.监听了收包函数就相当于掌握了所以数据信息.因为数据本质来源于服务器
同时通过调用关系我们还知道,可以通过发包函数返回到所有的功能函数.
这是连新手的都知道的2点,所以一定要进行防护
针对这2点我们可以做什么防护呢?
那么第一件事,当然是把这个函数给尽量的隐藏起来
有的时候我们会发现,三大发包函数都不断!
那么是不是这个游戏不用这3个函数发包呢?当然不是,我们只能用这三个发包函数发包,没有其他的方法。
那就是重新实现发包函数,自己重新写一个发包函数,不用系统提供的成品函数了。
说的简单点就是,代码还是这三个发包函数的代码,只是换了个位置,搬家了,不直接调用这3个函数了。
知道这个原理以后就很容易处理了
方法一
既然还是之前的代码,那么我们到他的更内层函数下断就可以了
既WSPSend,相当于用内层函数当特征码。
函数体内的虚函数
X64结构不一样,但是一样是虚函数进去 找到WSPSend
方法二
通过三个函数的特征码到对应模块中进行搜索,这里注意的是这个重新实现的发包函数,可能在原来的模块中ws2_32,也可能在游戏自己的某个模块中。
所以搜索的时候要注意.
特征码比如头部这一段
可能会有微小变化,所以我们要尝试
同时也可能搜索到多个位置,全部下断,测试即可.
总之两种方法思路是一致的,都是找原代码的特征而已。
对发包函数第二个保护方案就是加密
如果不加密,直接监听发包函数就可以获得所有的信息了.
比如直接hook send函数
例如WPE等简单工具就是hook的发包函数
所以必须进行加密
加密也一定要进行动态加密,就是同样的结果加密后内容是不同的.那么以上方法也就没有任何作用了.
5.对发包函数第三个保护方案就是线程发包
正常的游戏调用流程是
功能函数1---》功能函数2---》组包过程---》明文封包---》加密---》发包函数
所谓组包过程就是把功能函数的参数按照格式组成一个字节集
明文封包就是组装完成但是没有进行加密的封包
最后一步加密发送.
通过上面的调用关系,我们能看出来
这样只要找到发包函数,所以功能函数以及加密解密函数随意返回,随意分析
那怎么样避免呢?线程发包!
线程发包原理
就是说用2条线程来控制以上流程,让逆向者不能直接返回
第一条线程
功能函数1---》功能函数2---》组包---》明文封包---》封包写到某一个地址中
第二条线程
得到那个地址中的内容---》加密---》发包函数
当然两条线程分工不一定是严格这样写的,也可能明文封包在第二条线程中
这样的发包会有什么的特征呢?
1.无论什么功能,堆栈返回都是一样的,因为第二条线程的调用过程,什么功能都一样了
2.第二条线程由于不断循环,断的可能会比较频繁
请等待后续!
请等待后续!
请等待后续!
什么是封包?封包就是按照某种协议组成的一段字节集.这个很容易理解
那为什么要按照某种协议呢?这个我们一会再说
所有联网的软件,包括网络游戏,客户端和服务端进行通信都是通过封包进行的.
大家可以想象成2个人打电话,封包就是说话的内容.
而协议呢?就是封包的语种, 2个人打电话一个用日语,一个用英文
もしもし、韓さんです。 那边接电话 What are you talking? 这怎么交流啊?
好,那么我们定好协议,本通电话我们全部采用中文,这样就可以正常交流了对吧?
这就是协议
一句话概括, 联网软件,客户端和服务端通过约定好的协议用封包来进行通信.
2.收发包
上面了解了什么是封包协议,我们来看下什么是收发包
网络游戏和单机游戏的区别就在于时刻要和服务器进行通信,也就是收发包.我们发给服务器的叫做发包, 我们收到服务器发给我们的叫做收包,
当然这是相当于我们而言.反之一样.
来一个简单的例子:
我们进入游戏说一句:你好! 为什么别的玩家可以看到?
通过这个流程我们就会了解收发包以及服务器的作用.
首先我们发送要和周围人说你好的封包给服务器,
服务器收到我们的封包以后, 一般会给我们回一个封包,说OK没问题,当然也可能高冷的不回啊.
然后服务器会执行代码判断我周围都有哪些玩家,然后对这些玩家逐个发包
这些玩家收到服务器的封包以后,就会看到我们的喊话内容了.
了解了什么是收发包
我们就要知道调用什么函数来实现.
这里的三大快递公司
就是三个发包函数 send sendto WSASend 以及对应的 3个收包函数 recv recvfrom WSARecv
用哪一组都是可以的.
例如 口袋西游是 send recv
幻想神域是 WSASend WSARecv
3.心跳包
上面了解了封包协议,收发包,我们来看下什么是心跳包?
心跳包也是封包,只是一种比较特殊的封包.
他可以证明我们的客户端还活着,顾名思义,有心跳就是活着.
举个简单的例子:
2个人打电话, A: 喂在吗? B:... A:在吗? B....A:挂了. 多次没得到回应直接就挂断了.
心跳包也一样,当服务器给我们发包,我们没有回复的时候,服务器就有可能把我们强制踢下线. 当然也有可能我们定时主动发送
1-2次服务器可能会认为偶尔丢包,如果2个以上应该就会直接认为我们掉线,直接强制踢下线了.
心跳包有很多好处:
1.一定程度防止脱机外挂
2.掉线立刻下线, 比如以前的老游戏,电脑蓝屏关机了,由于没有自然下线, 心跳也特别少,人物可能还在上面很长一段时间,这是不安全的,比如传奇2
4.针对发包函数的保护方法
了解了封包的概念,我们发现发包函数非常重要,
监听了发包函数就相当于掌握了所有功能实现的方法,可以替代所有call.监听了收包函数就相当于掌握了所以数据信息.因为数据本质来源于服务器
同时通过调用关系我们还知道,可以通过发包函数返回到所有的功能函数.
这是连新手的都知道的2点,所以一定要进行防护
针对这2点我们可以做什么防护呢?
那么第一件事,当然是把这个函数给尽量的隐藏起来
有的时候我们会发现,三大发包函数都不断!
那么是不是这个游戏不用这3个函数发包呢?当然不是,我们只能用这三个发包函数发包,没有其他的方法。
那就是重新实现发包函数,自己重新写一个发包函数,不用系统提供的成品函数了。
说的简单点就是,代码还是这三个发包函数的代码,只是换了个位置,搬家了,不直接调用这3个函数了。
知道这个原理以后就很容易处理了
方法一
既然还是之前的代码,那么我们到他的更内层函数下断就可以了
既WSPSend,相当于用内层函数当特征码。
函数体内的虚函数
X64结构不一样,但是一样是虚函数进去 找到WSPSend
方法二
通过三个函数的特征码到对应模块中进行搜索,这里注意的是这个重新实现的发包函数,可能在原来的模块中ws2_32,也可能在游戏自己的某个模块中。
所以搜索的时候要注意.
特征码比如头部这一段
可能会有微小变化,所以我们要尝试
同时也可能搜索到多个位置,全部下断,测试即可.
总之两种方法思路是一致的,都是找原代码的特征而已。
对发包函数第二个保护方案就是加密
如果不加密,直接监听发包函数就可以获得所有的信息了.
比如直接hook send函数
例如WPE等简单工具就是hook的发包函数
所以必须进行加密
加密也一定要进行动态加密,就是同样的结果加密后内容是不同的.那么以上方法也就没有任何作用了.
5.对发包函数第三个保护方案就是线程发包
正常的游戏调用流程是
功能函数1---》功能函数2---》组包过程---》明文封包---》加密---》发包函数
所谓组包过程就是把功能函数的参数按照格式组成一个字节集
明文封包就是组装完成但是没有进行加密的封包
最后一步加密发送.
通过上面的调用关系,我们能看出来
这样只要找到发包函数,所以功能函数以及加密解密函数随意返回,随意分析
那怎么样避免呢?线程发包!
线程发包原理
就是说用2条线程来控制以上流程,让逆向者不能直接返回
第一条线程
功能函数1---》功能函数2---》组包---》明文封包---》封包写到某一个地址中
第二条线程
得到那个地址中的内容---》加密---》发包函数
当然两条线程分工不一定是严格这样写的,也可能明文封包在第二条线程中
这样的发包会有什么的特征呢?
1.无论什么功能,堆栈返回都是一样的,因为第二条线程的调用过程,什么功能都一样了
2.第二条线程由于不断循环,断的可能会比较频繁
请等待后续!
请等待后续!
请等待后续!