封包加密解密

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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无定义)
指令的功能是把显式操作数和隐含操作数(都作为无符号数)相乘,所得的乘积按下表的对应关系存放。

有符号数乘法指令 IMUL (Signed Integer Multiply Instruction) 指令的格式: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无定义) 在指令格式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
指令的功能是用显式操作数去除隐含操作数(都作为有符号数),所得商和余数的对应关系见表。

下面表除法指令除数、被除数、商和余数的对应关系
四、逻辑运算指令
逻辑运算指令是另一组重要的指令,它包括:逻辑与( 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_() .
五、移位操作指令
移位操作指令是一组经常使用的指令,它包括算术移位、逻辑移位、双精度移位、循环移位和带进位的循环移位等五大类。

移位指令都有指定移动二进制位数的操作数,该操作数可以是立即数或CL的值。

在8086中,该立即数只能为 1 ,但在其后的 CPU 中,该立即数可以是 1··31 之内的数。

1 、算术移位指令
算术移位指令有:算术左移 SAL (Shift Algebraic Left)和算术右移 SAR (Shift 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的结果如下表所示。

汇编指令 SAL 指令等于易语言里的左移() 和模块里的 SAL_() SHL_().
汇编指令 SAR 指令在易语言里无对应函数等于模块里的 SAR_() 函数.
但要注意模块里的 SAR_() 是以32位整数型来运算的,只等于汇编里的 SAR eax,1 这类的32位寄存器的运行结果,若想以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的内容。

解:用算术左移和右移指令移动1位后,寄存器AH和BL的结果如
下表所示。

汇编SHL 指令等于易语言里的左移() 和模块里的SHL_() SAL_().
汇编 SHR 指令等于易语言里的右移() 和模块里的 SHR_().
3、双精度移位指令
此组指令有:双精度左移SHLD(Shift Left Double)和双精度右移SHRD(Shift Right Double)。

它们都是具有三个操作数的指令,其指令的格式如下:
SHLD/SHRD 寄存器/内存地址, 寄存器, CL/立即数;80386+
其中:第一操作数是一个16位/32位的寄存器或存储单元;第二操作数(与前者具有相同位数)一定是寄存器;第三操作数是移动的位数,它可由CL或一个立即数来确定。

在执行SHLD指令时,第一操作数向左移n位,其“空出”的低位由第二操作数的高n位来填补,但第二操作数自己不移动、不改变。

在执行SHRD指令时,第一操作数向右移n位,其“空出”的高位由第二操作数的低n位来填补,但第二操作数自己也不移动、不改变。

SHLD和SHRD指令的移位功能示意图如下图所示。

受影响的标志位:CF、OF、PF、SF和ZF(AF无定义)
下面是几个双精度移位的例子及其执行结果。

汇编 SHLD 与 SHRD 在易语言里暂无对应的函数,2.5模块里也没加上这两个函数.
4、循环移位指令
循环移位指令有:循环左移 ROL (Rotate Left)和循环右移 ROR (Rotate Right)。

指令的格式:ROL/ROR 寄存器/内存地址, CL/立即数
受影响的标志位:CF和OF
循环左移/右移指令只是移位方向不同,它们移出的位不仅要进入CF,而且还要填补空出的位。

具体功能如下图(a)、(b)所示。

下面是几个循环移位的例子及其执行结果。

汇编 ROL 在易语言里无对应函数,模块里提供了 ROL_().
汇编 ROR 在易语言里无对应函数,模块里提供了 ROR_().
5、带进位的循环移位指令
带进位的循环移位指令有:带进位的循环左移 RCL (Rotate Left Through Carry)和带进位的循环右移 RCR (Rotate Right)。

指令的格式:RCL/RCR 寄存器/内存地址, CL/立即数
受影响的标志位:CF和OF
带进位的循环左移/右移指令只有移位的方向不同,它们都用原CF 的值填补空出的位,移出的位再进入CF。

具体功能如下图(a)、(b)所示。

下面是几个带进位循环移位的例子及其执行结果。

汇编 RCL 在易语言里无对应函数,模块里提供了 RCL_().
汇编 RCR 在易语言里无对应函数,模块里提供了 RCR_().
本文重新介绍了这些将在封包算法里将常用到的汇编指令,大家要尽量记住这些指令的运算方式。

最多被用到的指令主要有 XOR-位异或 ,ROL-左循环移位 ,ROR-右循环移位 ,AND-位与 ,OR-位或 ,SHL-左
移 ,SHR-右移 ,NOT-位取反。

其它加减乘除,算术移位等用到的机率很少。

有些算法指令在易语言里也有对应的函数,或者模块里也有提供了这些功能,不过需要注意的是目前2.5模块里提供的这几个功能是按32位运算的,大家在使用时要注意,有关相应的8位与16位运算的函数下版时会增加上去。

封包加密解密-02
前面我们介绍了最常会被用在封包加密解密算法中的指令,本节开始教大家些入门的知识,如何去分析封包数据。

分析封包数据主要分两方面:
一、用肉眼看,再动手写代码测试,对于简单算法的封包还是容易搞定的。

二、动态调试,对于复杂算法的封包就只能这样才能跟踪分析出他的算法。

本章教材会全部都讲解到,当然先介绍第一方式,用肉眼来看,这可是件辛苦的事哟,大家准备好防辐射的眼镜与眼药水吧.可千万别用眼过度,要记得多做做眼保健操哦。

要想用肉眼分析封包,就得要有被加密前的明文内容,与被加密后的封包数据.只有这样才能用眼来看,来分析。

如果你只有一段密文而没有对应的明文,就只能扯蛋了。

对于获取加密后的封包很简单,大家完全可以自已用模块里的截包功能来编写个工具出来,也可以找一些现成的封包拦截工具来用,例如老牌的WPE这个软件。

明文包又如何得到呢?比如说我们在游戏里要发言一段文本内容,同时拦截下这段发出的封包,就可以肯定这条包里有包含着某些文本内容了。

只需要多截几条不同文本的聊天封包,进行对应就能简单的分析出来相应的明文文本对应被加密后的封包中哪些数据。

下面先来介绍些入门知识
开一个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 45 54 20 2F 73 3F 77 64 3D 34 32 37 32 34 39 GET /s?wd=427249
0010 32 30 20 48 54 54 50 2F 31 2E 31 0D 0A 41 63 63 20 HTTP/1.1..Acc
0020 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, imag
0040 65 2F 70 6A 70 65 67 2C 20 69 6D 61 67 65 2F 70 e/pjpeg, image/p
0050 6A 70 65 67 2C 20 61 70 70 6C 69 63 61 74 69 6F jpeg, applicatio
0060 6E 2F 78 2D 73 68 6F 63 6B 77 61 76 65 2D 66 6C n/x-shockwave-fl
0070 61 73 68 2C 20 61 70 70 6C 69 63 61 74 69 6F 6E ash, application
0080 2F 76 6E 64 2E 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: htt
00A0 70 3A 2F 2F 77 77 77 2E 62 61 69 64 75 2E 63 6F p://www.baidu.co
00B0 6D 2F 0D 0A 41 63 63 65 70 74 2D 4C 61 6E 67 75 m/..Accept-Langu
00C0 61 67 65 3A 20 7A 68 2D 63 6E 0D 0A 55 73 65 72 age: er
00D0 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; Windo
0100 77 73 20 4E 54 20 35 2E 31 3B 20 54 72 69 64 65 ws NT 5.1; Tride
0110 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: w
0140 77 77 2E 62 61 69 64 75 2E 63 6F 6D 0D 0A 43 6F ..Co
0150 6E 6E 65 63 74 69 6F 6E 3A 20 4B 65 65 70 2D 41 nnection: Keep-A
0160 6C 69 76 65 0D 0A 43 6F 6F 6B 69 65 3A 20 42 41 live..Cookie: BA
0170 49 44 55 49 44 3D 42 42 35 46 34 46 39 43 34 35 IDUID=BB5F4F9C45
0180 34 31 38 30 43 35 33 31 31 44 35 38 44 45 43 45 4180C5311D58DECE
0190 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 0A0D 0A UTK_DVT=1....
在WPE里拦截下来的封包,左中右分三列,第一列无意义,第二列是封包数据的十六进制文本,第三列是字符串文本。

很多新人总爱抓着第三列的文本数据不放,事实上我要严肃的告诉你,第三列的文本数据,如果是明文的情况下可以做为参考用,否则第三列数据是没有多少意义的,为什么呢?因为第三列只能显示可视的字符,对于非可视的字符统统用 "." 这个点号来表示,这对于我们要进行解密封包是没有作用的,例如图上的红色十六进制数据 0D 0A 正是文本里的换行符号,在第三列中无法显示换行,全用点号来代表了。

封包的正文就是这些十六进制的文本数据了,但你也不能抓着十六进制就不放了,要知道,封包都应该用十进制的字节集来表示,但由于十进制从0到255间小则一个字,多则三个字,如果直接显示就会一团糟,所以绝大多数的截包类软件,都会把封包数据在三个字符的十六进制来显示,这样就能工工整整的排列起来了。

于是你恍然大悟,原来只要把这段十六进制的数据解密就行了哇!但我要提醒你又透逗了一次,这段十六进制的封包根本就不需要解密,分析封包的最终结果不就是我们得编写与封包有关的功能吗?在截包功能里截到的就是字节集数据,不是十六进制的,如果是明文的话直接用到文本(字节集封包) 就能显示出来了,所以用WPE截下的包,顶多只是把十六进制转回成十进制的字节集即可,这个过程算不上加密解密。

所以像上面的十六进制的封包数据,只需要用模
块里的十六进制到字节集() 就能转换过来了。

字节集封包=十六进制到字节集("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 Send
0000 47 45 54 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..Acc
0030 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, imag
0050 65 2F 70 6A 70 65 67 2C 20 69 6D 61 67 65 2F 70 e/pjpeg, image/p
0060 6A 70 65 67 2C 20 61 70 70 6C 69 63 61 74 69 6F jpeg, applicatio
0070 6E 2F 78 2D 73 68 6F 63 6B 77 61 76 65 2D 66 6C n/x-shockwave-fl
0080 61 73 68 2C 20 61 70 70 6C 69 63 61 74 69 6F 6E ash, application
0090 2F 76 6E 64 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: htt
00B0 70 3A 2F 2F 77 77 77 2E 62 61 69 64 75 2E 63 6F p://www.baidu.co
00C0 6D 2F 0D 0A 41 63 63 65 70 74 2D 4C 61 6E 67 75 m/..Accept-Langu
00D0 61 67 65 3A 20 7A 68 2D 63 6E 0D 0A 55 73 65 72 age: er
00E0 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; Windo
0110 77 73 20 4E 54 20 35 2E 31 3B 20 54 72 69 64 65 ws NT 5.1; Tride
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: w
0150 77 77 2E 62 61 69 64 75 2E 63 6F 6D 0D 0A 43 6F ..Co
0160 6E 6E 65 63 74 69 6F 6E 3A 20 4B 65 65 70 2D 41 nnection: Keep-A
0170 6C 69 76 65 0D 0A 43 6F 6F 6B 69 65 3A 20 42 41 live..Cookie: BA
0180 49 44 55 49 44 3D 42 42 35 46 34 46 39 43 34 35 IDUID=BB5F4F9C45
0190 34 31 38 30 43 35 33 31 31 44 35 38 44 45 43 45 4180C5311D58DECE
01A0 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 UTK_DVT=1....
通过前一次的包我们知道在 GET /s?wd= 后面的内容是我们输入在百度搜索框中的文本,但这条包里的结果却不一样,明明我们输入的是
“外挂作坊”但这里居然是�����也不知道是什么的玩意,所以可以肯定,原明文内容“外挂作坊”被某种算法给编码处理过了,因为算法简单所以称为编码,复杂的叫加密,好像没人这么明确的定义过吧,不管他叫编码还是叫加密都无所谓了,重要的是我们如何自已也能写出来这样的算法。

尽管之前说过,要分析封包还是得用那段十六进制的数据,但这里的第三列字符串文本内容仍然极据参考意义,看这段被处理过的红色文本内容,感觉像是十六进制的格式.去掉%分号就是 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中若含有一些特殊字符或中文等时,需要转为十六进制文本,对于转为十六进制后的数据还加上 % 百分号,来说明后面的是16进制数据。

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

老实说,他的想法确实没错.但这似乎不好控制,得知道一个值在多少或啥条件时才会用加还是用减呢?或许可以试试用别的方式来计算看看。

2 1 8 . 6 0 . 1
3
4 . 1 7 0
3A 39 30 26 3E 38 26 39 3B 3C 26 39 3F 38
通过上面的明文与密文对应的关系来看,明文字符 "1" 总是等于 0x39 这个规律,可以肯定这个算法方式是按一个固定的方法来运算的,并且是一个一个字节来处理.第一个字节的运算结果不会影响到第二字节的处
理,下面我们把这一切都转为十进制字节集来再分析。

输出调试文本 (字节集到十进制 (到字节集 (“218.60.134.170”), “,”))
输出调试文本 (字节集到十进制 (十六进制到字节集 (“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 00111000 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倒底有什么关系。

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

位异或:能把指定的位翻过来
位与:都是1时才为1
位或:都是0时才为0
记住上面的规则..
只要明白了如何算后,写算法的代码就好办了,在 CALL技术-07 的那节里的客户端发送的封包就是用了这种 XOR 的运算方式写的。

封包加密解密-03
前段在QQ上又有一会员问我能不能解密一段封包,当时给他解出来了,现在翻出了当时与他的聊天记录,整理一下写这篇教程,供大家学习学习,这里讲到的将都是些基础的入门的知识与经验心得。

该网友当时发了这幅图片给我,说是他自已截的数据包记录下来的一点数据,问我这样的能不能解密?当时我粗略的看了一下最下面的两行十六进制与文本数据,就回答他是一般的位运算,因为封包的加密与解密一般是离不开位运算,判断依据是:
一、每个字符对应一个十六进制值。

说明该封包在加解密过程中的长度应该与原文一致,不会因为加解密而变长或变短。

二、不管 h 与 p 这两个字符在什么位置,它们始终对应 DC 与 C4 两值。

说明该封包在加解密过程中是以单一字节进行运算的,并且不会影响到下字节数据。

虽然有了我的提示,但他还是没理解,还是不会,后来才知道原来他易语言都还是门外汉。

为了方便分析明文与密文之前的对应关系,我叫他拦截了一段封包数据
明文:abcdABCD0123456789
密文:D5 D6 D7 D0 F5 F6 F7 F0 84 85 86 87 80 81 82 83 8C 8D 虽然知道算法里基本都是用位运算的,但这里我还是想偷个懒,以为没准与加减法就能搞定。

当时简单的计算了明文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出错了,汗。

看来加减法行不通,位运算才是王道
幸好是每单字节处理的,位运算范围不大,还是好计算的,为了算出用哪。

相关文档
最新文档