SSDThook

SSDT hook整个流程:

获取SSDT表,自定义函数替换表中函数地址。


通过以下的方式获取SSDT表的内容:

typedef struct ServiceDescriptorTable
    {
    PVOID ServiceTableBase;
    PVOID ServiceCounterTable;
    unsigned int NumberOfSection;
    PVOID ParamTableBase;
    }*PServiceDescriptorTable;
extern "C" PServiceDescriptorTable KeServiceDescriptorTable;


自定义函数:MyNtOpenProcess

extern "C" typedef NTSTATUS _stdcall NTOPENPROCESS
    (
    OUT PHANDLE ProcessHandle,
    IN ACCESS_MASK AccessMask,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    IN PCLIENT_ID ClientId
    );
NTOPENPROCESS *Real_NtOpenProcess;
extern "C" NTSTATUS _stdcall MyNtOpenProcess(
    OUT PHANDLE ProcessHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    IN PCLIENT_ID ClientId
    )
    {
    NTSTATUS  rc;
    rc = Real_NtOpenProcess(ProcessHandle,DesiredAccess,ObjectAttributes,ClientId);;
    int PID = (int)ClientId->UniqueProcess;
    if(PID == g_MyPID &&-1 != g_MyPID)
        {
        KdPrint(("阻止的PID =========%d",PID));
        ProcessHandle = NULL;
        rc = STATUS_ACCESS_DENIED;
        }
    return rc;
    }

hook  函数:

NTSTATUS Hook()
    {
    //Real_NtOpenProcess 
    int* HookAddr;
    _asm{
        push eax;
        push ebx;
        mov ebx,KeServiceDescriptorTable;
        mov ebx,[ebx];
        mov eax,0xBE;
        shl eax,2;
        add ebx,eax;
        mov HookAddr,ebx;
        mov ebx,[ebx];
        mov Real_NtOpenProcess,ebx;
        pop ebx;
        pop eax;
        }
    KdPrint(("Real_NtOpenProcess ====%x",Real_NtOpenProcess));
    _asm{
        cli
        mov eax,cr0;
        and eax,0xfffeffff;
        mov cr0,eax;
        }
    *HookAddr = (int)MyNtOpenProcess;
    _asm{
        mov eax,cr0;
        or eax,0x10000;
        mov cr0,eax;
        sti;
        }
    return STATUS_SUCCESS;
    }

unHook 函数:

NTSTATUS UnHook()
    {
    int *HookAddr;
    _asm{
        pushad;
        mov eax,KeServiceDescriptorTable;
        mov eax,[eax];
        mov ebx,0xBE;
        shl ebx,2;
        add eax,ebx;
        mov HookAddr,eax;
        popad;
        }
    _asm{
        cli
        mov eax,cr0;
        and eax,0xfffeffff;
        mov cr0,eax;
        }
    KdPrint(("operator of Unhook is successe  Real_NtOpenProcess = %x ",Real_NtOpenProcess));
    *HookAddr = (int)Real_NtOpenProcess;
    _asm{
        mov eax,cr0;
        or eax,0x10000;
        mov cr0,eax;
        }
    return STATUS_SUCCESS;
    }


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值