免杀基础
字数 1281 2025-09-01 11:26:17
免杀基础:Shellcode加密与动态API调用技术
一、Shellcode加密技术
1. Shellcode导出与基础加密
-
导出bin文件:
- 首先需要将Shellcode导出为二进制文件格式,这是后续加密处理的基础
-
使用010 Editor进行异或加密:
- 使用010 Editor等二进制编辑工具对Shellcode进行异或加密
- 异或加密是一种简单但有效的加密方式,可以改变Shellcode的特征
- 需要记录使用的异或密钥,用于后续解密执行
-
转换为IPv6格式:
- 使用Python脚本将加密后的二进制文件转换为IPv6格式
- 命令示例:
python3 ipv6.py payload.bin - 这种转换可以进一步混淆Shellcode,使其看起来像网络数据
2. 文件分离技术
- 将Shellcode与加载器分离可以增强免杀效果
- 可以采用外部文件、网络资源或注册表等方式存储加密的Shellcode
二、Shellcode加载技术
1. 基础加载方法
- 堆调用方法:在内存中创建堆空间来加载和执行Shellcode
- 替代方案:
- DLL镂空技术
- 进程镂空技术
- 这些技术可以更好地隐藏Shellcode的执行行为
2. 动态API调用框架
传统方式的问题
// 容易被杀软检测的传统方式
GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
- 直接使用
GetProcAddress等函数容易被杀毒软件标记
PEB获取API地址技术
-
获取kernel32.dll基地址:
- 通过PEB结构从
InInitializationOrderModuleList中找出kernel32.dll的加载基址 - 这是最简单的PEB获取方式
- 通过PEB结构从
-
扩展方法:
- 通过PEB遍历
InMemoryOrderModuleList - 使用hash比较方式获取模块基地址
- 注意32位和64位系统的进入方式不同
- 通过PEB遍历
-
完整流程:
- 获取kernel32.dll地址
- 解析PE头结构
- 获取GetProcAddress和LoadLibraryA的地址
实现细节
- 使用局部变量存储关键数据
- 自定义函数名称,避免使用标准API名称
- 通过hash比较而非字符串比较来查找函数
三、免杀框架搭建
-
基础框架:
- 完成上述动态API获取后,就搭建好了免杀的基础框架
- 后续可以随意调用Windows API,且能自定义调用方式
-
增强技术:
- 使用白名单技术绕过检测
- 局部变量使用:避免全局变量暴露关键数据
- API调用混淆:通过中间层调用API
-
效果评估:
- 该方法能有效规避基于特征码的检测
- 动态获取API使静态分析难以识别全部行为
- 加密和混淆技术增加了分析难度
四、技术要点总结
-
Shellcode处理:
- 导出 → 加密 → 格式转换 → 分离存储
-
加载技术:
- 选择隐蔽的加载方式(堆/DLL镂空/进程镂空)
-
API调用:
- 避免直接调用敏感API
- 通过PEB结构动态获取API地址
- 使用hash比较替代字符串比较
-
增强措施:
- 白名单利用
- 局部变量优先
- 调用链混淆
通过以上技术的组合应用,可以构建一个基础的免杀框架,有效规避常见杀毒软件的检测。实际应用中还需要根据目标环境进行适当调整和增强。