30个免杀技巧总结 懂一半绝对是高手!
一、代码优化类:从源头降低检测概率
- 1. 字符串动态加密避免硬编码敏感字符串(如 API 名称、路径),用 AES+Base64 组合加密,执行时在内存中动态解密。例:将 “CreateRemoteThread” 加密为 “a2F4...”,调用前通过自定义函数解密,减少静态特征暴露。注意:解密函数需混淆,避免被查杀工具识别解密逻辑。
- 2. 控制流平坦化用代码混淆工具(如 Obfuscator-LLVM、ConfuserEx)打乱代码执行流程,将线性逻辑拆分为 “跳转表 + 分支函数”。比如原本 “if (a>0)→执行 A→执行 B”,改为 “通过全局变量判断跳转至函数 X→函数 X 调用函数 A→函数 A 触发函数 B”,增加杀软反汇编难度。局限性:会轻微降低执行效率,需平衡混淆程度。
- 3. API 动态调用不直接声明 API 函数,通过 LoadLibraryA 加载 dll(如 kernel32.dll),再用 GetProcAddress 获取函数地址。进阶操作:手动解析 PE 文件导入表,跳过系统 API 查询接口,直接从内存中定位函数入口。例:加载 kernel32.dll 后,遍历其导出表找到 “WriteProcessMemory” 地址,避免 “直接调用 API” 的静态特征。
- 4. 移除调试信息与符号表编译时删除程序符号表(如 GCC 加 “-s” 参数,VS 勾选 “Strip Debug Information”),同时用工具(如 UPX、Aspack)压缩 PE 文件头部,减少杀软通过符号表识别程序用途的可能。注意:过度压缩可能触发部分杀软 “压缩壳报毒”,需测试不同压缩率。
- 5. 变量名与函数名混淆将自定义变量 / 函数名改为无意义字符(如 “a123”“x_y_z”),避免使用 “inject”“encrypt” 等敏感命名。例:将 “injectToProcess” 改为 “f34k9”,同时拆分长函数为多个短函数,每个函数仅负责单一简单逻辑,降低功能关联性识别。
- 6. 避免固定代码模板不使用公开免杀工具的默认代码(如 msfvenom 生成的 payload 模板),手动修改核心逻辑。比如 msfvenom 生成的 shellcode 默认有固定头部,可手动替换头部指令(如将 “push eax” 改为 “mov eax,0→push eax”),打破特征匹配。
二、加载防护类:规避执行阶段检测
- 1. 进程注入 - 进程空洞注入(Process Hollowing)创建挂起状态的合法进程(如 notepad.exe),清空其内存空间,将自身 payload 写入并修改入口点,最后恢复进程运行。优势:利用合法进程进程名与 PID,降低杀软警觉性。注意:需处理进程权限,低权限下可能无法注入系统进程,优先选择用户级进程(如 explorer.exe)。
- 2. 反射加载 dll将 dll 文件转为字节数组嵌入 exe,执行时在内存中直接解析 dll 结构(如 PE 头、节表),无需写入磁盘,通过手动映射方式加载。工具推荐:使用 ReflectiveDLLInjection 框架,修改其加载函数避免特征。风险:部分杀软监控内存 dll 加载行为,需配合反监控技巧。
- 3. 延迟加载技术不启动时加载所有模块,按需动态加载。例:程序启动仅加载基础功能,当触发特定操作(如用户点击按钮)时,再加载免杀核心模块。实现方式:Windows 下用 LoadLibraryEx 延迟加载,Linux 用 dlopen 动态加载。作用:避免启动时被杀软检测到敏感模块。
- 4. 利用合法程序加载将 payload 嵌入合法程序(如 office 插件、浏览器扩展),通过合法程序的加载机制执行。例:编写 Excel VBA 宏,通过 “调用 Windows API” 的方式加载 payload,利用 office 的信任机制绕过部分防护。注意:需符合目标环境的软件信任策略,且宏需避免触发 office 的安全提示。
- 5. 内存分页保护对 payload 所在内存页设置保护属性(如 PAGE_READWRITE→PAGE_EXECUTE_READ),执行时动态切换。例:写入 payload 时设为 “可读可写”,执行前改为 “可执行可读”,执行后恢复为 “可读可写”,避免杀软检测 “可执行内存页写入” 的敏感行为。实现:调用 VirtualProtect(Windows)或 mprotect(Linux)。
- 6. 多阶段加载分阶段加载 payload,第一阶段仅加载 “加载器”(无敏感行为),第二阶段通过加载器从远程服务器(需合法可控)下载核心 payload 并执行。优势:第一阶段代码简单,不易被检测;第二阶段可动态更新,规避特征库。注意:需确保远程服务器安全,避免被溯源。
- 7. 壳防护 - 自定义加壳不使用公开加壳工具(如 UPX、ASPack,易被识别),手动编写简单壳程序:将原程序加密后嵌入壳程序,壳程序运行时解密原程序并在内存中执行。例:用 XOR 算法加密原程序,壳程序加载后遍历内存解密,再跳转到原程序入口。局限性:防护强度依赖加密算法,需避免壳程序自身被特征匹配。
三、内存对抗类:应对动态检测与监控
- 1. 反调试 - 检测调试器存在通过多种方式判断程序是否被调试:①读取 ProcessDebugPort(Windows),若返回非 0 则存在调试器;②检查 CS:IP 寄存器值,调试状态下会指向调试器代码;③利用时间差检测,调试时代码执行变慢,对比同一代码块两次执行时间,差值过大则判定为调试。应对:检测到调试时,暂停 payload 执行或退出程序。
- 2. 反沙箱 - 识别沙箱环境沙箱通常资源受限,可通过以下特征判断:①CPU 核心数 <2、内存 < 4GB(调用 GetSystemInfo 获取);②磁盘空间 < 50GB(读取磁盘信息);③无真实硬件信息(如显卡型号为 “VMware SVGA”);④系统启动时间 < 1 小时(读取系统启动时间)。处理:检测到沙箱时,不执行敏感操作,模拟正常程序行为。
- 3. 内存擦除 - 清除执行痕迹payload 执行完成后,清除内存中的敏感数据:①用 0 填充 payload 所在内存页;②卸载动态加载的 dll(调用 FreeLibrary);③清除寄存器中的临时数据(如将 eax、ebx 等寄存器设为 0)。作用:避免杀软通过内存 dump 分析 payload 特征。注意:需在程序退出前执行,且避免影响其他进程内存。
- 4. Hook 对抗 - 反杀软 Hook检测系统 API 是否被杀软 Hook(如 Hook CreateRemoteThread),通过对比 API 入口地址与原始地址(从 dll 导出表获取),若不一致则判定被 Hook。应对:①直接从内存中定位 API 真实入口(跳过 Hook 点);②用自定义函数替换被 Hook 的 API,恢复原始功能。例:Windows 下,从 kernel32.dll 文件中读取 “CreateRemoteThread” 原始字节码,手动执行。
- 5. 规避内存扫描 - 碎片化 payload将 payload 拆分为多个小块,分散存储在不同内存区域(如堆、栈、全局变量区),执行时动态拼接。例:将 1000 字节的 payload 拆为 10 个 100 字节块,分别存在 10 个不同的数组中,执行前通过循环拼接为完整 payload。优势:杀软内存扫描时,单个小块无敏感特征,难以识别。
- 6. 利用内存缓存 - 减少磁盘交互所有操作在内存中完成,不写入临时文件。例:解密后的 payload、加载的 dll 均不落地,直接在内存中解析执行。避免杀软通过监控 “可疑文件创建”“临时目录写入” 检测。注意:需处理内存不足问题,优先释放非核心内存。
- 7. 反内存 dump - 保护内存数据检测内存 dump 工具(如 Process Hacker、WinDbg),通过监控 “进程访问权限”(调用 OpenProcess 时检查权限请求),若发现高权限内存读取请求,立即加密内存中的 payload。实现:注册内存保护回调函数,当检测到 dump 行为时,触发加密逻辑。
- 8. 时间戳欺骗 - 干扰行为分析修改程序执行的时间戳,使杀软的行为分析误以为程序运行缓慢或无异常。例:在敏感操作(如注入)前,调用 SetSystemTime 临时修改系统时间,操作完成后恢复。干扰杀软 “基于时间序列的异常检测”(如短时间内多次调用敏感 API)。
四、环境适配类:适配不同系统与防护场景
- 1. 系统版本适配 - 避免 API 兼容问题不同 Windows 版本 API 存在差异(如 Windows 10 的 CreateProcessWithTokenW 与 Windows 7 的 CreateProcessAsUserA),通过 GetVersionEx 获取系统版本,加载对应 API。例:检测到系统为 Win10 及以上时,使用 “Process Hollowing”;Win7 及以下时,使用 “CreateRemoteThread”,避免因 API 不存在触发异常,被杀软捕捉。
- 2. 权限适配 - 低权限免杀在低权限环境下(如普通用户账号),避免使用高权限 API(如 OpenProcess 需 PROCESS_ALL_ACCESS 权限),改用低权限可行操作:①注入到同权限进程(如用户启动的 notepad.exe);②利用注册表启动项(HKEY_CURRENT_USER 下的 Run 键,无需管理员权限)实现持久化。
- 3. 关闭防护软件临时接口(合法场景)在授权测试中,通过合法接口临时关闭目标防护软件(需提供授权证明):①Windows Defender 可调用 PowerShell 命令 “Set-MpPreference -DisableRealtimeMonitoring $true”;②第三方杀软(如 360)通过其官方提供的测试接口关闭防护。注意:仅限授权场景,非法关闭属违规行为。
- 4. 利用系统白名单路径将程序放入系统信任路径(如 C:\Windows\System32、C:\Program Files),部分杀软对这些路径的程序检测较宽松。实现:通过合法安装程序将 payload 放入白名单路径,或利用系统漏洞(需已修复,仅用于测试)写入。注意:需确保程序有写入权限,且避免覆盖系统文件。
- 5. 文件签名伪造(仅测试自身签名机制)生成自签名证书(使用 OpenSSL),为程序添加数字签名,欺骗依赖签名验证的杀软。例:创建自定义 CA 证书,签署 payload.exe,在测试环境中导入 CA 证书,使程序显示 “已验证签名”。局限性:仅对依赖签名的杀软有效,且无法欺骗已加入官方黑名单的签名。
- 6. 规避主动防御 - 模拟正常用户行为模仿真实用户操作触发 payload:①通过键盘钩子(如 RegisterHotKey),当用户按下 “Ctrl+Alt+A” 时执行敏感操作;②等待用户双击程序后,延迟 30 秒再执行核心逻辑,避免 “启动即触发敏感行为” 被判定为恶意。作用:降低主动防御的 “行为异常” 判定概率。
- 7. 跨平台免杀 - Linux 环境适配Linux 下避免使用公开 exp(如 Dirty COW),手动修改 exp 代码:①替换 shellcode 为自定义版本(从 msfvenom 生成后修改头部指令);②利用 bash 脚本加载 payload,通过 “eval”“base64 解码” 组合执行,避免脚本特征匹配。例:将 payload 编码为 base64,用 “echo [编码内容] | base64 -d | bash” 执行。
- 8. 移动端免杀 - Android 示例Android 端避免使用静态注册的 BroadcastReceiver(易被检测),改用动态注册:①在代码中通过 registerReceiver 注册广播,不写入 AndroidManifest.xml;②将 payload 嵌入资源文件(如 res/raw),通过 AssetManager 读取并解密执行。注意:需适配 Android 10 及以上的存储权限,避免因权限不足导致读取失败。
- 9. 持续化免杀 - 隐蔽启动项除常规启动项(如 Run 键),利用系统隐蔽位置实现持久化:①Windows 下修改 “Winlogon\Userinit” 注册表项,指定程序路径;②Linux 下在 “/etc/cron.hourly” 添加定时脚本,每小时执行一次 payload。注意:需测试启动项是否被杀软监控,优先选择较少被检测的位置。
五、总结
篇文章
14.99W人已阅读

