在前面两篇文章中,这里介绍了URL编码和base64的一些知识点,本文将对网络中另外两个常见的传输编码方式chr以及hex编码进行介绍。
chr
chr跟URL以及base64编码不同之处在于,像URL以及base64是由专门的RFC文档进行定义和说明,而chr是没有的。chr本身确切的说是某种语言,例如python或者Php提供的一个功能函数。这个函数的作用是根据参数的数值(可能是十进制也可能是十六进制),返回对应的字符。如下图1是python中chr的执行情况:
图1
因此在python以及php等语言中,字符a可以用chr(0x61)这种等价的形式进行表示。将chr称之为编码,对于字符a做了一种变形变换,和编码表现的形式一致。在实际的网络传输中,经常会将传输的字符使用等价的chr形式进行传输,如下图2的形式:
图2
你可能会有疑问,当客户端使用chr这种表示形式进行传输的时候,服务端要想识别传输的内容,需要解码还原这些内容。如果从编解码的角度考虑,应该如此,毕竟对于URL以及base64都会提供对应的编解码函数。
但是前面也提到了chr是某种语言提供的一个功能函数,本质不是编码,那么也就不需要进行解码。事实上对于python以及php这种动态执行的语言来说,都有提供eval等函数对于字符串表达式进行解析。也就是说在eval函数中会自动将chr还原成为对应的字符然后进行解析,如下图3:
图3
可以看到对于eval来说,会自动解析字符串pow(2,2),并将该字符串当作表达式进行执行,得到结果4。同时将字符p使用char(112)进行替换会得到同样的结果,即字符串的内容会被当作表达式先执行,因此chr(112)会先被解释成为字符p。
正是因为动态语言的这种特性,因此在网络传输的过程中,会使用chr的形式,将传输的脚本内容进行转换。经过chr的变换,使得不容易第一眼看出传输内容要表达的意图,同时这也是网络混淆常见的手段之一。
由于人对于字符比值数字更加敏感,因此在文本中使用数字形式,不容易分辨内容的真实意图,同时图3中对于混淆又做了进一步,即使用了ord函数。在python中ord函数返回的是字符对应的ASCII码。因此通过chr和ord的结合,可以形成多层的混淆,使得一些设备,无法识别其真实的意图。
raw hex
可以看到将chr形式的数据直接传输,以达到简单的混淆。有的时候可以更简单写,直接传输字符对应ASCII的16进制字符,如下图4所示:
图4
上图4中使用了三种形式对于传输的代码进行处理,包括chr,base64以及raw hex。其中z2参数部分的内容直接使用字符对应的ASCII的16进制字符。这样无论是人还是程序都无法第一眼识别其含义。对于z2来说必须编写指定的解码程序来还原其内容,解码函数如下:
def hex_decode(raw_hex):
try:
temp = ""
for i in range(0, len(raw_hex), 2):
temp += chr(eval('0x' + raw_hex[i] + raw_hex[i + 1]))
return temp
except Exception as e:
return ""
在前面介绍了chr的功能,此处正好借助char进行raw hex的解码。
其实使用字符对应的十六进制的编码方式也被称之为base16,通过前面的文章,知道base64是以64个字符为基础的编码方式,那么base16就是以16个字符为基础的编码方式,即字符0-9,A-F,对应16进制的表示方式。因此对于raw hex也就是base16的编码方式可以直接使用python提供的函数进行解码,如下图5所示:
图5
其实除了base64以及base16,还有一些其他的编码方式,如base32等,下图6中是python中支持的若干种base形式的编码方式:
图6
知道了base64以及base16,理解起base32和base85就会很容易,即基础的字符集数量以及这些基础字符的编号不一样,整体算法是一致的,不在赘述。
本文介绍两种常见的数据传输转换形式,希望学习完本章节之后再见到网络种特殊的数据传输形式,能够知道如何还原这些数据内容。
本文为优快云村中少年原创文章,未经允许不得转载,博主链接这里。