Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
LazyHook — 通过在受信任的 Microsoft 调用堆栈中执行恶意代码来规避行为分析,无补丁钩挂库 IAT/EAT。 | Kitploit
工具/GitHubGitHub/hwbp/lazyhook
漏洞利用IDS/IPS规避恶意软件分析学习与教育红队反机器人
GitHubhwbp/lazyhook

LazyHook

通过在受信任的 Microsoft 调用堆栈中执行恶意代码来规避行为分析,无补丁钩挂库 IAT/EAT。

查看仓库
148258个月前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

概述

LazyHook 是一个隐蔽的 API 钩子框架,通过调用栈欺骗绕过主机入侵防御系统(HIPS)。借助 CPU 级硬件断点和向量化异常处理,它可以执行任意代码,使其看似源自受信任的、经过 Microsoft 签名的模块——完全欺骗依赖调用栈检查和模块来源验证的行为分析引擎。

通过在受信任的 Microsoft 调用栈内执行恶意代码来规避行为分析
使用硬件断点 + VEH 劫持合法函数并伪造模块来源

问题:现代安全软件

主机入侵防御系统(HIPS)和行为分析引擎通过以下方式监控应用程序:

  • 调用栈分析:跟踪 API 调用的来源和流程
  • 模块来源验证:检查可疑行为是否源自受信任的模块
  • API 模式识别:检测恶意序列(例如,VirtualAlloc → WriteProcessMemory → CreateRemoteThread)
  • 返回地址验证:确保返回地址指向合法的代码段

卡巴斯基系统监控(Kaspersky System Watcher)、Windows Defender、Cylance 和 CrowdStrike 等系统都采用了这些技术的变体。

解决方案:受信任的调用栈欺骗

通过劫持 Microsoft 签名程序集(例如 System.Windows.Forms.dll、user32.dll)中的函数,我们可以在看似完全合法的调用栈内执行任意逻辑。

注意:可以执行 JmpHook,它将钩住 MsgBox -> 然后紧接着调用您的自定义代码。LazyHook 不这样做

为什么这有效:

  1. 被钩子的函数位于受信任的、经过数字签名的 Microsoft DLL 中
  2. 当您的载荷执行时,调用栈显示受信任的模块为调用者
  3. 硬件断点不会留下内存修改,因此完整性检查能够通过

安全软件看到第二种场景并认为:"来自 user32.dll 的 MessageBoxA 正在调用 Windows API?这是正常行为。"

工作原理

root@kitploit:~
┌─────────────────────────────────────────────────────────┐
│  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(导入地址表)钩子

通过在 IAT 中定位导入函数的地址并设置硬件断点来拦截它们。这会钩住您进程中的特定导入。

root@kitploit:~
HookIAT("user32.dll", "MessageBoxA", HookFunction, &OriginalFunction);

EAT(导出地址表)钩子

通过导出表解析 DLL 中导出函数的地址,从而全局钩住这些函数。这会影响对该导出的所有调用。

root@kitploit:~
HookEAT("amsi.dll", "AmsiScanBuffer", HookFunction, &OriginalFunction);

Entry.cpp 演示

附带的演示展示了三种实际场景:

1. MessageBoxA IAT 钩子

通过拦截 MessageBoxA 调用并修改显示的消息来演示 IAT 钩子:

root@kitploit:~
int WINAPI HookMessageBoxA(HWND H, LPCSTR T, LPCSTR C, UINT U)
{
    printf("[*] MessageBoxA hooked!\n");
    return LazyHook::CallOriginal<int>(LazyHook::GetIatState(), H, "Hooked!", ">:)", U);
}

2. CreateFileA EAT 钩子(注释示例)

展示如何通过记录 CreateFileA 调用来监控文件操作:

root@kitploit:~
HANDLE WINAPI HookCreateFileA(LPCSTR Filename, ...)
{
    printf("[*] CreateFileA hooked: %s\n", Filename);
    return LazyHook::CallOriginal<HANDLE>(...);
}

3. 通过 AmsiScanBuffer 钩子实现 AMSI 绕过

演示通过强制所有 AMSI 扫描返回干净结果来绕过安全软件:

root@kitploit:~
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 绕过,并显示其被分类为干净。

实现细节

调试寄存器配置

root@kitploit:~
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 配置为:

  • 启用执行断点(00b 表示执行条件)
  • 设置 1 字节长度以确保断点精度

向量化异常处理

VEH 处理器:

  1. 检查异常是否为 EXCEPTION_SINGLE_STEP
  2. 将指令指针(RIP/EIP)与已注册的钩子进行比较
  3. 如果找到匹配项,则将执行重定向到钩子函数
  4. 返回 EXCEPTION_CONTINUE_EXECUTION 以在钩子处恢复执行

CallOriginal 模式

root@kitploit:~
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;
}

示例用例

1. AMSI 绕过

演示展示了钩住 AmsiScanBuffer 以强制返回干净扫描结果:

root@kitploit:~
HRESULT WINAPI HookAmsiScanBuffer(...)
{
    HRESULT Result = LazyHook::CallOriginal<HRESULT>(...);
    (*Result) = AMSI_RESULT_CLEAN;  // Force clean result
    return Result;
}

这演示了如何通过拦截关键 API 调用在运行时修改安全软件的行为。

2. 函数调用监控

钩住 CreateFileA 以记录文件访问,而不修改应用程序行为:

root@kitploit:~
HANDLE WINAPI HookCreateFileA(LPCSTR Filename, ...)
{
    printf("File accessed: %s\n", Filename);
    return LazyHook::CallOriginal<HANDLE>(...);
}

负责任使用与法律声明

此代码展示了高级规避技术,适用于:

  • 安全研究与教育
  • 授权环境中的红队行动
  • 恶意软件分析与防御研究

⚠️ 警告:未经授权使用本框架绕过安全控制、修改软件行为或规避保护措施可能违反计算机欺诈法律(CFAA、GDPR 及同等法规)。本框架仅供教育和授权安全研究使用。


理解攻击技术有助于构建更好的防御。

下载工具