封包加密解密
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
封包加密解密-01
网络游戏客户端与服务器之间需要数据交换处理,数据包通过TCP网络协议进行传送,这里我们称数据包为封包.
之前有教程介绍了如何使用模块中的功能进行封包拦截,修改,替换等功能.本章将完全讲解如何对封包的加密,解密技术.
为什么需要解密封包呢?除非那些封包是明文的(即没有加密处理过),否则就得解密,只有解密出来了数据,才能更清楚的了解游戏是如何交换数据处理,分析出封包数据才能够做出脱机万挂,完全脱离游戏客户端,模拟一个客户端来与游戏服务器连接,做你一切想做的事都没问题.所以封包加密解密技术是脱机万挂的第一前提条件.
即使不做脱机万挂,封包技术仍然比CALL技术更有用处.学过前章后大家应该也知道分析CALL,找CALL,调CALL都不是件容易的事.若能完全解密封包就可以减少或不需要CALL,模拟,内存操作了.
有加密就得有解密,有解密当然要有加密.这是相对立的.对封包数据进行加密与解密的函数过程,称为算法.
那封包加密解密技术容易吗?比较讽刺的就是,90%以上的网络游戏的封包都是很容易搞定了.为什么呢?如果算法复杂了的话,会多占CPU性能,而游戏服务器要处理的工作很多,不能把性能全用在加密解密上.举个简单的例子,游戏服务器若同时连接在线的玩家有十万人的话,这些玩家在聊天,打怪,走路等都会产生封包,若算法过于复杂,服务器就很难同时处理得了这么多玩家的封包,何况还得处理数据库中的数据呢.
出于服务器的性能考虑,所以若想同时能在线更多玩家,就不能进行复杂的算法来加密封包.不然就得限制减少能同时在线的玩家,不然游戏服务器会一卡一卡的,导致所有玩家都玩起来.
而还有很多的游戏在设计时,为了减少服务器的负担,不但算法简单,还放松了很多的一些数据验证处理.最终漏洞百出,以致于产生了全屏吸怪,穿墙,复制,无敌等等各种变态万挂.
基本上游戏的加密解密算法,都是采用简单的位运算.位就是比特位,简单的说,只是二进制数据运算处理罢了.所以有必要了解一些常见的位运算汇编指令.在汇编那章的指令那节,有过一些指令的介绍,这里再介绍一下几个重中之重的指令.
加减指令
加法指令 ADD (ADD Binary Numbers Instruction)
指令的格式:ADD 寄存器/内存地址, 寄存器/内存地址/立即数
受影响的标志位:AF、CF、OF、PF、SF和ZF
指令的功能是把源操作数的值加到目的操作数中。
加1指令 INC (Increment by 1 Instruction)
指令的格式:INC 寄存器/内存地址
受影响的标志位:AF、OF、PF、SF和ZF,不影响CF
指令的功能是把操作数的值加1。
减法指令 SUB (Subtract Binary Values Instruction)
指令的格式:SUB 寄存器/内存地址, 寄存器/内存地址/立即数
受影响的标志位:AF、CF、OF、PF、SF和ZF
指令的功能是从目的操作数中减去源操作数。
减1指令 DEC (Decrement by 1 Instruction)
指令的格式:DEC 寄存器/内存地址
受影响的标志位:AF、OF、PF、SF和ZF,不影响CF
指令的功能是把操作数的值减去1。
乘法指令
计算机的乘法指令分为无符号乘法指令和有符号乘法指令,它们的唯一区别就在于:数据的最高位是作为“数值”参与运算,还是作为“符号位”参与运算。
乘法指令的被乘数都是隐含操作数,乘数在指令中显式地写出来。 CPU 会根据乘数是8位、16位,还是32位操作数,来自动选用被乘数: AL 、 AX 或 EAX 。
指令的功能是把显式操作数和隐含操作数相乘,并把乘积存入相应的寄存器中。
无符号数乘法指令 MUL (Unsigned Multiply Instruction)
指令的格式:MUL 寄存器/内存地址
受影响的标志位:CF和OF(AF、PF、SF和ZF无定义)
指令的功能是把显式操作数和隐含操作数(都作为无符号数)相乘,所得的乘积按下表的对应关系存放。
下表乘法指令中乘数、被乘数和乘积的对应关系
乘数位数隐含的被乘数乘积的存放位置举例
8位AL AX MUL BL
16位AX DX-AX MUL BX
32位EAX EDX-EAX MUL ECX
有符号数乘法指令 IMUL (Signed Integer Multiply Instruction)
指令的格式:IMUL 寄存器/内存地址IMUL 寄存器, 立即数
IMUL
寄存器, 寄存器,
立即数
IMUL
寄存器, 寄存器/
内存地址
受影响的标志位:CF和OF(AF、PF、SF和ZF无定义)
1)、指令格式1——该指令的功能是把显式操作数和隐含操作数相乘,所得的乘积按表5.2的对应关系存放。
2)、指令格式2——其寄存器必须是16位/32位通用寄存器,其计算方式为:
寄存器← 寄存器× 立即数
3)、指令格式3——其寄存器只能是16位通用寄存器,其计算方式为:
寄存器1 ← 寄存器 2 ×立即数或寄存器 1 ← 内存地址×立即数
4)、指令格式4——其寄存器必须是16位/32位通用寄存器,其计算方式为:
寄存器1 ← 寄存器 1 ×寄存器 2 或寄存器 1 ← 寄存器 1 ×内存地址
在指令格式2~4中,各操作数的位数要一致。如果乘积超过目标寄存器所能存储的范围,则系统将置溢出标志OF为1。
除法指令
除法指令的被除数是隐含操作数,除数在指令中显式地写出来。 CPU 会根据除数是8位、16位,还是32位,来自动选用被除数 AX 、 DX-AX ,还是 EDX-EAX 。
除法指令功能是用显式操作数去除隐含操作数,可得到商和余数。当除数为0,或商超出数据类型所能表示的范围时,系统会自动产生0号中断。
无符号数除法指令 DIV (Unsigned Divide Instruction)