首页
社区
课程
招聘
关于SSDT HOOK
发表于: 2010-3-30 12:44 4549

关于SSDT HOOK

2010-3-30 12:44
4549
#include<ntddk.h>
typedef unsigned char BYTE;
VOID Hook();
VOID Unhook();
ULONG OldServiceAddress;
ULONG JmpAddress;
typedef struct _SERVICE_DESCRIPTOR_TABLE
{
  PVOID   ServiceTableBase;
  PULONG  ServiceCounterTableBase;
  ULONG   NumberOfService;
  ULONG   ParamTableBase;
}SERVICE_DESCRIPTOR_TABLE,*PSERVICE_DESCRIPTOR_TABLE; //由于KeServiceDescriptorTable只有一项
extern PSERVICE_DESCRIPTOR_TABLE    KeServiceDescriptorTable;//KeServiceDescriptorTable为导出函数

VOID Hook()
{
ULONG  Address;
BYTE data[20] = {0};
Address= (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x7A * 4;//0x7A为;
OldServiceAddress=*(ULONG*)Address;
JmpAddress = (ULONG)NtOpenProcess + 15; 

  __asm{//去掉内存保护
    cli
    mov  eax,cr0
    and  eax,not 10000h
    mov  cr0,eax
  }
memcpy(NtOpenProcess,data,15);
*((ULONG*)Address) = (ULONG)data;//HOOK SSDT
  __asm{//恢复内存保护  
    mov  eax,cr0
    or   eax,10000h
    mov  cr0,eax
    sti
  }


}
VOID OnUnload(IN PDRIVER_OBJECT DriverObject);
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
  DriverObject->DriverUnload = OnUnload;
  Hook();
  return STATUS_SUCCESS;
}

VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
{
  DbgPrint("Unhooker unload!");

}



小弟刚学编写驱动。此代码会蓝屏 求教各路大神 求教各路大牛 求教各位教主 求教……

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
VOID Hook()
{
ULONG  Address;
BYTE data[20] = {0};
Address= (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x7A * 4;//0x7A为;
OldServiceAddress=*(ULONG*)Address;
JmpAddress = (ULONG)NtOpenProcess + 15;

data[15] = 0xE9;                                   // 少了这两句!
memcpy(&data[15], &JmpAddress, 4);  // 少了这两句!

  __asm{//去掉内存保护
    cli
    mov  eax,cr0
    and  eax,not 10000h
    mov  cr0,eax
  }
memcpy(NtOpenProcess,data,15);
*((ULONG*)Address) = (ULONG)data;//HOOK SSDT
  __asm{//恢复内存保护  
    mov  eax,cr0
    or   eax,10000h
    mov  cr0,eax
    sti
  }

}
2010-3-30 13:37
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
// 这句也是错!
memcpy(NtOpenProcess,data,15);

// 应该是
memcpy(data, NtOpenProcess, 15);
2010-3-30 13:40
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
data[15] = 0xE9;                                   // 少了这两句!
memcpy(&data[16], &JmpAddress, 4);  // 少了这两句!
2010-3-30 13:41
0
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
还是蓝了 听说WINDBG可以分析蓝屏的原因 但是我不知道怎么操作 请教各位大神
2010-3-30 17:58
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这个绝对不会蓝屏了!

#include <ntddk.h>

WCHAR DEVICE_NAME[256] = L"\\Device\\test";
WCHAR DEVICE_LINK[256] = L"\\DosDevices\\test";

typedef struct _SERVICE_DESCRIPTOR_TABLE
{
  PVOID   ServiceTableBase;
  PULONG  ServiceCounterTableBase;
  ULONG   NumberOfService;
  ULONG   ParamTableBase;
} SERVICE_DESCRIPTOR_TABLE,*PSERVICE_DESCRIPTOR_TABLE;

_declspec (dllimport) SERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable[2];

typedef NTSTATUS (NTAPI *fNtOpenProcess) (
    PHANDLE ProcessHandle,
    ACCESS_MASK DesiredAccess,
    POBJECT_ATTRIBUTES ObjectAttributes,
    PCLIENT_ID ClientId
    );
   
fNtOpenProcess OrigNtOpenProcess = NULL;

NTSTATUS
MyNtOpenProcess (
    PHANDLE ProcessHandle,
    ACCESS_MASK DesiredAccess,
    POBJECT_ATTRIBUTES ObjectAttributes,
    PCLIENT_ID ClientId
    )
{
        DbgPrint("MyNtOpenProcess: Hooked!\n");
        return OrigNtOpenProcess(ProcessHandle, DesiredAccess, ObjectAttributes, ClientId);
}

void Hook()
{
        ULONG *pSSDT = NULL;
       
        pSSDT = (ULONG *) KeServiceDescriptorTable[0].ServiceTableBase;
       
        DbgPrint("KeServiceDescriptorTable.ServiceTableBase: 0x%X\r\n", pSSDT);
       
        __asm
        {
                cli
                mov  eax,cr0
                and  eax,not 10000h
                mov  cr0,eax
        }

        OrigNtOpenProcess = (PVOID) InterlockedExchange((PLONG) &pSSDT[0x7A], (LONG) MyNtOpenProcess);
       
        __asm
        {
                mov  eax,cr0
                or   eax,10000h
                mov  cr0,eax
                sti
        }
}

void UnHook()
{
        ULONG *pSSDT = NULL;
       
        pSSDT = (ULONG *) KeServiceDescriptorTable[0].ServiceTableBase;
       
        DbgPrint("KeServiceDescriptorTable.ServiceTableBase: 0x%X\r\n", pSSDT);
       
        __asm
        {
                cli
                mov  eax,cr0
                and  eax,not 10000h
                mov  cr0,eax
        }

        InterlockedExchange((PLONG) &pSSDT[0x7A], (LONG) OrigNtOpenProcess);
       
        __asm
        {
                mov  eax,cr0
                or   eax,10000h
                mov  cr0,eax
                sti
        }
}

NTSTATUS DispatchCreateClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
        Irp->IoStatus.Status = STATUS_SUCCESS;
        Irp->IoStatus.Information = 0;

        IoCompleteRequest(Irp, IO_NO_INCREMENT);

        return STATUS_SUCCESS;
}

NTSTATUS DispatchIoctl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
        PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);
        ULONG ulOperation = irpStack->Parameters.DeviceIoControl.IoControlCode;
        NTSTATUS ntStatus = STATUS_SUCCESS;

        Irp->IoStatus.Information = 0;
        Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;

        IoCompleteRequest(Irp, IO_NO_INCREMENT);

        return ntStatus;
}

VOID UnloadDriver(IN PDRIVER_OBJECT DriverObject)
{
        PDEVICE_OBJECT deviceObject = DriverObject->DeviceObject;
        UNICODE_STRING ntWin32NameString;

        UnHook();
       
        RtlInitUnicodeString(&ntWin32NameString, DEVICE_LINK);

        IoDeleteSymbolicLink(&ntWin32NameString);

        if (deviceObject != NULL)
        {
                IoDeleteDevice(deviceObject);
        }
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
        NTSTATUS        ntStatus;
        UNICODE_STRING  ntUnicodeString;
        UNICODE_STRING  ntWin32NameString;
        PDEVICE_OBJECT  deviceObject = NULL;

        DbgPrint("DriverEntry: Entering...\n");

        RtlInitUnicodeString(&ntUnicodeString, DEVICE_NAME);

        DbgPrint("DriverEntry: Name of device: %wZ\r\n", &ntUnicodeString);

        ntStatus = IoCreateDevice(
                DriverObject,
                0,
                &ntUnicodeString,
                FILE_DEVICE_UNKNOWN,
                FILE_DEVICE_SECURE_OPEN,
                FALSE,
                &deviceObject
                );

        if (!NT_SUCCESS(ntStatus))
        {
                DbgPrint("DriverEntry: IoCreateDevice error!\n");
                return ntStatus;
        }

        // Initialize the driver object with the driver functions
        DriverObject->DriverUnload                                                        = UnloadDriver;
        DriverObject->MajorFunction[IRP_MJ_CREATE]                        = DispatchCreateClose;
        DriverObject->MajorFunction[IRP_MJ_CLOSE]                        = DispatchCreateClose;
        DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]        = DispatchIoctl;
       
        RtlInitUnicodeString(&ntWin32NameString, DEVICE_LINK);

        DbgPrint("DriverEntry: Symbolic Link of device: %wZ\r\n", &ntWin32NameString);

        // Create symbolic link for our device
        ntStatus = IoCreateSymbolicLink(&ntWin32NameString, &ntUnicodeString);

        if (!NT_SUCCESS(ntStatus))
        {
                IoDeleteDevice(deviceObject);
        }
       
        Hook();

        DbgPrint("DriverEntry: Leaving...\n");

        return ntStatus;
}
2010-3-31 09:55
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这里有两个很好的教材:

WinDBG & VMWare:
02bK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4y4A6L8s2k6W2M7Y4y4@1M7W2)9J5k6i4g2X3K9h3g2K6i4K6u0W2L8%4u0Y4i4K6u0r3L8r3!0@1M7U0m8Q4x3V1k6%4K9h3&6V1j5X3N6Q4x3X3c8$3L8i4N6S2M7X3g2Q4x3X3g2Z5N6r3#2D9

e69K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4c8J5j5h3&6K6L8r3q4@1k6g2)9J5k6h3N6G2L8$3N6D9k6g2)9J5k6h3y4G2L8g2)9J5k6h3S2C8i4K6u0r3N6s2u0S2L8Y4y4D9j5i4c8W2i4K6y4r3K9r3I4Q4x3@1c8*7K9q4)9J5k6q4c8i4i4K6t1$3M7$3I4Q4x3@1c8W2L8W2)9J5y4Y4c8D9i4K6y4p5P5X3S2Q4x3X3c8o6e0W2)9J5y4Y4g2Q4x3@1c8Z5N6s2c8H3i4K6t1#2x3@1q4Q4x3U0f1J5c8W2)9J5y4e0u0r3M7$3W2D9N6X3g2J5M7%4c8J5i4K6u0W2N6h3k6A6k6i4y4Q4x3X3g2G2M7X3N6Q4x3U0f1J5c8X3I4G2N6s2t1H3i4K6t1#2x3V1k6%4K9h3&6V1j5X3N6Q4x3X3c8$3L8i4N6S2M7X3g2Q4x3X3g2Z5N6r3#2D9

473K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3y4S2N6r3y4Z5x3U0u0Q4x3X3g2F1k6i4c8Q4x3V1k6@1N6i4c8K6i4K6u0r3N6X3#2%4j5i4u0W2

9c4K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4c8J5j5h3&6K6L8r3q4@1k6g2)9J5k6h3N6G2L8$3N6D9k6g2)9J5k6h3y4G2L8g2)9J5k6h3S2C8i4K6u0r3N6s2u0S2L8Y4y4D9j5i4c8W2i4K6y4r3K9r3I4Q4x3@1c8*7K9q4)9J5k6q4c8i4i4K6t1$3M7$3I4Q4x3@1c8W2L8W2)9J5y4Y4g2Q4x3@1c8Z5N6s2c8H3i4K6y4m8i4K6u0r3i4K6u0r3N6%4N6%4i4K6u0W2j5$3q4@1j5$3R3J5x3W2)9J5k6h3&6W2N6q4)9J5c8Y4c8#2N6s2y4Q4x3V1k6$3L8i4N6S2M7X3g2Q4x3U0k6W2K9g2)9K6c8r3f1$3y4Y4W2e0i4K6g2X3P5X3!0u0d9h3&6s2M7V1q4W2d9%4S2@1L8g2u0n7b7g2)9J5y4Y4y4S2i4K6y4p5h3q4)9J5y4X3!0A6i4K6y4p5N6s2u0S2L8Y4y4D9j5i4c8W2i4K6t1$3j5%4c8Q4x3@1c8J5k6i4y4#2L8s2c8Q4x3U0k6J5k6i4y4F1N6h3#2Q4x3@1b7J5i4K6t1$3N6X3g2V1i4K6y4p5x3p5y4n7f1g2p5%4k6@1g2%4b7g2q4Q4x3U0k6H3M7X3g2$3i4K6y4p5i4K6u0r3M7$3g2S2M7X3y4Z5i4K6t1#2x3@1k6I4i4K6t1#2x3@1c8d9k6h3#2G2N6r3g2Q4x3U0f1J5b7X3c8W2j5Y4g2Y4k6$3W2F1k6#2)9J5y4e0u0n7N6$3W2F1k6r3u0Y4i4K6t1#2x3V1u0F1N6h3I4D9i4K6t1#2x3V1u0U0j5h3u0D9k6g2)9J5y4e0t1$3K9r3I4Q4x3U0f1K6c8s2A6Z5i4K6u0V1g2q4N6Q4x3U0f1J5y4Y4y4S2i4K6t1#2x3@1c8s2
2010-3-31 10:10
0
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
大神 能透露下QQ吗 好讨论
2010-3-31 10:13
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
QQ 834919515
2010-3-31 14:20
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
听说WINDBG可以分析蓝屏的原因 但是我不知道怎么操作
2010-4-1 16:47
0
游客
登录 | 注册 方可回帖
返回