封包加密解密_第1页
封包加密解密_第2页
封包加密解密_第3页
封包加密解密_第4页
封包加密解密_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、封包加密解密-01 网络游戏客户端与服务器之间需要数据交换处理,数据包通过TCP网络协议进行传送,这里我们称数据包为封包.之前有教程介绍了如何使用模块中的功能进行封包拦截,修改,替换等功能.本章将完全讲解如何对封包的加密,解密技术. 为什么需要解密封包呢?除非那些封包是明文的(即没有加密处理过),否则就得解密,只有解密出来了数据,才能更清楚的了解游戏是如何交换数据处理,分析出封包数据才能够做出脱机外挂,完全脱离游戏客户端,模拟一个客户端来与游戏服务器连接,做你一切想做的事都没问题.所以封包加密解密技术是脱机外挂的第一前提条件.即使不做脱机外挂,封包技术仍然比CALL技术更有用处.学过前章后大家

2、应该也知道分析CALL,找CALL,调CALL都不是件容易的事.若能完全解密封包就可以减少或不需要CALL,模拟,内存操作了. 有加密就得有解密,有解密当然要有加密.这是相对立的.对封包数据进行加密与解密的函数过程,称为算法.那封包加密解密技术容易吗?比较讽刺的就是,90%以上的网络游戏的封包都是很容易搞定了.为什么呢?如果算法复杂了的话,会多占CPU性能,而游戏服务器要处理的工作很多,不能把性能全用在加密解密上.举个简单的例子,游戏服务器若同时连接在线的玩家有十万人的话,这些玩家在聊天,打怪,走路等都会产生封包,若算法过于复杂,服务器就很难同时处理得了这么多玩家的封包,何况还得处理数据库中的

3、数据呢.出于服务器的性能考虑,所以若想同时能在线更多玩家,就不能进行复杂的算法来加密封包.不然就得限制减少能同时在线的玩家,不然游戏服务器会一卡一卡的,导致所有玩家都玩起来.而还有很多的游戏在设计时,为了减少服务器的负担,不但算法简单,还放松了很多的一些数据验证处理.最终漏洞百出,以致于产生了全屏吸怪,穿墙,复制,无敌等等各种变态外挂. 基本上游戏的加密解密算法,都是采用简单的位运算.位就是比特位,简单的说,只是二进制数据运算处理罢了.所以有必要了解一些常见的位运算汇编指令.在汇编那章的指令那节,有过一些指令的介绍,这里再介绍一下几个重中之重的指令.一加减指令 加法指令 ADD (ADD Bi

4、nary 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

5、、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 。指令的功能是把显式操作

6、数和隐含操作数相乘,并把乘积存入相应的寄存器中。 无符号数乘法指令 MUL (Unsigned Multiply Instruction)指令的格式:MUL 寄存器/内存地址 受影响的标志位:CF和OF(AF、PF、SF和ZF无定义)指令的功能是把显式操作数和隐含操作数(都作为无符号数)相乘,所得的乘积按下表的对应关系存放。下表乘法指令中乘数、被乘数和乘积的对应关系乘数位数隐含的被乘数乘积的存放位置举例8位ALAXMUL BL16位AXDX-AXMUL BX32位EAXEDX-EAXMUL ECX(图5.2) 有符号数乘法指令 IMUL (Signed Integer Multiply Ins

7、truction)指令的格式:IMUL寄存器/内存地址该指令的功能是把显式操作数和隐含操作数相乘,所得的乘积按表5.2的对应关系存放。IMUL寄存器, 立即数其寄存器必须是16位/32位通用寄存器,其计算方式为:寄存器 寄存器 立即数IMUL寄存器, 寄存器, 立即数其寄存器只能是16位通用寄存器,其计算方式为:寄存器 1 寄存器 2 立即数 或 寄存器 1 内存地址立即数IMUL寄存器, 寄存器/内存地址其寄存器必须是16位/32位通用寄存器,其计算方式为:寄存器 1 寄存器 1 寄存器 2 或寄存器 1 寄存器 1 内存地址受影响的标志位:CF和OF(AF、PF、SF和ZF无定义)在指令格

8、式24中,各操作数的位数要一致。如果乘积超过目标寄存器所能存储的范围,则系统将置溢出标志OF为1。三、除法指令除法指令的被除数是隐含操作数,除数在指令中显式地写出来。 CPU 会根据除数是8位、16位,还是32位,来自动选用被除数 AX 、 DX-AX ,还是 EDX-EAX 。除法指令功能是用显式操作数去除隐含操作数,可得到商和余数。当除数为0,或商超出数据类型所能表示的范围时,系统会自动产生0号中断。 无符号数除法指令 DIV (Unsigned Divide Instruction)指令的格式:DIV 寄存器/内存地址 指令的功能是用显式操作数去除隐含操作数(都作为无符号数),所得商和余

9、数按下表的对应关系存放。指令对标志位的影响无定义。 有符号数除法指令 IDIV (Signed Integer Divide Instruction)指令的格式:IDIV 寄存器/内存地址 受影响的标志位:AF、CF、OF、PF、SF和ZF指令的功能是用显式操作数去除隐含操作数(都作为有符号数),所得商和余数的对应关系见表。下面表除法指令除数、被除数、商和余数的对应关系除数位数隐含的被除数商余数举例8位AXALAHDIV BH16位DX-AXAXDXDIV BX32位EDX-EAXEAXEDXDIV ECX四、逻辑运算指令逻辑运算指令是另一组重要的指令,它包括:逻辑与( AND )、逻辑或(

10、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,

11、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,

12、其它位的值为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寄存器/内存地址 其功能:是把操作数中的每位变反,即:10,01。指令的执行不影响任何标志位。例已知(AL)=46H,执行指令“NOTAL”后,AL的值是什么?解:执行该指令后,(AL)=0B9H。该指令只是把二进制位反过来而已 汇编 NOT 指令等于易语言里

13、的 位取反() 和 模块里的 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来实现此功能。使用

14、XOR运行后,只要对应的位相同时为0 ,0和0=0 1和1=0 对应两位不同时为1 0和1=1 1和0=1汇编 XOR 指令等于易语言里的 位异或() 和 模块里的 XOR_() . 五、移位操作指令移位操作指令是一组经常使用的指令,它包括算术移位、逻辑移位、双精度移位、循环移位和带进位的循环移位等五大类。移位指令都有指定移动二进制位数的操作数,该操作数可以是立即数或CL的值。在8086中,该立即数只能为 1 ,但在其后的 CPU 中,该立即数可以是 131 之内的数。1 、算术移位指令算术移位指令有:算术左移 SAL (Shift Algebraic Left)和算术右移 SAR (Shif

15、t Algebraic Right)。它们的指令格式如下:SAL/SAR寄存器/内存地址, CL/立即数受影响的标志位:CF、OF、PF、SF和ZF(AF无定义)。算术移位指令的功能描述如下,具体功能下图(a)、(b)所示。算术左移 SAL 把目的操作数的低位向高位移,空出的低位补0; 算术右移 SAR 把目的操作数的高位向低位移,空出的高位用最高位(符号位)填补。 例已知(AH)=12H,(BL)=0A9H,试给出分别用算术左移和右移指令移动1位后,寄存器AH和BL的内容。解:用算术左移和右移指令移动1位后,寄存器AH和BL的结果如下表所示。操作数的初值执行的指令执行后操作数的内容(AH)=

16、12H=10010BSAL AH, 1(AH)=24H=100100B(BL)=0A9H=10101001BSAL BL, 1(BL)=52H=1010010B(AH)=12H=10010BSAR AH, 1(AH)=09H=1001B(BL)=0A9H=10101001BSAR BL, 1(BL)=0D4H=11010100B汇编指令 SAL 指令等于易语言里的 左移() 和 模块里的 SAL_() SHL_().汇编指令 SAR 指令在易语言里无对应函数 等于模块里的 SAR_() 函数.但要注意模块里的 SAR_() 是以32位整数型来运算的,只等于汇编里的 SAR eax,1 这类的3

17、2位寄存器的运行结果,若想以16位或8位来运算,需要先把符号位扩展到32位后再处理.2、逻辑移位指令此组指令有:逻辑左移 SHL (Shift Logical Left)和逻辑右移 SHR (Shift Logical Right)。它们的指令格式如下:SHL/SHR寄存器/内存地址, CL/立即数受影响的标志位:CF、OF、PF、SF和ZF(AF无定义)。逻辑左移/右移指令只有它们的移位方向不同,移位后空出的位都补 0 。它们的具体功能下图(a)、(b)所示。例已知(AH)=12H,(BL)=0A9H,试给出分别用逻辑左移和右移指令移动1位后,寄存器AH和BL的内容。解:用算术左移和右移指令

18、移动1位后,寄存器AH和BL的结果如下表所示。操作数的初值执行的指令执行后操作数的内容(AH)=12H=10010BSHL AH, 1(AH)=24H=100100B(BL)=0A9H=10101001BSHL BL, 1(BL)=52H=1010010B(AH)=12H=10010BSHR AH, 1(AH)=09H=1001B(BL)=0A9H=10101001BSHR BL, 1(BL)=54H=1010100B汇编 SHL 指令等于易语言里的 左移() 和模块里的 SHL_() SAL_().汇编 SHR 指令等于易语言里的 右移() 和模块里的 SHR_().3、双精度移位指令此组指

19、令有:双精度左移SHLD(Shift Left Double)和双精度右移SHRD(Shift Right Double)。它们都是具有三个操作数的指令,其指令的格式如下:SHLD/SHRD 寄存器/内存地址, 寄存器, CL/立即数;80386+其中:第一操作数是一个16位/32位的寄存器或存储单元;第二操作数(与前者具有相同位数)一定是寄存器;第三操作数是移动的位数,它可由CL或一个立即数来确定。在执行SHLD指令时,第一操作数向左移n位,其“空出”的低位由第二操作数的高n位来填补,但第二操作数自己不移动、不改变。在执行SHRD指令时,第一操作数向右移n位,其“空出”的高位由第二操作数的低

20、n位来填补,但第二操作数自己也不移动、不改变。SHLD和SHRD指令的移位功能示意图如下图所示。受影响的标志位:CF、OF、PF、SF和ZF(AF无定义)下面是几个双精度移位的例子及其执行结果。双精度移位指令指令操作数的初值指令执行后的结果SHLD AX, BX, 1(AX)=1234H,(BX)=8765H(AX)=2469HSHLD AX, BX, 3(AX)=1234H,(BX)=8765H(AX)=91A4HSHRD AX, BX, 2(AX)=1234H,(BX)=8765H(AX)=448DHSHRD AX, BX, 4(AX)=1234H,(BX)=8765H(AX)=5123H

21、汇编 SHLD 与 SHRD 在易语言里暂无对应的函数,2.5模块里也没加上这两个函数.4、循环移位指令循环移位指令有:循环左移 ROL (Rotate Left)和循环右移 ROR (Rotate Right)。指令的格式:ROL/ROR寄存器/内存地址, CL/立即数受影响的标志位:CF和OF循环左移/右移指令只是移位方向不同,它们移出的位不仅要进入CF,而且还要填补空出的位。具体功能如下图(a)、(b)所示。下面是几个循环移位的例子及其执行结果。循环移位指令指令操作数的初值指令执行后的结果ROL AX, 1(AX)=6789H=110011110001001B(AX)=0CF12H=11

22、00111100010010BROL AX, 3(AX)=6789H=110011110001001B(AX)=3C4BH=11110001001011BROR AX, 2(AX)=6789H=110011110001001B(AX)=59E2H=101100111100010BROR AX, 4(AX)=6789H=110011110001001B(AX)=9678H=1001011001111000B汇编 ROL 在易语言里无对应函数,模块里提供了 ROL_().汇编 ROR 在易语言里无对应函数,模块里提供了 ROR_().5、带进位的循环移位指令带进位的循环移位指令有:带进位的循环左移

23、 RCL (Rotate Left Through Carry)和带进位的循环右移 RCR (Rotate Right)。指令的格式:RCL/RCR寄存器/内存地址, CL/立即数受影响的标志位:CF和OF带进位的循环左移右移指令只有移位的方向不同,它们都用原CF的值填补空出的位,移出的位再进入CF。具体功能如下图(a)、(b)所示。下面是几个带进位循环移位的例子及其执行结果。双精度移动指令指令操作数的初值指令执行后的结果RCL AX, 1CF=0,(AX)=0ABCDH=1010101111001101B(AX)=579AH=101011110011010BRCL AX, 1CF=1,(AX

24、)=0ABCDH=1010101111001101B(AX)=579BH=101011110011011BRCR AX, 2CF=0,(AX)=0ABCDH=1010101111001101B(AX)=AAF3H=1010101011110011BRCR AX, 2CF=1,(AX)=0ABCDH=1010101111001101B(AX)=EAF3H=1110101011110011B汇编 RCL 在易语言里无对应函数,模块里提供了 RCL_().汇编 RCR 在易语言里无对应函数,模块里提供了 RCR_().本文重新介绍了这些将在封包算法里将常用到的汇编指令,大家要尽量记住这些指令的运算方

25、式。最多被用到的指令主要有 XOR-位异或 ,ROL-左循环移位 ,ROR-右循环移位 ,AND-位与 ,OR-位或 ,SHL-左移 ,SHR-右移 ,NOT-位取反。其它加减乘除,算术移位等用到的机率很少。有些算法指令在易语言里也有对应的函数,或者模块里也有提供了这些功能,不过需要注意的是目前2.5模块里提供的这几个功能是按32位运算的,大家在使用时要注意,有关相应的8位与16位运算的函数下版时会增加上去。封包加密解密-02前面我们介绍了最常会被用在封包加密解密算法中的指令,本节开始教大家些入门的知识,如何去分析封包数据。分析封包数据主要分两方面:一、用肉眼看,再动手写代码测试,对于简单算法

26、的封包还是容易搞定的。二、动态调试,对于复杂算法的封包就只能这样才能跟踪分析出他的算法。本章教材会全部都讲解到,当然先介绍第一方式,用肉眼来看,这可是件辛苦的事哟,大家准备好防辐射的眼镜与眼药水吧.可千万别用眼过度,要记得多做做眼保健操哦。要想用肉眼分析封包,就得要有被加密前的明文内容,与被加密后的封包数据.只有这样才能用眼来看,来分析。如果你只有一段密文而没有对应的明文,就只能扯蛋了。对于获取加密后的封包很简单,大家完全可以自已用模块里的截包功能来编写个工具出来,也可以找一些现成的封包拦截工具来用,例如老牌的WPE这个软件。明文包又如何得到呢?比如说我们在游戏里要发言一段文本内容,同时拦截下

27、这段发出的封包,就可以肯定这条包里有包含着某些文本内容了。只需要多截几条不同文本的聊天封包,进行对应就能简单的分析出来相应的明文文本对应被加密后的封包中哪些数据。下面先来介绍些入门知识开一个IE浏览器,打开百度网站 在搜索框输入 42724920 后运行WPE软件,选择IE的进程,点击顺三角按钮开始拦截封包.在百度里点搜索,会被WPE拦载下数据包,点击黑方框的停止按钮,就可以查看被拦截下来的那些数据包了。找到与IE地址栏里显示的那条封包数据 GET /s?wd=42724920 这条,在WPE的菜单-文件-另存为-文本文件 保存封包数据文本,下面就是这条封包数据:16 0

28、 9 429(size) Send(发送)0000 47 45 54 20 2F 73 3F 77 64 3D 34 32 37 32 34 39 GET /s?wd=4272490010 32 30 20 48 54 54 50 2F 31 2E 31 0D 0A 41 63 63 20 HTTP/1.1.Acc0020 65 70 74 3A 20 69 6D 61 67 65 2F 67 69 66 2C 20 ept: image/gif,0030 69 6D 61 67 65 2F 6A 70 65 67 2C 20 69 6D 61 67 image/jpeg

29、, imag0040 65 2F 70 6A 70 65 67 2C 20 69 6D 61 67 65 2F 70 e/pjpeg, image/p0050 6A 70 65 67 2C 20 61 70 70 6C 69 63 61 74 69 6F jpeg, applicatio0060 6E 2F 78 2D 73 68 6F 63 6B 77 61 76 65 2D 66 6C n/x-shockwave-fl0070 61 73 68 2C 20 61 70 70 6C 69 63 61 74 69 6F 6E ash, application0080 2F 76 6E 64 2

30、E 6D 73 2D 65 78 63 65 6C 2C 20 2A /vnd.ms-excel, *0090 2F 2A 0D 0A 52 65 66 65 72 65 72 3A 20 68 74 74 /*.Referer: htt00A0 70 3A 2F 2F 77 77 77 2E 62 61 69 64 75 2E 63 6F p:/www.baidu.co00B0 6D 2F 0D 0A 41 63 63 65 70 74 2D 4C 61 6E 67 75 m/.Accept-Langu00C0 61 67 65 3A 20 7A 68 2D 63 6E 0D 0A 55 7

31、3 65 72 age: zh-cn.User00D0 2D 41 67 65 6E 74 3A 20 4D 6F 7A 69 6C 6C 61 2F -Agent: Mozilla/00E0 34 2E 30 20 28 63 6F 6D 70 61 74 69 62 6C 65 3B 4.0 (compatible;00F0 20 4D 53 49 45 20 37 2E 30 3B 20 57 69 6E 64 6F MSIE 7.0; Windo0100 77 73 20 4E 54 20 35 2E 31 3B 20 54 72 69 64 65 ws NT 5.1; Tride01

32、10 6E 74 2F 34 2E 30 29 0D 0A 41 63 63 65 70 74 2D nt/4.0).Accept-0120 45 6E 63 6F 64 69 6E 67 3A 20 67 7A 69 70 2C 20 Encoding: gzip,0130 64 65 66 6C 61 74 65 0D 0A 48 6F 73 74 3A 20 77 deflate.Host: w0140 77 77 2E 62 61 69 64 75 2E 63 6F 6D 0D 0A 43 6F .Co0150 6E 6E 65 63 74 69 6F 6E 3A 20 4B 65 6

33、5 70 2D 41 nnection: Keep-A0160 6C 69 76 65 0D 0A 43 6F 6F 6B 69 65 3A 20 42 41 live.Cookie: BA0170 49 44 55 49 44 3D 42 42 35 46 34 46 39 43 34 35 IDUID=BB5F4F9C450180 34 31 38 30 43 35 33 31 31 44 35 38 44 45 43 45 4180C5311D58DECE0190 33 30 32 36 45 46 3A 46 47 3D 31 3B 20 42 44 5F 3026EF:FG=1; B

34、D_01A0 55 54 4B 5F 44 56 54 3D 31 0D 0A 0D 0A UTK_DVT=1.在WPE里拦截下来的封包,左中右分三列,第一列无意义,第二列是封包数据的十六进制文本,第三列是字符串文本。很多新人总爱抓着第三列的文本数据不放,事实上我要严肃的告诉你,第三列的文本数据,如果是明文的情况下可以做为参考用,否则第三列数据是没有多少意义的,为什么呢?因为第三列只能显示可视的字符,对于非可视的字符统统用 . 这个点号来表示,这对于我们要进行解密封包是没有作用的,例如图上的红色十六进制数据 0D 0A 正是文本里的换行符号,在第三列中无法显示换行,全用点号来代表了。封包的正文

35、就是这些十六进制的文本数据了,但你也不能抓着十六进制就不放了,要知道,封包都应该用十进制的字节集来表示,但由于十进制从0到255间小则一个字,多则三个字,如果直接显示就会一团糟,所以绝大多数的截包类软件,都会把封包数据在三个字符的十六进制来显示,这样就能工工整整的排列起来了。于是你恍然大悟,原来只要把这段十六进制的数据解密就行了哇!但我要提醒你又透逗了一次,这段十六进制的封包根本就不需要解密,分析封包的最终结果不就是我们得编写与封包有关的功能吗?在截包功能里截到的就是字节集数据,不是十六进制的,如果是明文的话直接用到文本(字节集封包) 就能显示出来了,所以用WPE截下的包,顶多只是把十六进制转

36、回成十进制的字节集即可,这个过程算不上加密解密。所以像上面的十六进制的封包数据,只需要用模块里的十六进制到字节集() 就能转换过来了。字节集封包=十六进制到字节集(47 45 54 20 2F 73 3F 77 64 3D 34 32 37 32 34 39 32 30 20 48 54 54 50 2F 31 2E 31 0D 0A 41 63 63, )输出调试文本(到文本(字节集封包)上面说的是明文包,明文包自然是无需解密,下面再用WPE拦截在百度里搜“外挂作坊” 看看会截到什么样的包?13 0 9 445 Send0000 47 45 54

37、20 2F 73 3F 77 64 3D 25 43 44 25 45 32 GET /s?wd=0010 25 42 39 25 44 32 25 44 37 25 46 37 25 42 37 25 %0020 42 42 20 48 54 54 50 2F 31 2E 31 0D 0A 41 63 63 BB HTTP/1.1.Acc0030 65 70 74 3A 20 69 6D 61 67 65 2F 67 69 66 2C 20 ept: image/gif,0040 69 6D 61 67 65 2F 6A 70 65 67 2C 20 69 6D 61 67 image/jp

38、eg, imag0050 65 2F 70 6A 70 65 67 2C 20 69 6D 61 67 65 2F 70 e/pjpeg, image/p0060 6A 70 65 67 2C 20 61 70 70 6C 69 63 61 74 69 6F jpeg, applicatio0070 6E 2F 78 2D 73 68 6F 63 6B 77 61 76 65 2D 66 6C n/x-shockwave-fl0080 61 73 68 2C 20 61 70 70 6C 69 63 61 74 69 6F 6E ash, application0090 2F 76 6E 64

39、 2E 6D 73 2D 65 78 63 65 6C 2C 20 2A /vnd.ms-excel, *00A0 2F 2A 0D 0A 52 65 66 65 72 65 72 3A 20 68 74 74 /*.Referer: htt00B0 70 3A 2F 2F 77 77 77 2E 62 61 69 64 75 2E 63 6F p:/www.baidu.co00C0 6D 2F 0D 0A 41 63 63 65 70 74 2D 4C 61 6E 67 75 m/.Accept-Langu00D0 61 67 65 3A 20 7A 68 2D 63 6E 0D 0A 55

40、 73 65 72 age: zh-cn.User00E0 2D 41 67 65 6E 74 3A 20 4D 6F 7A 69 6C 6C 61 2F -Agent: Mozilla/00F0 34 2E 30 20 28 63 6F 6D 70 61 74 69 62 6C 65 3B 4.0 (compatible;0100 20 4D 53 49 45 20 37 2E 30 3B 20 57 69 6E 64 6F MSIE 7.0; Windo0110 77 73 20 4E 54 20 35 2E 31 3B 20 54 72 69 64 65 ws NT 5.1; Tride

41、0120 6E 74 2F 34 2E 30 29 0D 0A 41 63 63 65 70 74 2D nt/4.0).Accept-0130 45 6E 63 6F 64 69 6E 67 3A 20 67 7A 69 70 2C 20 Encoding: gzip,0140 64 65 66 6C 61 74 65 0D 0A 48 6F 73 74 3A 20 77 deflate.Host: w0150 77 77 2E 62 61 69 64 75 2E 63 6F 6D 0D 0A 43 6F .Co0160 6E 6E 65 63 74 69 6F 6E 3A 20 4B 65

42、 65 70 2D 41 nnection: Keep-A0170 6C 69 76 65 0D 0A 43 6F 6F 6B 69 65 3A 20 42 41 live.Cookie: BA0180 49 44 55 49 44 3D 42 42 35 46 34 46 39 43 34 35 IDUID=BB5F4F9C450190 34 31 38 30 43 35 33 31 31 44 35 38 44 45 43 45 4180C5311D58DECE01A0 33 30 32 36 45 46 3A 46 47 3D 31 3B 20 42 44 5F 3026EF:FG=1;

43、 BD_01B0 55 54 4B 5F 44 56 54 3D 31 0D 0A 0D 0A UTK_DVT=1.通过前一次的包我们知道在 GET /s?wd= 后面的内容是我们输入在百度搜索框中的文本,但这条包里的结果却不一样,明明我们输入的是 “外挂作坊”但这里居然是 也不知道是什么的玩意,所以可以肯定,原明文内容“外挂作坊”被某种算法给编码处理过了,因为算法简单所以称为编码,复杂的叫加密,好像没人这么明确的定义过吧,不管他叫编码还是叫加密都无所谓了,重要的是我们如何自已也能写出来这样的算法。尽管之前说过,要分析封包还是得用那段十六进制的数据,但这里的第三列字符串文本内容仍然极据参考意义

44、,看这段被处理过的红色文本内容,感觉像是十六进制的格式.去掉%分号就是 CD E2 B9 D2 D7 F7 B7 BB 正好八对,外挂作坊四个字刚好也是8字节的长度,即然怀疑他看起来像是被转十六进制的,咱只需要试试看就知道了。输入调试文本 (字节集到十六进制 (到字节集 (“外挂作坊”), “ ”)输出调试文本 (到文本 (十六进制到字节集 (“CD E2 B9 D2 D7 F7 B7 BB”, “ ”)* CD E2 B9 D2 D7 F7 B7 BB* 外挂作坊测试结果真是这样的,由此可见网页的URL中若含有一些特殊字符或中文等时,需要转为十六进制文本,对于转为十六进制后的数据还加上 %

45、百分号,来说明后面的是16进制数据。上面介绍了用WPE截包,说了封包应该是十进制的字节集格式,但为了工整显示,所以用十六进制来输出,并且还提供了字符串供参考,但字符串是无法正确显示一些特殊字符的,下面再介绍一点基础知识,这是前段时间有一个会员向我求助时的记录,以此为例:这个会员遇到了这个问题,明文文本 70 被加密成了 3A3930263E3826393B3C26393F38 加密后的文本数据咋看都像是16进制的处理,但是不对.因为若把这段明文转成真正的十六进制,与被加密的十六进制总是有8的相差结果.于是他便顺理成章的认为这只是在不同的时候采用+或-进行运算后再转为十六

46、进制的。老实说,他的想法确实没错.但这似乎不好控制,得知道一个值在多少或啥条件时才会用加还是用减呢?或许可以试试用别的方式来计算看看。2 1 8 . 6 0 . 1 3 4 . 1 7 03A 39 30 26 3E 38 26 39 3B 3C 26 39 3F 38通过上面的明文与密文对应的关系来看,明文字符 1 总是等于 0x39 这个规律,可以肯定这个算法方式是按一个固定的方法来运算的,并且是一个一个字节来处理.第一个字节的运算结果不会影响到第二字节的处理,下面我们把这一切都转为十进制字节集来再分析。输出调试文本 (字节集到十进制 (到字节集 (“70”), “

47、,”)输出调试文本 (字节集到十进制 (十六进制到字节集 (“3A 39 30 26 3E 38 26 39 3B 3C 26 39 3F 38”, “ ”)* 50,49,56,46,54,48,46,49,51,52,46,49,55,48* 58,57,48,38,62,56,38,57,59,60,38,57,63,56明文与密文的对照结果,确实都相差着8,那么在这都相差8的背后有没有其它什么玄机呢?如果不是采用加减乘除的方式,那就该是位运算或密码表了,对于密码表以后再介绍。如果想知道是不是通过位运算,那就得转换成二进制才能更直观的分析:明文=00110010 00110001 001

48、11000 00101110 00110110 00110000 00101110 00110001 00110011 00110100 00101110 00110001 00110111 00110000密文=00111010 00111001 00110000 00100110 00111110 00111000 00100110 00111001 00111011 00111100 00100110 00111001 00111111 00111000 8=00111010 因为明文跟密文之间总是相差8,所以我们要重点看看这两段的二进制里与8倒底有什么关系。在前一节教材里说位运算里最多

49、会被用到的一般都是 XOR 位异或,看看上面的明文与密文间的第四位的结果,只要明文第四位=8 加密后该位就变成0了,若明文第四位=0 则加密后就成1了,看起来只是把第四位进行简单的反过来而已,而 XOR 则正好符合这种反位的结果,当然 NOT位取反也是用来反位的,但 NOT 是把所有的位都反过来,而不能把指定的位反过来,所以这段数据,只需要把明文数据位异或8就是加密了,把密文数据再次位异或8又能恢复成明文,这就是位异或的最大好处,可以即方便又简单的来进行加密与恢复,这才是导致位异或在可逆算法中被应用最多的原因,上面的明文与密文用位与位或移位等都无法把全部明文都算成与密文完全相同的结果。位异或:

50、能把指定的位翻过来位与:都是1时才为1位或:都是0时才为0记住上面的规则.只要明白了如何算后,写算法的代码就好办了,在 CALL技术-07 的那节里的客户端发送的封包就是用了这种 XOR 的运算方式写的。封包加密解密-03前段在QQ上又有一会员问我能不能解密一段封包,当时给他解出来了,现在翻出了当时与他的聊天记录,整理一下写这篇教程,供大家学习学习,这里讲到的将都是些基础的入门的知识与经验心得。该网友当时发了这幅图片给我,说是他自已截的数据包记录下来的一点数据,问我这样的能不能解密?当时我粗略的看了一下最下面的两行 十六进制与文本数据,就回答他是一般的位运算,因为封包的加密与解密一般是离不开位

51、运算,判断依据是:一、每个字符对应一个十六进制值。 说明该封包在加解密过程中的长度应该与原文一致,不会因为加解密而变长或变短。二、不管 h 与 p 这两个字符在什么位置,它们始终对应 DC 与 C4 两值。 说明该封包在加解密过程中是以单一字节进行运算的,并且不会影响到下字节数据。虽然有了我的提示,但他还是没理解,还是不会,后来才知道原来他易语言都还是门外汉 。为了方便分析明文与密文之前的对应关系,我叫他拦截了一段封包数据明文:abcdABCD0123456789密文:D5 D6 D7 D0 F5 F6 F7 F0 84 85 86 87 80 81 82 83 8C 8D虽然知道算法里基本都

52、是用位运算的,但这里我还是想偷个懒,以为没准与加减法就能搞定。 当时简单的计算了明文a=97=0x61 密文 a=213=0xD5 差值=213-65=116.然后写了个简单的代码把每个字节都加上116。 代码运行后输出的数据:D5 D6 D7 D8 B5 B6 B7 B8 A4 A5 A6 A7 A8 A9 AA AB AC AD与之前正确的密文包对比发现错了,.abcd 中前三个字符是正确的,第四个d出错了,汗。看来加减法行不通,位运算才是王道!幸好是每单字节处理的,位运算范围不大,还是好计算的,为了算出用哪种位运算我又编了小段代码:代码运行后输出的数据: 位异或=180因为每个字节是八位

53、,数据范围是0-255,所以上面我用一个计次循环从0到255来进行运算,另外可用于位运算的函数还有其它几个,如左右移位,循环移位等,我这里只采样测试了位与()、位或()、位异或()、这三个,从输出的调试文本里,得到可以使用位异或(字节,180)进行加密数据 a。其实这里我们也可以用上节学的知识,转为二进制来查看出来的明文 abcd = 97,98,99,100= 01100001 01100010 01100011 01100100密文 D5 D6 D7 D0 = 213,214,215,208= 11010101 11010110 11010111 11010000仔细看这几个加密前与加密的

54、二进制,从右向左总是在第 3,5,6,8 四个位被翻过来的特征,那么按这四个位到底是啥值呢? 10110100 = 180 刚好是180。可以用计算器里的科学型来查看,或用模块里的二到十(10110100) 来计算. 用肉眼查起来有点累,所以像上面直接写小段代码,用1-255全进行测试一下就知道了.呵呵.那么对于其它的数据,是否也会正确无误呢?下面编写了一段完整的加密代码来测试:输出调试文本* D5 D6 D7 D0 F5 F6 F7 F0 84 85 86 87 80 81 82 83 8C 8D* abcdABCD0123456789这次加密的数据完全正确,不但加密正确,这段代码还能同时进

55、行解密,注意,如果只是单纯的位异或,是即可以加密也可以还原解密,所以在加解密里位异或用到的很多,除此之外就是移位与循环移位也用得很多.接下来总结一下经验:一,网络游戏的封包加密解密一般都是很简单的 原因是如果算法复杂的话,游戏客户端无所谓,但服务器网关若要同时处理几万个用户同时在线,并且数据量大的情况下,加解密又复杂就会处理不了,再好的服务器配置总不可能全部用来运算数据包吧,其中还要对数据库进行大量的处理呢,所以封包的加解密不会太复杂。二、每条封包中常常会有分隔符.分隔符一般都是明文的 例如某游戏中封包格式如 #xxxxxx!?使用#与!两个符号放在该包的第一与最后字节,起到分隔封包的目的,为什么要分隔封包呢?因为游戏中可能要发送的数据很多很频繁,常常会见到这种情况 在发了一条封包后马上又发了第二条封包.因为网络传输上的问题,最终第二条封包可能比第一条更快到目标

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论