首页
社区
课程
招聘
[求助]关于hook ssdt
发表于: 2014-2-8 13:51 3876

[求助]关于hook ssdt

2014-2-8 13:51
3876
我是新手,喜欢看驱动编程,现在测试ssdt hook那个ntcreatprocessex。代码如下,总是蓝屏,测试环境是xinxp。ddk编译通过。
#include <ntddk.h>

typedef struct _SERVICE_DESCRIPTOR_TABLE
{
    PULONG ServiceTableBase;
    PULONG ServiceCounterTableBase;
    ULONG  NumberOfServices;
    PUCHAR ParamTableBase;
}SERVICE_DESCRIPTOR_TABLE, *PSERVICE_DESCRIPTOR_TABLE;

extern PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;

typedef NTSTATUS (*NTCREATEPROCESSEX)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, HANDLE, ULONG, HANDLE, HANDLE, HANDLE, ULONG);

// 保存NtCreateProcesEx函数的地址
NTCREATEPROCESSEX ulNtCreateProcessEx = 0;
// 在指针数组中NtCreateProcessEx的地址
ULONG ulNtCreateProcessExAddr = 0;

VOID UN_PROTECT()
{
    __asm
    {
        push eax
        mov  eax, CR0
        and  eax, 0FFFEFFFFh
        mov  CR0, eax
        pop  eax
    }
}

VOID RE_PROTECT()
{
    __asm
    {
        push eax
        mov  eax, CR0
        or   eax, 0FFFEFFFFh
        mov  CR0, eax
        pop  eax
    }
}

VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
{   
    UN_PROTECT();
   
    // 替换NtCreateProcessEx的地址为MyNtCreateProcessEx
    *(PULONG)ulNtCreateProcessExAddr = (ULONG)ulNtCreateProcessEx;
   
    RE_PROTECT();
}

NTSTATUS
MyNtCreateProcessEx(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN HANDLE ParentProcess,
IN ULONG Flags,
IN HANDLE SectionHandle,
IN HANDLE DebugPort,
IN HANDLE ExceptionPort,
IN ULONG JobMemberLevel
)
{
    NTSTATUS Status = STATUS_SUCCESS;
    KdPrint(("Enter MyNtCreateProcessEx! \r\n"));
   
    Status = ulNtCreateProcessEx(ProcessHandle,
                        DesiredAccess,
                        ObjectAttributes,
                        ParentProcess,
                        Flags,
                        SectionHandle,
                        DebugPort,
                        ExceptionPort,
                        JobMemberLevel);
   
    return Status;
}

VOID HookCreateProcess()
{
    ULONG ulSsdt = 0;
    // 保存NtCreateProces的地址
    // 获取SSDT
    ulSsdt = (ULONG)KeServiceDescriptorTable->ServiceTableBase;
   
    // 获取NtCreateProcessEx地址的指针
    ulNtCreateProcessExAddr = ulSsdt + 0x30 * 4;
    // 备份NtCreateProcessEx的原始地址
    ulNtCreateProcessEx = (NTCREATEPROCESSEX)*(PULONG)ulNtCreateProcessExAddr;
   
    UN_PROTECT();
   
    // 替换NtCreateProcessEx的地址为MyNtCreateProcessEx
    *(PULONG)ulNtCreateProcessExAddr = (ULONG)MyNtCreateProcessEx;
   
    RE_PROTECT();
}

NTSTATUS DriverEntry(
                PDRIVER_OBJECT pDriverObject,
                PUNICODE_STRING pRegistryPath
                )
{
    NTSTATUS Status = STATUS_SUCCESS;
    pDriverObject->DriverUnload = DriverUnload;
   
    HookCreateProcess();

    return Status;
}

请大侠帮忙啊!!

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

上传的附件:
收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 1392
活跃值: (4867)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
2
楼主好ID

若是自己真心想学这个还是从头看起比较好。若是想速成看看郁金香的教程也就足够了。
2014-2-8 14:24
0
雪    币: 195
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
您好,我最基础的都看过了,现在就在调试这个,但是怎么也通不过,总是蓝屏。
2014-2-8 15:08
0
雪    币: 1392
活跃值: (4867)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
4
多用kdprint打印调试信息。先不着急HOOK。先打印 函数地址 跳转地址一类的信息多看看那,感觉SSDT HOOK还是比较简单的
2014-2-8 15:28
0
雪    币: 195
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
试过了,地址什么的没什么问题哈。
2014-2-8 15:52
0
雪    币: 195
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
#include <ntddk.h>

typedef struct _SERVICE_DESCRIPTOR_TABLE
{
    PULONG ServiceTableBase;
    PULONG ServiceCounterTableBase;
    ULONG  NumberOfServices;
    PUCHAR ParamTableBase;
}SERVICE_DESCRIPTOR_TABLE, *PSERVICE_DESCRIPTOR_TABLE;

extern PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;

typedef NTSTATUS (*NTCREATEPROCESSEX)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, HANDLE, ULONG, HANDLE, HANDLE, HANDLE, ULONG);

// 保存NtCreateProcesEx函数的地址
NTCREATEPROCESSEX ulNtCreateProcessEx = 0;
// 在指针数组中NtCreateProcessEx的地址
ULONG ulNtCreateProcessExAddr = 0;

VOID UN_PROTECT()
{
    __asm
    {
        cli
                        mov  eax,cr0
                        and  eax,not 10000h
                        mov  cr0,eax
    }
}

VOID RE_PROTECT()
{
    __asm
    {
      mov  eax,cr0
                        or   eax,10000h
                        mov  cr0,eax
                        sti
    }
}

VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
{   
    UN_PROTECT();
   
    // 替换NtCreateProcessEx的地址为MyNtCreateProcessEx
    *(PULONG)ulNtCreateProcessExAddr = (ULONG)ulNtCreateProcessEx;
   
    RE_PROTECT();
}

NTSTATUS
MyNtCreateProcessEx(
OUT PHANDLE ProcessHandle,
            IN ACCESS_MASK DesiredAccess,
            IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
            IN HANDLE ParentProcess,
            IN BOOLEAN InheritObjectTable,
            IN HANDLE SectionHandle OPTIONAL,
            IN HANDLE DebugPort OPTIONAL,
            IN HANDLE ExceptionPort OPTIONAL,
            IN BOOLEAN InJob)

{
    NTSTATUS Status = STATUS_SUCCESS;
    KdPrint(("Enter MyNtCreateProcessEx! \r\n"));
   
    Status = ulNtCreateProcessEx(ProcessHandle,
                        DesiredAccess,
                        ObjectAttributes,
                        ParentProcess,
                        InheritObjectTable,
                        SectionHandle,
                        DebugPort,
                        ExceptionPort,
                        InJob);
   
    return Status;
}

VOID HookCreateProcess()
{
    ULONG ulSsdt = 0;
    // 保存NtCreateProces的地址
    // 获取SSDT
    ulSsdt = (ULONG)KeServiceDescriptorTable->ServiceTableBase;
   
    // 获取NtCreateProcessEx地址的指针
    ulNtCreateProcessExAddr = ulSsdt + 0x30 * 4;
    // 备份NtCreateProcessEx的原始地址
    ulNtCreateProcessEx = (NTCREATEPROCESSEX)*(PULONG)ulNtCreateProcessExAddr;
   
    UN_PROTECT();
   
    // 替换NtCreateProcessEx的地址为MyNtCreateProcessEx
    *(PULONG)ulNtCreateProcessExAddr = (ULONG)MyNtCreateProcessEx;
   
    RE_PROTECT();
}

NTSTATUS DriverEntry(
                PDRIVER_OBJECT pDriverObject,
                PUNICODE_STRING pRegistryPath
                )
{
    NTSTATUS Status = STATUS_SUCCESS;
    pDriverObject->DriverUnload = DriverUnload;
   
    HookCreateProcess();

    return Status;
}

搞好了,似乎一个是cr0的设置有问题,还有就是NtCreateProcessEx的参数不对,改好就好了
2014-2-8 16:20
0
游客
登录 | 注册 方可回帖
返回
//