针对 NtOpenProcess服务函数HOOK SSDT示例代码,保护记事本进程

原创 2012年06月27日 23:54:26
#include <ntddk.h>
//////////////////////////////////////////////////////////////////////////
//函数声明
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pRegistryPath);
VOID Unload(PDRIVER_OBJECT pDriverObject);
NTSTATUS        MyNtOpenProcess(OUT PHANDLE ProcessHandle,
                                                        IN ACCESS_MASK AccessMask,
                                                        IN POBJECT_ATTRIBUTES pObjatt,
                                                        IN PCLIENT_ID Client);
NTSTATUS PsLookupProcessByProcessId(IN HANDLE ProcessId,
                                                                        OUT PEPROCESS *Process);
PUCHAR        PsGetProcessImageFileName(IN PEPROCESS process);
//////////////////////////////////////////////////////////////////////////
//结构体声明
typedef struct _SystemServiceDescriptorTable 
{
        PULONG        ServiceTableBase;
        PULONG        ServiceCounterTableBase;
        ULONG        NumberOfService;
        PULONG        ParamTableBase;
}SystemServiceDescriptorTable,*PSystemServiceDescriptorTable;
extern PSystemServiceDescriptorTable KeServiceDescriptorTable;

typedef NTSTATUS (*NTOPENPROCESS)(OUT PHANDLE ProcessHandle,
                                                                                        IN ACCESS_MASK AccessMask,
                                                                                        IN POBJECT_ATTRIBUTES pObjatt,
                                                                                        IN PCLIENT_ID Client);
NTOPENPROCESS RealOpenProcess;
//////////////////////////////////////////////////////////////////////////
#pragma code_seg("INIT")
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pRegistryPath)
{
        NTSTATUS status = STATUS_SUCCESS;
        //**********************************************************
        //Hook        SSDT
        //**********************************************************
        PULONG        Address;
        PULONG  HookPoint;
        _asm
        {
                pushad
                mov        ebx,KeServiceDescriptorTable ;这里获取到SSDT服务的首地址
                mov        ebx,[ebx] ;将SSDT首地址值放入EBX寄存器中
                mov        eax,0x7a ;我们知道在XP系统中122号SSDT索引号为NtOpenProcess函数地址
                shl        eax,2 ;左移两位表示EAX值乘以4
                add        ebx,eax ;在SSDT基址的基础上加上偏移值就是NtOpenProcess的地址值勤
                mov        HookPoint,ebx ;将获取到的地址值赋值给HookPoint指针变量
                mov        edx,[ebx] ;将NOpenProcess函数地址值放入EDX寄存器
                mov        Address,edx ;将NOpenProcess函数地址值赋值给Address指针变量
                popad
        }
         RealOpenProcess = (NTOPENPROCESS)(Address); //这里将真实的NOpenProcess函数地址值备份保存下来
         DbgPrint("Address of Real NtOpenProcess:0x%08x\n",(Address));
         DbgPrint("Address of Fake NtOpenProcess:0x%08x\n",MyNtOpenProcess);

        //关中断,并关闭页保护属性

_asm

        {
                cli
                mov        eax,cr0
                and        eax,not 10000h
                mov        cr0,eax
        }
        *HookPoint = (ULONG)MyNtOpenProcess; //将真实的NtOpenProcess地址值替换成我们自定义函数的地址值,实现HOOK

       //打开中断,并恢复页保据属性

 _asm

        {
                mov        eax,cr0
                or        eax,10000h
                mov        cr0,eax
                sti
        }
        pDriverObject->DriverUnload = Unload; //卸载例程
        return status;
}

#pragma code_seg("PAGE")
VOID Unload(PDRIVER_OBJECT pDriverObject)

{

//没什么好说的,功能就是卸载时将SSDT中的NtOpenProcess地址值恢复回去,与上面的一样*HookPoint = (ULONG)RealOpenProcess;只不过 //这句是将真实的SSDT中的NtOpenProcess地址恢复回去

        PULONG HookPoint;
        _asm
        {
                pushad
                mov        ebx,KeServiceDescriptorTable
                mov        ebx,[ebx]
                mov        eax,0x7a
                shl        eax,2
                add        ebx,eax
                mov        HookPoint,ebx
                popad
        }
        _asm
        {
                cli
                mov        eax,cr0
                and        eax,not 10000h
                mov        cr0,eax
        }
        *HookPoint = (ULONG)RealOpenProcess;
        _asm
        {
                mov        eax,cr0
                or        eax,10000h
                mov        cr0,eax
                sti
        }
        return;
}

NTSTATUS MyNtOpenProcess(OUT PHANDLE ProcessHandle, 
                                                 IN ACCESS_MASK AccessMask, 
                                                 IN POBJECT_ATTRIBUTES pObjatt, 
                                                 IN PCLIENT_ID Client)

{

//HOOK到以后就可以做我们自己想做的事情了

        NTSTATUS status = STATUS_SUCCESS;
        PEPROCESS lpPEPROCESS;
        PUCHAR ProcessName;
        status = PsLookupProcessByProcessId(Client->UniqueProcess,&lpPEPROCESS);
        if (NT_SUCCESS(status))
        {
                ProcessName = _strupr((PCHAR)PsGetProcessImageFileName(lpPEPROCESS));
                if (strcmp(ProcessName,"NOTEPAD.EXE") == 0)
                {
                        return STATUS_ACCESS_DENIED;
                }

        }
        status = RealOpenProcess(ProcessHandle,AccessMask,pObjatt,Client);
        return status;
}

相关文章推荐

SSDT表的Hook原理和示例代码

  • 2015年06月25日 16:29
  • 100KB
  • 下载

Hook SSDT NtOpenProcess的完整代码

以下是通过Hook SSDT NtOpenProcess保护进程的完整代码,对喜欢HOOK的初学者帮助很大 驱动代码Protect.C: #include "ntddk.h" ...

读取无保护的SSDT表中的NtOpenProcess函数的当前地址

// 无技术含量,是抄来的,驱动已入门的请飘过 /**********************************************************************...

内核编程之SSDTHook(2)Hook NtOpenProcess实现进程保护

本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处: 上一篇博文“内核编程之SSDTHook(1)原理(地址:)”中,介绍了SSDTHook的...

SSDT HOOK中的获取函数服务号

SSDT HOOK中的获取函数服务号:(因为SSDT中的函数在ntdll.dll均为导出函数) R3下:1)LoadLibrary  "ntdll.dll"          2)GetProcA...

SSDT Hook实现内核级的进程保护

SSDT Hook效果图 加载驱动并成功Hook  NtTerminateProcess函数: 当对 指定的进程进行保护后,尝试使用“任务管理器”结束进程的时候,会弹出“拒绝访问”...
  • php_fly
  • php_fly
  • 2013年06月29日 17:02
  • 3078

HOOK示例代码

  • 2014年11月07日 16:43
  • 718KB
  • 下载

进程隐藏与进程保护(SSDT Hook 实现)(二)

进程隐藏与进程保护(SSDT Hook 实现)(二) 文章目录:                   1. 引子 – Demo 实现效果: 2. 进...
  • pi9nc
  • pi9nc
  • 2013年06月12日 16:38
  • 3264

进程隐藏与进程保护(SSDT Hook 实现)(二 视频加密软件推荐

文章目录:                   1. 引子 – Demo 实现效果: 2. 进程隐藏与进程保护概念: 3. SSDT Hook 框架搭建: 4. Ring...
  • xuplus
  • xuplus
  • 2014年06月30日 22:26
  • 1640
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:针对 NtOpenProcess服务函数HOOK SSDT示例代码,保护记事本进程
举报原因:
原因补充:

(最多只允许输入30个字)