WPE|52wpe|我爱WPE

 找回密码
 注册会员
搜索
  • 1198查看
  • 2回复

主题

好友

316

积分

中级会员

发表于 2009-12-30 20:21:09 |显示全部楼层
网络游戏客户端与服务器之间需要数据交换处理,数据包通过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)

指令的格式:DIV 寄存器/内存地址
指令的功能是用显式操作数去除隐含操作数(都作为无符号数),所得商和余数按下表的对应关系存放。指令对标志位的影响无定义。

  有符号数除法指令 IDIV (Signed Integer Divide Instruction)

指令的格式:IDIV 寄存器/内存地址
受影响的标志位:AF、CF、OF、PF、SF和ZF

指令的功能是用显式操作数去除隐含操作数(都作为有符号数),所得商和余数的对应关系见表。?

下面表除法指令除数、被除数、商和余数的对应关系
除数位数
隐含的被除数

余数
举例

8位
AX
AL
AH
DIV BH

16位
DX-AX
AX
DX
DIV BX

32位
EDX-EAX
EAX
EDX
DIV ECX




逻辑运算指令
逻辑运算指令是另一组重要的指令,它包括:逻辑与( AND )、逻辑或( OR )、逻辑非( NOT )和异或指令( XOR ),逻辑运算指令也是经常使用的指令。

1、逻辑与操作指令AND(Logical AND Instruction)

指令的格式:AND 寄存器/内存地址, 寄存器/内存地址/立即数
受影响的标志位:CF(0)、OF(0)、PF、SF和ZF(AF无定义)
指令的功能是把源操作数中的每位二进制与目的操作数中的相应二进制进行逻辑“与操作”,操作结果存入目标操作数中。

例已知(BH)=67H,要求把其的第0、1和5位置为0。

解:可以构造一个立即数,其第0、1和5位的值为0,其它位的值为1,该立即数即为:0DCH或11011100B,然后用指令" AND BH, 0DCH "来实现此功能。

只有对应的1和1才等于1.其它全部为0  0和1=0  1和0=0  0和0=0



汇编 AND 指令等于易语言里的 位与() 和 模块里的 AND_() .

2 、逻辑或操作指令OR(Logical OR Instruction)

指令的格式:OR 寄存器/内存地址, 寄存器/内存地址/立即数
受影响的标志位:CF(0)、OF(0)、PF、SF和ZF(AF无定义)
指令的功能是把源操作数中的每位二进制与目的操作数中的相应二进制进行逻辑"或操作",操作结果存入目标操作数中。

例已知(BL)=46H,要求把其的第1、3、4和6位置为1。

解:构造一个立即数,使其第1、3、4和6位的值为1,其它位的值为0,该立即数即为:5AH或01011010B,然后用指令"OR BL, 5AH"来实现此功能。

只有对应的0和0才等于0.其它全部为1   0和1=1  1和0=1  1和1=1



汇编 OR 指令等于易语言里的 位或() 和 模块里的 OR_() .

3、逻辑非操作指令NOT(Logical NOT Instruction)

指令的格式:NOT 寄存器/内存地址
其功能是把操作数中的每位变反,即:1←0,0←1。指令的执行不影响任何标志位。

例已知(AL)=46H,执行指令“NOT AL”后,AL的值是什么?

解:执行该指令后,(AL)=0B9H。该指令只是把二进制位反过来而已





汇编 NOT 指令等于易语言里的 位取反() 和 模块里的 NOT_() .

4、逻辑异或操作指令XOR(Exclusive OR Instruction)

指令的格式:XOR 寄存器/内存地址, 寄存器/内存地址/立即数
受影响的标志位:CF(0)、OF(0)、PF、SF和ZF(AF无定义)
指令的功能是把源操作数中的每位二进制与目的操作数中的相应二进制进行逻辑"异或操作",操作结果存入目标操作数中。

例已知(AH)=46H,要求把其的第0、2、5和7位的二进制值变反。

解:构造一个立即数,使其第0、2、5和7位的值为1,其它位的值为0,该立即数即为:0A5H或10100101B,然后再用指令"XOR AH, 0A5H"来实现此功能。

使用XOR运行后,只要对应的位相同时为0 0和0=0  1和1=0  对应两位不同时为1  0和1=1  1和0=1



汇编 XOR 指令等于易语言里的 位异或() 和 模块里的 XOR_() .

主题

好友

1552

积分

金牌会员

发表于 2009-12-30 20:49:32 |显示全部楼层
头昏。。。
应该是精品,但看不懂
回复

使用道具 举报

主题

好友

1584

积分

金牌会员

发表于 2009-12-30 21:22:14 |显示全部楼层
哎 墨水少了  看不懂啊
回复

使用道具 举报

快速发帖

您需要登录后才可以回帖 登录 | 注册会员

手机版|Archiver|WPE|52wpe|我爱WPE ( 闽ICP备15009081号 )

GMT+8, 2024-5-3 20:06 , Processed in 0.063593 second(s), 16 queries .

返回顶部