使用信息熵判斷固件是否是同一廠商同一系列的產品具有較高的參考價值:
首先來看看D-Link路由器固件家族DIR-505和DAP-1320熵值分佈圖:
信息熵計算公式:
實際上計算固件的信息熵值的方式有兩種:
首先上代碼看看:
if use_zlib:
algorithm = gzip #gzip信息熵分析方法
else:
algorithm = shannon #Shannon香儂熵分析方法
def str2bytes(string):
'''
用於Python2和Python3字符串之間的交叉兼容性。
'''
if isinstance(string, type('')) and PY_MAJOR_VERSION > 2:
return bytes(string, 'latin1')
else:
return string
def gzip(self, data, truncate=True):
'''
基於zlib壓縮比進行信息熵分析。
這比shannon分析更快,但是不是很準確。
'''
# 求信息熵的方法:zlib壓縮大小/原始大小
e = float(float(len(zlib.compress(str2bytes(data), 9))) / float(len(data)))
if truncate and e > 1.0:
e = 1.0
return e
def shannon(self, data):
'''
對給定的數據塊執行香農熵分析。
'''
entropy = 0
if data:
length = len(data)
seen = dict(((chr(x), 0) for x in range(0, 256))) # ascii碼(含後128個擴展碼)
for byte in data:
seen[byte] += 1
for x in range(0, 256):
p_x = float(seen[chr(x)]) / length # 每個ascii字符佔總長度的比率
if p_x > 0:
entropy -= p_x * math.log(p_x, 2)
return (entropy / 8)
有兩種方法一種是gzip的計算方式,一種是香農熵公式。 gzip就是計算數據壓縮之後和壓縮之前的一個比值。shannon是根據香農公式進行的一個計算,對截取的數據段進行每個字符出現的次數計算其佔據總字符長度的一個比率。