#1 楼
它具有称为熵的功能。我想知道它的用途吗?
出于我们的目的,熵可以作为信息密度或信息随机性的度量,这使得它在
压缩和加密的数据具有比例如更高的熵代码或文本数据。实际上,压缩和加密的数据具有接近最大可能的熵水平,可以将其用作启发式识别,以区别于未压缩/未加密的数据。
逆向工程中的示例使用案例:
恶意软件分析-如果我们有一个可执行文件,其标头可以成功解析,并且程序可以正常加载和运行,但总体文件的熵级别很高,并且无法静态分析代码,因为文件头和程序头之外的数据看起来是随机的(因此熵很高),这可能意味着可执行文件实际上是在磁盘上压缩的,在运行时解压缩。可执行的压缩使分析变得复杂,因此它是为犯罪目的而开发的程序的相对常见的功能。如果要分析代码,则需要以某种方式恢复其解压缩形式。
固件分析-在具有相对严格的硬件限制的系统(例如嵌入式系统)中,通常以压缩形式提供固件更新,以节省空间。为了分析固件,首先需要确定它是加密的还是压缩的。一种确定方法是通过对文件进行熵分析。如果熵很高,则表明文件确实已压缩或加密是一个好兆头。要继续分析实际固件,必须先对其进行解压缩/解密。如果我们有一个熵很高的数据块(即接近随机数),则将其视为代码并反汇编它是没有意义的,因为结果将毫无意义。
文件类型识别-可以根据文件的整体熵来识别某些文件类型。例如,我们通常可以区分图像文件(png,jpeg等)和已编译的二进制文件(ELF,PE),因为图像文件由压缩数据组成,因此(通常)比已编译的二进制文件具有更高的熵。
除了“轻松检测”外,诸如
binwalk
,ent
和binvis.io之类的工具还可以帮助计算文件熵。您也可以构建自己的工具来执行此操作。 #2 楼
熵被解释为无序度或随机性高熵意味着高度无序的数据集
低熵意味着高度有序的数据集
处理评论
这里的顺序并不意味着遵循“ a”类顺序的“ a”,它应被解释为某些数据的随机/非随机状态
aaaabbbbccccdddd或“ abcdabcdabcdabcd”或“ adbcadbcadbcadbc”是一个重复字符串,其熵将大于aaaaaaaaaabbbbcccd或第一个字符串中该字符串
的任何混排表示形式,并且其混排的克隆都具有4个字符,概率均等4/16或1/4或25%
,但在第二个字符串char'a'(8/16)或数据集的一半具有最高概率
,而'c'(1/16)则具有最小概率或极小的概率
熵是一种热力学概念,被引入数字科学(信息论)中,作为计算一组数据的随机性的一种手段a是
简单地将最高的压缩数据具有最高的熵
,其中所有255个可能的字节将具有相等的频率
即0x00在一个Blob中被看到10次
0x10或0x80或0xff将在同一个Blob中被看到10次
,即该Blob将是一个重复序列,其中包括0x0之间的所有字节..0xff
,而低熵Blob将具有一个重复序列,该序列仅包含某个字节(如0x00 0r 0x55或两个字节0x0d0a ox222e等)或任何少于255个可能字节序列的任何序列>
从此处取一个算法并对其进行一些修改
import math
from collections import Counter
base = {
'shannon' : 2.,
'natural' : math.exp(1),
'hartley' : 10.,
'somrand' : 256.
}
def eta(data, unit):
if len(data) <= 1:
return 0
counts = Counter()
for d in data:
counts[d] += 1
ent = 0
probs = [float(c) / len(data) for c in counts.values()]
for p in probs:
if p > 0.:
ent -= p * math.log(p, base[unit])
return ent
hes = "abcde\x80\x90\xff\xfe\xde"
les = "aaaaa\x61\x61\x61\x61\x61"
print ("=======================================================================================================")
print (" type ent for hes hes ent for les les")
print ("=======================================================================================================")
for i in base:
for j in range(1,4,1):
print (i ,' ', eta( j*hes,i) , '\t', (hes*j + (30 -j *10) *" " ) , ' ' , eta (j*les , i) ,'\t', ("%s" % les*j ))
您会看到'abcde \ x80 .....'是高熵,而' aaaaa \ x61 ...'是低熵
:\>python foo.py
=======================================================================================================
type ent for hes hes ent for les les
=======================================================================================================
shannon 3.321928094887362 abcdeÿþÞ 0.0 aaaaaaaaaa
shannon 3.321928094887362 abcdeÿþÞabcdeÿþÞ 0.0 aaaaaaaaaaaaaaaaaaaa
shannon 3.321928094887362 abcdeÿþÞabcdeÿþÞabcdeÿþÞ 0.0 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
natural 2.3025850929940455 abcdeÿþÞ 0.0 aaaaaaaaaa
natural 2.3025850929940455 abcdeÿþÞabcdeÿþÞ 0.0 aaaaaaaaaaaaaaaaaaaa
natural 2.3025850929940455 abcdeÿþÞabcdeÿþÞabcdeÿþÞ 0.0 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
hartley 0.9999999999999998 abcdeÿþÞ 0.0 aaaaaaaaaa
hartley 0.9999999999999998 abcdeÿþÞabcdeÿþÞ 0.0 aaaaaaaaaaaaaaaaaaaa
hartley 0.9999999999999998 abcdeÿþÞabcdeÿþÞabcdeÿþÞ 0.0 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
somrand 0.4152410118609203 abcdeÿþÞ 0.0 aaaaaaaaaa
somrand 0.4152410118609203 abcdeÿþÞabcdeÿþÞ 0.0 aaaaaaaaaaaaaaaaaaaa
somrand 0.4152410118609203 abcdeÿþÞabcdeÿþÞabcdeÿþÞ 0.0 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
#3 楼
只需在@blabb和@Johann Aydinbas答案中添加(少量)信息,以下是实用恶意软件分析书中关于您的问题的引用:也可以通过以下方式检测打包的可执行文件一种称为熵
计算的技术。熵是对系统或程序混乱的一种度量。压缩或加密的数据更类似于随机数据,因此具有较高的熵。daccess-ods.un.org daccess-ods.un.org未经加密或压缩的可执行文件的熵较低。用于检测打包程序的自动化工具通常会使用诸如熵之类的启发式方法。
#4 楼
香农的熵来自信息论。它是文本随机程度的度量。如果字符串具有更大的香农熵,则表示它是一个强密码。原则上,香农熵方程式提供了一种基于符号频率来预测对符号串进行编码所需的平均最小位数的方法。请注意,基数表示可能的字符数。基座2可以替换为任何基座。从该代码中可以看到它被255替换。
此链接具有用于计算小说和宗教书籍的熵的算法的最简单实现。它告诉了我们很多。例如,所有人类产生的书籍之间的混乱程度几乎相同。这是数据的一个很好的功能。
这是上面提到的代码的链接。
不同书籍的信息熵
#5 楼
首先,您必须知道熵一词是指两个不同的概念,如果您三思而后行,它们在某种程度上是相关的,但是由于乍一看确实不那么明显,因此您应该将这两个概念视为不同的概念。 br />定义熵?您想知道的熵可以定义为热力学系统中的有序,无序或混乱的数量。
另一方面,另一个熵即将来临从信息论出发,可以看作是衡量系统中可以存储的信息量的一种方法。
为什么在RE中它有用呢?用于检测文件中接近随机数据的部分。它将允许检测已加密/压缩的部分以及似乎未被触及的部分。
实际上,数据高度混乱正是加密数据时要实现的目标。而且,我告诉您,两个熵定义是相关的,如果您将大量信息存储在最小字节中,则似乎混乱程度很高,因此压缩也是如此...
这就是为什么我们使用文件的熵图,能够在没有文件格式的任何先验信息的情况下将原始零件与加密/压缩的子零件区分开。
示例
例如,这是该工具的熵图
binwalk
来自另一个问题,来自这里:直接从这张图中我们可以看到,第一部分似乎是原始的(如果看曲线的形状,可能是asm操作码)然后是一个很有可能被加密的部分(压缩通常不会以这种规律性达到1的熵),最后填充总是相同的字节(例如
0x00
或0xff
)。评论
“您想知道的熵可以定义为热力学系统中的有序,无序或混乱的数量。” <-这是一个错误的陈述。软件不是热力学系统,不具有“能量”(热量)属性。软件由编码信息组成,因此要测量其属性(例如其香农熵),信息理论提供的工具是合适的。
– julian♦
19年6月27日在12:02
如果您不相信我,请检查您帖子中用于生成熵图的代码。 Binwalk根据zlib压缩率或Shannon熵计算信息熵级别。
– julian♦
19-6-27在12:05
“如果您考虑信息论,那么您对熵的定义是完全正确的。但是,不幸的是,这里提到的熵很可能来自热力学(即无序度)。” <-含义似乎很清楚。
– julian♦
19年6月27日在13:14
没什么私人的。只是不正确。
– julian♦
19年6月27日在16:08
它看起来很私人,只是您以这种方式骚扰我。
–恐怖
19-6-27在16:09
评论
“高熵意味着高度混乱的数据集,低熵意味着高度有序的数据集” <-这是一个错误的陈述。顺序无关紧要,因为熵是在分布上计算的,其中该分布中的每个值都有与之相关的概率。压缩和加密的数据具有较高的熵,因为与分布中每个字节值关联的概率大致相等(数据中字节值的分布接近均匀),而不是因为字节值出现在字节流中的顺序不同。
– julian♦
19年6月27日在13:09
“其中所有255个可能的字节将具有相等的频率” <-您可能是说“其中0和255之间的所有字节值(总共256个)在总体分布中具有相等的概率”(每个字节值的频率在0-255之间在分配中是相同的)。
– julian♦
19年6月27日在13:12
@julian你的命令是什么意思?像a遵循a b => b的顺序?我的回答中的顺序并不表示已排序/顺序/非顺序的数据,而是按顺序/非随机状态表示的,其中每个值的计数趋于相等的最随机的重复数据具有最高的熵,它可能是(军事类型的有序/排序集,例如aaaabbbbccccdddd 4 [a,b,c,d],但这将倾向于具有大于aaaaaaaabbbbbccd 8 [a],4 [b],2 [c],1 [d]的熵使用硬技术词的理论链接en.wikipedia.org/wiki/Entropy_(information_theory)
– blabb
19年6月27日在16:47
您说的是“有序集”,所以也许我误解了您的意思。无论如何,关于熵和随机性之间关系的要点是正确的。
– julian♦
19-6-27在16:54
@julian:你在说什么???我确实认为blabb是正确的。您似乎只停留在熵的一个定义上,但是它们却是两个……两者都是完全正确的。因此,请停止对所有人大喊大叫。
–恐怖
19年6月28日在7:50