什么是熵图

逆向工程
2021-06-28 20:38:50

我是倒车新手,我看到了一个工具Detect It Easy,它有一个名为Entropy的功能我想知道它是做什么用的?

4个回答

熵被解释为无序或随机的程度

高熵意味着一组高度无序的数据

低熵意味着一组有序的数据


这里解决评论顺序并不意味着“a”跟在“a”类型的顺序之后,它被解释为某些数据的随机/非随机状态

aaaabbbbccccdddd"abcdabcdabcdabcd""adbcadbcadbcadbc"是一个重复字符串,其熵将大于
aaaaaaaabbbbcccd 或此字符串的任何混洗表示

在第一个字符串及其混洗的克隆中都有 4 个字符,概率为4/16 或 1/4 或 25%,
但在第二个字符串中,字符'a' (8/16 ) 或一半数据集的概率最高,
'c' (1/16) 的概率最小或非常小

熵是一个热力学概念,被引入数字科学(信息论)作为计算一组数据的随机程度的一种手段

简单地说,最高压缩的数据将具有最高的熵

其中所有 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

只是在@blabb 和@Johann Aydinbas 的答案中添加(小)信息,这里引用了实用恶意软件分析书中关于您的问题的内容:

打包的可执行文件也可以通过一种称为熵计算的技术来检测。熵是衡量系统或程序 [...]

压缩或加密数据更接近随机数据,因此具有高熵;未加密或压缩的可执行文件具有较低的熵。用于检测打包程序的自动化工具通常使用诸如熵之类的启发式方法。

您可以在此处的增加的熵”标题找到其他信息

它有一个叫做熵的特性。我想知道它是做什么用的?

就我们的目的而言,熵可以被视为信息密度或信息随机性的度量,这使得它在逆向工程和二进制分析的背景下很有用。

压缩和加密的数据比例如代码或文本数据具有更高的熵。事实上,压缩和加密的数据具有接近最大可能的熵水平,这可以用作启发式来识别它,以便将其与未压缩/未加密的数据区分开来。

逆向工程中的示例用例:

  • 恶意软件分析- 如果我们有一个可执行文件,它有一个可以成功解析的头文件并且程序加载和运行没有错误,但是文件的整体熵级别非常高,并且由于外部数据无法静态分析代码文件头和程序头看起来是随机的(因此具有高熵),这可能意味着可执行文件实际上在磁盘上被压缩并在运行时解压缩。可执行压缩使分析复杂化,因此它是为犯罪目的开发的程序的一个相对常见的特征。如果我们要分析代码,它的解压形式需要以某种方式恢复。

  • 固件分析- 在硬件限制相对严格的系统中,例如嵌入式系统,固件更新通常以压缩形式交付,以节省空间。为了分析固件,首先需要确定它是加密的还是压缩的。确定这一点的一种方法是对文件进行熵分析。如果熵非常高,则表明文件确实被压缩或加密了。要继续分析实际固件,必须首先对其进行解压缩/解密。如果我们有一个熵非常高(即接近随机)的数据块,尝试将其视为代码并对其进行反汇编是没有意义的,因为结果将是毫无意义的废话。

  • 文件类型识别- 某些文件类型可以根据它们的整体熵来识别。例如,我们通常可以区分图像文件(png、jpeg 等)和编译二进制文件(ELF、PE),因为图像文件由压缩数据组成,因此(通常)比编译二进制文件具有更高的熵。

除了“Detect It Easy”之外binwalkent还有binvis.io等工具可以帮助计算文件熵。您还可以构建自己的工具来执行此操作。

香农的熵来自信息论。它是文本随机性程度的度量。如果字符串具有更大的香农熵,则意味着它是一个强密码。原则上,香农熵方程提供了一种基于符号频率来预测编码一串符号所需的平均最小位数的方法。

基数 2 的公式

请注意,基数表示可能的字符数。底座 2 可以用任何底座代替。从这段代码中可以看出,它被 255 替换。

这个链接有一个最简单的算法实现,用于计算小说和宗教书籍的熵。它告诉我们很多。例如,所有人类生成的书籍在无序之间的波动程度几乎相同。这是数据的一个很好的特性。这是上面提到的代码的链接。 不同书籍的信息熵