准备
首先,下载 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;
}