准备

首先,下载 InfinityHook 项目:

git clone https://github.com/everdox/InfinityHook

打开 sln ,编译一下:
在这里插入图片描述

得到我们需要的 lib 文件(以 x64 为例):
在这里插入图片描述

再找到 这个 .h 头文件,需要的就这么多 🙃
在这里插入图片描述

新建项目

新建一个驱动项目,将刚才的 .lib 和 .h 文件拷贝到工程目录中:
在这里插入图片描述

项目中添加现有项:
在这里插入图片描述

注意,这里的 lib 文件必须添加到工程目录中,如果只单纯的设置附加依赖项和附加库目录,会报 “无法解析的外部符号” 错误,另外自己的项目需要用 .cpp 而不是 .c ,即与lib库的编译方式吧保持一致。 这个坑我踩了很久才跳出去,具体原因没有追究。

编写代码

已 hook NtOpenProcess 为例:

#include <ntifs.h>
#include "infinityhook.h"
#pragma comment (lib,"libinfinityhook.lib") 

NTSTATUS DriverUnload(IN PDRIVER_OBJECT DriverObject) {
   
    // 定义返回值
    NTSTATUS status;

    // 输出日志
    DbgPrint("[LYSM] DriverUnload start. \n");

    // 恢复 infinityhook 
    IfhRelease();

    return STATUS_SUCCESS;
}


NTSTATUS NTAPI My_NtOpenProcess(OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId OPTIONAL) {

    // 根据 PID 获取 _EPROCESS
    PEPROCESS Process = NULL;
    if (PsLookupProcessByProcessId(ClientId->UniqueProcess, &Process) != STATUS_SUCCESS) {
        goto lysm_end;
    }

    // 获取 _EPROCESS 的 FileName 
    if (!MmIsAddressValid((PVOID64)((ULONG64)Process + 0x450))) {
        goto lysm_end;
    }
    PCHAR p_name = (PCHAR)((ULONG64)Process + 0x450);

    // 如果是记事本则禁止打开
    PCHAR p_notepad = "notepad.exe";
    if (strcmp(p_name, p_notepad) == 0) {
        return 0;
    }

lysm_end:
    return NtOpenProcess(ProcessHandle, DesiredAccess, ObjectAttributes, ClientId);
}

// 定义 NtOpenProcess 结构
typedef NTSTATUS(NTAPI* NTOPENPROCESS)(
    OUT PHANDLE ProcessHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    IN PCLIENT_ID ClientId OPTIONAL
    );
static NTOPENPROCESS pfn_NtOpenProcess;


void __fastcall SyscallCallBack(_In_ unsigned int SystemCallIndex, _Inout_ void** SystemCallFunction)
{
    // 在此加入你要 Hook 的函数
    if (*SystemCallFunction == pfn_NtOpenProcess){ *SystemCallFunction = My_NtOpenProcess; }
}

extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath) {

    // 定义返回值
    NTSTATUS status;

    // 输出日志
    DbgPrint("[LYSM] DriverEntry start.\n");

    // 指定驱动卸载函数
    DriverObject->DriverUnload = (PDRIVER_UNLOAD)DriverUnload;

    // 获取 NtOpenProcess 函数地址
    UNICODE_STRING us_NtOpenProcess = RTL_CONSTANT_STRING(L"NtOpenProcess");
    ULONG64 ul_NtOpenProcess;
    ul_NtOpenProcess = (ULONG64)MmGetSystemRoutineAddress(&us_NtOpenProcess);
    pfn_NtOpenProcess = (NTOPENPROCESS)ul_NtOpenProcess;

    // 启用 InfinityHook
    if (IfhInitialize(SyscallCallBack) != STATUS_SUCCESS){
        DbgPrint("[LYSM] IfhInitialize failed. \n");
        return STATUS_UNSUCCESSFUL;
    }

    return STATUS_SUCCESS;
}

效果图

在这里插入图片描述

InfinityHook 工作原理

[原创] 剖析InfinityHook原理 掀起一场更激烈的攻与防恶战

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐