10-挂钩注入(SetWindowsHookEx Injection)

一、前言

挂钩(Hooking) 机制是一种拦截和修改系统、应用程序或特定函数执行流程的技术,这一看好像跟中断机制有点类似,中断服务程序由操作系统负责,运行在内核态,而我们的钩子程序(也称钩子过程) 运行在用户模式。

挂钩(Hooking)机制 挺有趣的,Windows允许程序安装挂钩,以使用来监视各种系统事件,例如鼠标单击和键盘按键。具体机制的介绍我将在 hooking技术 这一小节详细讲解。

在挂钩注入中有两个重要的Windows API,它们分别是 SetWindowsHookExUnhookWindowsHookEx

  1. SetWindowsHookEx:设置相应类型的钩子程序,当某类事件发生时会调用相应的相应类型的钩子程序。官方文档:SetWindowsHookExA 函数 (winuser.h) - Win32 apps | Microsoft Learnarrow-up-right。钩子的类型如下:

    • WH_KEYBOARD:键盘消息钩子

    • WH_MOUSE:鼠标消息钩子

    • WH_CBT:系统回调钩子

    • WH_SHELL:Shell消息钩子

    • WH_CALLWNDPROC:窗口消息钩子

    • 更多的钩子类型,请看官方文档

  2. UnhookWindowsHook:删除 SetWindowsHookEx 函数安装在挂钩链中的挂钩过程。官方文档:UnhookWindowsHookEx 函数 (winuser.h) - Win32 apps | Microsoft Learnarrow-up-right

二、流程

  1. 创建一个恶意 DLL,该DLL导出一个 EvilFunction 函数,函数的主要作用是加载执行shellcode

  2. 创建一个exe文件,该exe文件的主要作用

    • 解析导出函数的地址,获得 钩子程序,其实也就是EvilFunction 的地址

    • 使用 SetWindowsHookEx 给键盘安装钩子(Hook),然后,返回值为挂钩过程的句柄。

    • 受害者运行notepad.exe,使用键盘打字

    • 由于键盘事件是 hooked 的,打字后会触发我们的钩子,notepad.exe 会加载我们的恶意 dll 并调用导出的函数

三、代码实现

挂钩注入主要是 DLL 注入,所以我们需要生成一个携带着恶意shellcode的dll,这个恶意的dll需要导出一个导出函数 EvilFunction

恶意DLL

exe文件的代码

recording.gif

Last updated