刚学驱动和C 的时候 HOOK 是什么意思真不懂 网上找了找 都讲的太正规 整的我看不明白
我当时的疑问是:改成自己的函数 我的函数写成什么啊
后来知道需要一个函数原形如:
NTSTATUS
_stdcall
My_NtOpenProcess(
OUT PHANDLE ProcessHandle, //返回 被打开进程的句柄
IN ACCESS_MASK DesiredAccess, //访问权限
IN POBJECT_ATTRIBUTES ObjectAttributes,//对象属性结构
IN PCLIENT_ID ClientId)//进程PID
前边加上My 就成我们的了然后在加个大括号 里边随便写
首先要HOOK一个函数 我们先需要了解SSDT结构 这个网上一搜一堆 我就说说我对他的理解吧
他就是存放着函数的首地址 通过基址跟索引号计算出哪个函数的地址 HOOK就是修改原来的地址
把他改成我们的 这时候调用就调用我们的了
然后看代码
#include <ntddk.h>
void Hook();//前置说明
void UnloadHook();
extern KeServiceDescriptorTable;//定义 KeServiceDescriptorTable 表
ULONG Current , // 这个保存当前NtOpenProcess函数的地址
Adress_pointer ,// 这个是保存KeServiceDescriptorTable地址表 指向NtOpenProcess函数的首地址
SaveAdress;//保存原来地址用于恢复HOOK
//函数原形
NTSTATUS
_stdcall
My_NtOpenProcess(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId)
{
return STATUS_ACCESS_DENIED;// 这个是自己的函数 怎么写都可以 我只写个返回错误的
}
//卸载函数
void Unload(PDRIVER_OBJECT pdriver_object)
{
DbgPrint("驱动卸载成功");
UnloadHook();
}
//入口函数
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pdriver_objcet , IN PUNICODE_STRING reg)
{
DbgPrint("驱动加载成功");
pdriver_objcet -> DriverUnload = Unload;
Hook();
return STATUS_SUCCESS;
}
//HOOK函数
void Hook()
{
__asm
{
pushad
mov ebx,KeServiceDescriptorTable
mov ebx,[ebx] // 取 KeServiceDescriptorTable 这个表的基地址
mov eax,0x7A
imul eax,eax,4
add ebx,eax //KeServiceDescriptorTable + 0x7A * 4 这个公式得到的是 个指针 里边存的就是函数的首地址 我们HOOK 就是把这里边的地址换成我们的函数地址
mov Adress_pointer,ebx
mov ebx,[ebx]// 读取当前的地址
mov Current,ebx
popad
}
SaveAdress = *((ULONG*)Adress_pointer);//保存原来的地址用于恢复
DbgPrint("NtOpenProcess当前地址:%0x" , Current);
DbgPrint("存储NtOpenProcess地址为:%0x" , Adress_pointer);
DbgPrint("%0x" , SaveAdress);
//修改保护
__asm
{
mov eax,cr0
and eax,not 10000h
mov cr0,eax
}
*((ULONG*)Adress_pointer)= (ULONG)My_NtOpenProcess;//HOOK SSDT 替换我的函数地址
//恢复保护
__asm
{
mov eax,cr0
or eax,10000h
mov cr0,eax
}
DbgPrint("Hook成功");
}
void UnloadHook()
{
__asm{
cli
mov eax,cr0
and eax,not 10000h
mov cr0,eax
}
*((ULONG*)Adress_pointer) = SaveAdress;//恢复地址
__asm{
mov eax,cr0
or eax,10000h
mov cr0,eax
sti
}
}
我起初不理解 *((ULONG*)Adress_pointer) 这里是指到哪里 一直蓝
其实这个就是我们所要修改的函数地址 我看过的教程都不详细的讲 或者都不讲
*((ULONG*)Adress_pointer)这个就是个指针
指向的函数首地址 也就是SSDT表里的地址 自己了解一下KeServiceDescriptorTable一级一级的跟一下
其实发个贴对自己也是有好处的所以就发了 第一次发贴 对付整吧
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)