首页
社区
课程
招聘
[旧帖] [分享]菜鸟HOOK SSDT 0.00雪花
发表于: 2010-11-29 21:20 1327

[旧帖] [分享]菜鸟HOOK SSDT 0.00雪花

2010-11-29 21:20
1327
刚学驱动和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一级一级的跟一下

其实发个贴对自己也是有好处的所以就发了 第一次发贴 对付整吧

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 277
活跃值: (45)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
想深入学学HOOK,不知道哪本书好点
2010-11-29 23:19
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
icq
3
我都不明白你所说的hook是什么
2010-11-30 09:20
0
游客
登录 | 注册 方可回帖
返回
//