-
-
[原创][6.1儿童节快乐]基于信息熵判断非PE文件是否加密混淆的方法浅析
-
发表于:
2021-6-5 16:57
11319
-
[原创][6.1儿童节快乐]基于信息熵判断非PE文件是否加密混淆的方法浅析
信息熵
什么是信息
在计算机科学中,我们通常认为信息是一种数据或指令的集合,泛指我们通过载体传播的内容.
信息熵
熵是一个热力学概念,是形容物质混乱程度的单位,当物质混乱程度越高的时候熵值越高.在上个世纪40年度,香农将熵引入到信息论中,把信息中排除冗余后的平均信息量定义为信息熵.
香农公式
我们假定有一列信息abaaabbababa...
,其中字母a
出现的概率是p,则字母b
出现的概率是(1-p),那么当信息的长度为N的时候,信息中就会存在pN个a
,以及(1-p)个b
,那么这个信息的排列方式就有N!/(pN)!((1-p)N)!
种,对于a
的自信息量就是Pa=-p*log2(p)
,那么整个信息列的熵就是S=-p*log2(p)-(1-p)*log2(1-p)
,这里用log2做底数是因为只有ab两种情况.
那么现在我们对整个公式进行抽象,可以得到
1
2
|
log2( 1 / pa) + log2( 1 / pb) + ... + log2( 1 / pn)
= ∑ log2( 1 / pn)
|
如果把2也当作是一个变量的话,我们可以进一步得出
1
2
3
|
S = log( 1 / pa) + log( 1 / pb) + ... + log( 1 / pn)
= ∑ log( 1 / pn)
= ∑ - p * log(p)
|
这就是大名鼎鼎的香农公式了.
信息熵的应用
信息熵目前被广泛应用在各种压缩场景种,对于长度相同的信息,熵值p越大,则表明信息内容越有规律,可压缩的体积就越大;p越小,则信息内容越随机,可压缩的体积就越小.
对于非PE文件,例如恶意脚本,为了逃避杀软检测经常使用加密\压缩等手段,无论如何处理都会增大信息的随机性,那么我们就可以利用信息熵来做对应检测了.
实现
思路
一个文本信息的基本单位是字节,一个字节的范围是0~255,那么我们就可以得到公式
1 |
I(n) = (S(a / 256 )) + (S(b / 256 ))....(S(n / 256 ))
|
代码:
1
2
3
4
5
6
7
8
9
10
11
12
|
double CEntropy::calculate()
{
double entropy = 0 ;
DWORD dwMapSize = g_GlobalInfo.GetSize();
for ( int i = 0 ; i < 256 ; i + + )
{
double p_x = double(g_GlobalInfo.count(((char)i))) / dwMapSize;
if (p_x > 0 )
entropy + = - p_x * (log(p_x));
}
return entropy;
}
|
样本:
1
2
|
aGVsbG8gd29yZA = =
hello word
|
我们分别对Base64前后的数据进行计算,可以得到
1
2
|
encode_base64_entropy = 3.0351414
decode_base64_entropy = 2.1535325
|
[注意]看雪招聘,专注安全领域的专业人才平台!
最后于 2021-6-5 17:53
被wuxiwudi编辑
,原因: