本文为看雪论坛优秀文章
一 • 信息熵
什么是信息
信息熵
香农公式
那么现在我们对整个公式进行抽象,可以得到:
log2(1/pa) + log2(1/pb) + ... + log2(1/pn)
= ∑ log2(1/pn)
S=log(1/pa) + log(1/pb) + ... + log(1/pn)
= ∑ log(1/pn)
= ∑ -p*log(p)
信息熵的应用
对于非PE文件,例如恶意脚本,为了逃避杀软检测经常使用加密/压缩等手段,无论如何处理都会增大信息的随机性,那么我们就可以利用信息熵来做对应检测了。
二 • 实现
思路
I(n)=(S(a/256))+(S(b/256))....(S(n/256))
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;
}
aGVsbG8gd29yZA==
hello word
encode_base64_entropy = 3.0351414
decode_base64_entropy = 2.1535325
Chr(104)+Chr(101)+Chr(108)+Chr(108)+Chr(111)+Chr(9)+Chr(119)+Chr(111)+Chr(114)+Chr(100)
三 • 扩展
平均巧合指数(Index of Coincidence)
当然如果混淆算法经过特殊处理,是可以计算到一个接近正常的信息熵,那么我们需要更多的维度去判断,这里我们可以使用一个密码学的概念「巧合指数」。
其中fi标识某字母在该段文字中出现的次数。
而我们常用的脚本语言也是接近自然语言语法,所以他的巧合指数也是可以获得一个期望的,我之前简单计算过,大概是在0.046~0.047之间。
贴代码:
double CLanguageIC::calculate()
{
DWORD64 _char_count = 0;
DWORD64 _total_char_count = 0;
for (int i = 0; i < 256; i++)
{
DWORD64 charcount = g_GlobalInfo.count(((char)i));
_char_count += charcount * (charcount - 1);
_total_char_count += charcount;
}
double ic = 0;
if (_total_char_count - 1 != 0)
ic = double(_char_count) / (_total_char_count * (_total_char_count - 1));
calculate_char_count();
return ic;
}
hello word
aGVsbG8gd29yZA==
Chr(104)+Chr(101)+Chr(108)+Chr(108)+Chr(111)+Chr(9)+Chr(119)+Chr(111)+Chr(114)+Chr(100)
a1 = 0.0761905
a2 = 0.0380952
a2 = 0.0967511
互信息
double CEntropyMI::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;
double p_y = (double)1 / 256;
double p_x_y = p_x * p_y;
if (p_x > 0)
entropy += -(p_x * p_x_y) * (log(((p_x * p_x_y) / p_y)));
}
return entropy;
}
四 • 总结
看雪ID:wuxiwudi
https://bbs.pediy.com/user-home-258629.htm
*本文由看雪论坛 wuxiwudi 原创,转载请注明来自看雪社区。
# 往期推荐
球分享
球点赞
球在看
点击“阅读原文”,了解更多!
本文始发于微信公众号(看雪学院):基于信息熵判断非PE文件是否加密混淆的方法浅析
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论