收藏 分享(赏)

封包加密解密.docx

上传人:hyngb9260 文档编号:6798107 上传时间:2019-04-22 格式:DOCX 页数:61 大小:851.51KB
下载 相关 举报
封包加密解密.docx_第1页
第1页 / 共61页
封包加密解密.docx_第2页
第2页 / 共61页
封包加密解密.docx_第3页
第3页 / 共61页
封包加密解密.docx_第4页
第4页 / 共61页
封包加密解密.docx_第5页
第5页 / 共61页
点击查看更多>>
资源描述

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

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

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

4、 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 寄存器/内存地址, 寄存器/内存地址/立即数 受影响的标志位:

5、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 或 EA

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

7、MUL (Signed Integer Multiply Instruction)指令的格式:IMUL 寄存器/内存地址 该指令的功能是把显式操作数和隐含操作数相乘,所得的乘积按表 5.2的对应关系存放。IMUL寄存器, 立即数 其寄存器必须是 16位/32位通用寄存器,其计算方式为:寄存器 寄存器 立即数IMUL寄存器, 寄存器, 立即数 其寄存器只能是16位通用寄存器,其计算方式为:寄存器 1 寄存器 2 立即数 或 寄存器 1 内存地址立即数IMUL寄存器, 寄存器/内存地址 其寄存器必须是 16位/32 位通用寄存器,其计算方式为:寄存器 1 寄存器 1 寄存器 2 或寄存器 1 寄存

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

9、令的格式:DIV 寄存器/内存地址 指令的功能是用显式操作数去除隐含操作数(都作为无符号数),所得商和余数按下表的对应关系存放。指令对标志位的影响无定义。有符号数除法指令 IDIV (Signed Integer Divide Instruction)指令的格式:IDIV 寄存器/内存地址 受影响的标志位:AF、CF、OF、PF、SF 和 ZF指令的功能是用显式操作数去除隐含操作数(都作为有符号数),所得商和余数的对应关系见表。下面表除法指令除数、被除数、商和余数的对应关系除数位数 隐含的被除数 商 余数 举例8 位 AX AL AH DIV BH16 位 DX-AX AX DX DIV BX

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

11、、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无定义)指令的功能:是把

12、源操作数中的每位二进制与目的操作数中的相应二进制进行逻辑“或操作“,操作结果存入目标操作数中。例已知(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 寄存器/内

13、存地址 其功能:是把操作数中的每位变反,即:10,01。指令的执行不影响任何标志位。例已知(AL)=46H,执行指令“NOT AL”后,AL 的值是什么?解:执行该指令后,(AL)=0B9H。该指令只是把二进制位反过来而已汇编 NOT 指令等于易语言里的 位取反() 和 模块里的 NOT_() .4、逻辑异或操作指令 XOR(Exclusive OR Instruction)指令的格式:XOR 寄存器/内存地址, 寄存器/内存地址/立即数 受影响的标志位:CF(0)、OF(0)、PF、SF 和 ZF(AF无定义)指令的功能:是把源操作数中的每位二进制与目的操作数中的相应二进制进行逻辑“异或操作

14、“,操作结果存入目标操作数中。例已知(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_() .五、移位操作指令移位操作指令是一组经常使用的指令,它包括算术移位、逻辑移位、双精度移位、循环移位和带进位的循环移位等

15、五大类。移位指令都有指定移动二进制位数的操作数,该操作数可以是立即数或 CL的值。在 8086中,该立即数只能为 1 ,但在其后的 CPU 中,该立即数可以是 131 之内的数。1 、算术移位指令算术移位指令有:算术左移 SAL (Shift Algebraic Left)和算术右移 SAR (Shift Algebraic Right)。它们的指令格式如下:SAL/SAR 寄存器/内存地址, CL/立即数受影响的标志位:CF、OF、PF、SF 和 ZF(AF无定义)。算术移位指令的功能描述如下,具体功能下图(a)、(b)所示。算术左移 SAL 把目的操作数的低位向高位移,空出的低位补 0;

16、算术右移 SAR 把目的操作数的高位向低位移,空出的高位用最高位(符号位)填补。例已知(AH)=12H,(BL)=0A9H,试给出分别用算术左移和右移指令移动 1位后,寄存器 AH和 BL的内容。解:用算术左移和右移指令移动 1位后,寄存器 AH和 BL的结果如下表所示。操作数的初值 执行的指令 执行后操作数的内容(AH)=12H=10010B SAL AH, 1 (AH)=24H=100100B(BL)=0A9H=10101001B SAL BL, 1 (BL)=52H=1010010B(AH)=12H=10010B SAR AH, 1 (AH)=09H=1001B(BL)=0A9H=101

17、01001B SAR BL, 1 (BL)=0D4H=11010100B汇编指令 SAL 指令等于易语言里的 左移() 和 模块里的 SAL_() SHL_().汇编指令 SAR 指令在易语言里无对应函数 等于模块里的 SAR_() 函数.但要注意模块里的 SAR_() 是以 32位整数型来运算的,只等于汇编里的 SAR eax,1 这类的 32位寄存器的运行结果,若想以 16位或 8位来运算,需要先把符号位扩展到 32位后再处理.2、逻辑移位指令此组指令有:逻辑左移 SHL (Shift Logical Left)和逻辑右移 SHR (Shift Logical Right)。它们的指令格式

18、如下:SHL/SHR 寄存器/内存地址, CL/立即数受影响的标志位:CF、OF、PF、SF 和 ZF(AF无定义)。逻辑左移/右移指令只有它们的移位方向不同,移位后空出的位都补 0 。它们的具体功能下图(a)、(b)所示。例已知(AH)=12H,(BL)=0A9H,试给出分别用逻辑左移和右移指令移动 1位后,寄存器 AH和 BL的内容。解:用算术左移和右移指令移动 1位后,寄存器 AH和 BL的结果如下表所示。操作数的初值 执行的指令 执行后操作数的内容(AH)=12H=10010B SHL AH, 1 (AH)=24H=100100B(BL)=0A9H=10101001B SHL BL,

19、1 (BL)=52H=1010010B(AH)=12H=10010B SHR AH, 1 (AH)=09H=1001B(BL)=0A9H=10101001B SHR BL, 1 (BL)=54H=1010100B汇编 SHL 指令等于易语言里的 左移() 和模块里的 SHL_() SAL_().汇编 SHR 指令等于易语言里的 右移() 和模块里的 SHR_().3、双精度移位指令此组指令有:双精度左移 SHLD(Shift Left Double)和双精度右移SHRD(Shift Right Double)。它们都是具有三个操作数的指令,其指令的格式如下:SHLD/SHRD 寄存器/内存地址

20、, 寄存器, CL/立即数 ;80386+其中:第一操作数是一个 16位/32 位的寄存器或存储单元;第二操作数(与前者具有相同位数)一定是寄存器;第三操作数是移动的位数,它可由 CL或一个立即数来确定。在执行 SHLD指令时,第一操作数向左移 n位,其“空出”的低位由第二操作数的高 n位来填补,但第二操作数自己不移动、不改变。在执行 SHRD指令时,第一操作数向右移 n位,其“空出”的高位由第二操作数的低 n位来填补,但第二操作数自己也不移动、不改变。SHLD和 SHRD指令的移位功能示意图如下图所示。受影响的标志位:CF、OF、PF、SF 和 ZF(AF无定义)下面是几个双精度移位的例子及

21、其执行结果。双精度移位指令 指令操作数的初值 指令执行后的结果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汇编 SHLD 与 SHRD 在易语言里暂无对应的函数,2.5 模块里也没加上这两个函数.4、循环移位指令循环移位指令有:循环左移 ROL (Rotate Lef

22、t)和循环右移 ROR (Rotate Right)。指令的格式:ROL/ROR 寄存器/内存地址, CL/立即数受影响的标志位:CF 和 OF循环左移/右移指令只是移位方向不同,它们移出的位不仅要进入CF,而且还要填补空出的位。具体功能如下图(a)、(b)所示。下面是几个循环移位的例子及其执行结果。循环移位指令 指令操作数的初值 指令执行后的结果ROL AX, 1 (AX)=6789H=110011110001001B (AX)=0CF12H=1100111100010010BROL AX, 3 (AX)=6789H=110011110001001B (AX)=3C4BH=111100010

23、01011BROR AX, 2 (AX)=6789H=110011110001001B (AX)=59E2H=101100111100010BROR AX, 4 (AX)=6789H=110011110001001B (AX)=9678H=1001011001111000B汇编 ROL 在易语言里无对应函数,模块里提供了 ROL_().汇编 ROR 在易语言里无对应函数,模块里提供了 ROR_().5、带进位的循环移位指令带进位的循环移位指令有:带进位的循环左移 RCL (Rotate Left Through Carry)和带进位的循环右移 RCR (Rotate Right)。指令的格式:

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

25、AX, 2 CF=0,(AX)=0ABCDH=1010101111001101B (AX)=AAF3H=1010101011110011BRCR AX, 2 CF=1,(AX)=0ABCDH=1010101111001101B (AX)=EAF3H=1110101011110011B汇编 RCL 在易语言里无对应函数,模块里提供了 RCL_().汇编 RCR 在易语言里无对应函数,模块里提供了 RCR_().本文重新介绍了这些将在封包算法里将常用到的汇编指令,大家要尽量记住这些指令的运算方式。最多被用到的指令主要有 XOR-位异或 ,ROL-左循环移位 ,ROR-右循环移位 ,AND-位与 ,

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

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

28、对应就能简单的分析出来相应的明文文本对应被加密后的封包中哪些数据。下面先来介绍些入门知识开一个 IE浏览器,打开百度网站 在搜索框输入 42724920 后运行 WPE软件,选择 IE的进程,点击顺三角按钮开始拦截封包.在百度里点搜索,会被 WPE拦载下数据包,点击黑方框的停止按钮,就可以查看被拦截下来的那些数据包了。找到与 IE地址栏里显示的那条封包数据 GET /s?wd=42724920 这条,在 WPE的菜单-文件-另存为-文本文件 保存封包数据文本,下面就是这条封包数据:16 192.168.1.10 220.181.6.19 429(size) Send(发送)0000 47 4

29、5 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.1Acc0020 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, imag0040 65 2F 70 6A 70 65 67 2C 20 69 6

30、D 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 2E 6D 73 2D 65 78 63 65 6C 2C 20 2A /vnd.ms

31、-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 73 65 72 age: zh-cnUser00D0 2D 41 67 65 6E 74

32、 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; Tride0110 6E 74 2F 34 2E 30 29 0D 0A 41 63 63 65 70

33、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 deflateHost: 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 65 70 2D 41 nnection: Keep-A0160 6C 69 76 65 0D 0

34、A 43 6F 6F 6B 69 65 3A 20 42 41 liveCookie: 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; BD_01A0 55 54 4B 5F 44 56 54 3D 31 0D 0A 0D 0A UTK

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

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

37、块里的十六进制到字节集() 就能转换过来了。字节集封包=十六进制到字节集(“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 192.168.1.10 220.181.6.19 445 Send0000 47 45 54 20 2F 73 3F 77 64 3D 25 43 44 25 45 32 G

38、ET /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.1Acc0030 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/jpeg, imag0050 65 2F 70 6A 70 65 67 2C 20 6

39、9 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 2E 6D 73 2D 65 78 63 65 6C 2C 20 2A /vnd

40、.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 73 65 72 age: zh-cnUser00E0 2D 41 67 65 6E

41、 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; Tride0120 6E 74 2F 34 2E 30 29 0D 0A 41 63 63 65

42、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 deflateHost: 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 65 70 2D 41 nnection: Keep-A0170 6C 69 76 65 0

43、D 0A 43 6F 6F 6B 69 65 3A 20 42 41 liveCookie: 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; BD_01B0 55 54 4B 5F 44 56 54 3D 31 0D 0A 0D 0A

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

45、7 F7 B7 BB 正好八对,外挂作坊四个字刚好也是 8字节的长度,即然怀疑他看起来像是被转十六进制的,咱只需要试试看就知道了。输入调试文本 (字节集到十六进制 (到字节集 (“外挂作坊”), “ ”)输出调试文本 (到文本 (十六进制到字节集 (“CD E2 B9 D2 D7 F7 B7 BB”, “ ”)* CD E2 B9 D2 D7 F7 B7 BB* 外挂作坊测试结果真是这样的,由此可见网页的 URL中若含有一些特殊字符或中文等时,需要转为十六进制文本,对于转为十六进制后的数据还加上 % 百分号,来说明后面的是 16进制数据。上面介绍了用 WPE截包,说了封包应该是十进制的字节集格

46、式,但为了工整显示,所以用十六进制来输出,并且还提供了字符串供参考,但字符串是无法正确显示一些特殊字符的,下面再介绍一点基础知识,这是前段时间有一个会员向我求助时的记录,以此为例:这个会员遇到了这个问题,明文文本 218.60.134.170 被加密成了 3A3930263E3826393B3C26393F38 加密后的文本数据咋看都像是 16进制的处理,但是不对.因为若把这段明文转成真正的十六进制,与被加密的十六进制总是有 8的相差结果.于是他便顺理成章的认为这只是在不同的时候采用+或-进行运算后再转为十六进制的。老实说,他的想法确实没错.但这似乎不好控制,得知道一个值在多少或啥条件时才会用

47、加还是用减呢?或许可以试试用别的方式来计算看看。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 这个规律,可以肯定这个算法方式是按一个固定的方法来运算的,并且是一个一个字节来处理.第一个字节的运算结果不会影响到第二字节的处理,下面我们把这一切都转为十进制字节集来再分析。输出调试文本 (字节集到十进制 (到字节集 (“218.60.134.170”), “,”)输出调试文本 (字节集到十进制 (十六进制到字节集 (“3A 39 30 2

48、6 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 00111000 00101110 00110110 00110000 001011

49、10 00110001 00110011 00110100 00101110 00110001 00110111 00110000密文=00111010 00111001 00110000 00100110 00111110 00111000 00100110 00111001 00111011 00111100 00100110 00111001 00111111 001110008=00111010 因为明文跟密文之间总是相差 8,所以我们要重点看看这两段的二进制里与 8倒底有什么关系。在前一节教材里说位运算里最多会被用到的一般都是 XOR 位异或,看看上面的明文与密文间的第四位的结果,只要明文第四位=8 加密后该位就变成 0了,若明文第四位=0 则加密后就成 1了,看起来只是把第四位进行简单的反过来而已,而 XOR 则正好符合这种反位的结果,当然 NOT位取反也是用来反位的,但 NOT 是把所有的位都反过来,而不能把指定的位反过来,所以这段数据,只需要把明文数据位异或 8就是加密了,把密文数据再次位异或 8又能恢复成明文,这就是位异或的最大好处,可以即方便

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报