内核钩子实例(稳定)

Windows内核SSDT钩子技术详解与实践 SSDT(System Service Dispatch Table)Hooking是一种在Windows操作系统内核模式下进行系统调用拦截的技术。通过在SSDT中替换原有的系统服务函数入口地址,拦截器可以在系统服务函数被调用时插入自定义代码,从而实现对系统服务的监控和控制。SSDT Hooking技术的工作原理可以分为以下几个步骤:定位SSDT表:首先,需要定位到当前操作系统的SSDT表,该表在不同版本的Windows系统中可能有所差异。 阅读详情

#include <ntddk.h>
#include <ntimage.h>

#pragma pack(1)
typedef struct ServiceDescriptorEntry {
    unsigned int *ServiceTableBase;
    unsigned int *ServiceCounterTableBase; //Used only in checked build
    unsigned int NumberOfServices;
    unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
#pragma pack()

__declspec(dllimport)  ServiceDescriptorTableEntry_t KeServiceDescriptorTable;
#define SYSTEMSERVICE(_function) KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]
#define SDT     SYSTEMSERVICE
#define KSDT KeServiceDescriptorTable

//---------------------------------------------------------------------------
//
// Defines
// 
//---------------------------------------------------------------------------

#define FILE_DEVICE_UNKNOWN            0x00000022
#define IOCTL_UNKNOWN_BASE              FILE_DEVICE_UNKNOWN
#define IOCTL_INIT                       CTL_CODE(IOCTL_UNKNOWN_BASE, 0x0800, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)

/********************************************************************************

    补充定义数据及结构

********************************************************************************/

typedef struct _INITIAL_TEB {
  PVOID                StackBase;
  PVOID                StackLimit;
  PVOID                StackCommit;
  PVOID                StackCommitMax;
  PVOID                StackReserved;
} INITIAL_TEB, *PINITIAL_TEB;

typedef enum _SYSTEM_INFORMATION_CLASS
{
    SystemBasicInformation,
    SystemProcessorInformation,
    SystemPerformanceInformation,
    SystemTimeOfDayInformation,
    SystemNotImplemented1,
    SystemProcessesAndThreadsInformation,
    SystemCallCounts,
    SystemConfigurationInformation,
    SystemProcessorTimes,
    SystemGlobalFlag,
    SystemNotImplemented2,
    SystemModuleInformation,
    SystemLockInformation,
    SystemNotImplemented3,
    SystemNotImplemented4,
    SystemNotImplemented5,
    SystemHandleInformation,
    SystemObjectInformation,
    SystemPagefileInformation,
    SystemInstructionEmulationCounts,
    SystemInvalidInfoClass1,
    SystemCacheInformation,
    SystemPoolTagInformation,
    SystemProcessorStatistics,
    SystemDpcInformation,
    SystemNotImplemented6,
    SystemLoadImage,
    SystemUnloadImage,
    SystemTimeAdjustment,
    SystemNotImplemented7,
    SystemNotImplemented8,
    SystemNotImplemented9,
    SystemCrashDumpInformation,
    SystemExceptionInformation,
    SystemCrashDumpStateInformation,
    SystemKernelDebuggerInformation,
    SystemContextSwitchInformation,
    SystemRegistryQuotaInformation,
    SystemLoadAndCallImage,
    SystemPrioritySeparation,
    SystemNotImplemented10,
    SystemNotImplemented11,
    SystemInvalidInfoClass2,
    SystemInvalidInfoClass3,
    SystemTimeZoneInformation,
    SystemLookasideInformation,
    SystemSetTimeSlipEvent,
    SystemCreateSession,
    SystemDeleteSession,
    SystemInvalidInfoClass4,
    SystemRangeStartInformation,
    SystemVerifierInformation,
    SystemAddVerifier,
    SystemSessionProcessesInformation
} SYSTEM_INFORMATION_CLASS;

typedef struct _SYSTEM_HANDLE_INFORMATION
{
    ULONG            ProcessId;
    UCHAR            ObjectTypeNumber;
    UCHAR            Flags;
    USHORT          Handle;
    PVOID            Object;
    ACCESS_MASK      GrantedAccess;
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;

/*************************************************************************************************

     私有变量

*************************************************************************************************/

typedef struct _DEVICE_EXTENSION
{
    PDEVICE_OBJECT DeviceObject;
    PKEVENT Event;

    BOOLEAN bPCreate;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;


//    全局设备对象
PDEVICE_OBJECT g_pDeviceObject;

UNICODE_STRING g_RegPath;

/********************************************************************************

    补充定义函数

********************************************************************************/

NTKERNELAPI NTSTATUS ObQueryNameString (
    IN PVOID                        Object,
    IN OUT PUNICODE_STRING            Name,
    IN ULONG                        MaximumLength,
    OUT PULONG                      ActualLength
);

NTKERNELAPI NTSTATUS ZwSetSecurityObject(
    IN HANDLE Handle,
    IN SECURITY_INFORMATION SecurityInformation,
    IN PSECURITY_DESCRIPTOR SecurityDescriptor
    );

NTKERNELAPI NTSTATUS ZwTerminateProcess(
  IN HANDLE              ProcessHandle OPTIONAL,
  IN NTSTATUS            ExitStatus );

NTKERNELAPI NTSTATUS ZwOpenProcess(
  OUT PHANDLE            ProcessHandle,
  IN ACCESS_MASK          AccessMask,
  IN POBJECT_ATTRIBUTES  ObjectAttributes,
  IN PCLIENT_ID          ClientId );

NTKERNELAPI NTSTATUS ZwOpenThread(
  OUT PHANDLE            ThreadHandle,
  IN ACCESS_MASK          AccessMask,
  IN POBJECT_ATTRIBUTES  ObjectAttributes,
  IN PCLIENT_ID          ClientId );

NTKERNELAPI NTSTATUS ZwLoadDriver(
  IN PUNICODE_STRING DriverServiceName );

NTKERNELAPI NTSTATUS ZwSetSystemInformation(
  IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
  IN PVOID                SystemInformation,
  IN ULONG                SystemInformationLength );

NTKERNELAPI NTSTATUS ZwQuerySystemInformation(
  IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
  OUT PVOID              SystemInformation,
  IN ULONG                SystemInformationLength,
  OUT PULONG              ReturnLength OPTIONAL );


/***********************************************************************************

    函数声明

***********************************************************************************/

NTSTATUS DriverEntry(
  IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
void UnloadDriver(PDRIVER_OBJECT DriverObject);
NTSTATUS DispatchCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS DispatchClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS DispatchIoCtrl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);

void StartHook(void);
void RemoveHook(void);


NTSTATUS Hook_ZwWriteFile(
  IN HANDLE              FileHandle,
  IN HANDLE              Event OPTIONAL,
  IN PIO_APC_ROUTINE      ApcRoutine OPTIONAL,
  IN PVOID                ApcContext OPTIONAL,
  OUT PIO_STATUS_BLOCK    IoStatusBlock,
  IN PVOID                Buffer,
  IN ULONG                Length,
  IN PLARGE_INTEGER      ByteOffset OPTIONAL,
  IN PULONG              Key OPTIONAL );

NTSTATUS Hook_ZwReadFile(
  IN HANDLE              FileHandle,
  IN HANDLE              Event OPTIONAL,
  IN PIO_APC_ROUTINE      ApcRoutine OPTIONAL,
  IN PVOID                ApcContext OPTIONAL,
  OUT PIO_STATUS_BLOCK    IoStatusBlock,
  OUT PVOID              Buffer,
  IN ULONG                Length,
  IN PLARGE_INTEGER      ByteOffset OPTIONAL,
  IN PULONG              Key OPTIONAL );

NTSTATUS Hook_ZwSetSystemInformation(
  IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
  IN PVOID                SystemInformation,
  IN ULONG                SystemInformationLength );

NTSTATUS Hook_ZwQuerySystemInformation(
  IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
  OUT PVOID              SystemInformation,
  IN ULONG                SystemInformationLength,
  OUT PULONG              ReturnLength OPTIONAL );

NTSTATUS Hook_ZwLoadDriver(
  IN PUNICODE_STRING DriverServiceName );

NTSTATUS Hook_ZwSetSecurityObject(
  IN HANDLE              ObjectHandle,
  IN SECURITY_INFORMATION SecurityInformationClass,
  IN PSECURITY_DESCRIPTOR DescriptorBuffer);

NTSTATUS Hook_ZwOpenKey(
    OUT PHANDLE  KeyHandle,
    IN ACCESS_MASK  DesiredAccess,
    IN POBJECT_ATTRIBUTES  ObjectAttributes);

NTSTATUS Hook_ZwCreateKey (
    OUT PHANDLE KeyHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    IN ULONG TitleIndex,
    IN PUNICODE_STRING Class OPTIONAL,
    IN ULONG CreateOptions,
    OUT PULONG Disposition OPTIONAL);

NTSTATUS Hook_ZwSetValueKey(
    IN HANDLE  KeyHandle,
    IN PUNICODE_STRING  ValueName,
    IN ULONG  TitleIndex  OPTIONAL,
    IN ULONG  Type,
    IN PVOID  Data,
    IN ULONG  DataSize);

NTSTATUS Hook_ZwDeleteKey(
  IN HANDLE  KeyHandle);

NTSTATUS Hook_ZwDeleteValueKey(
  IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName);

NTSTATUS Hook_ZwOpenSection(
  OUT PHANDLE            SectionHandle,
  IN ACCESS_MASK          DesiredAccess,
  IN POBJECT_ATTRIBUTES  ObjectAttributes );

NTSTATUS Hook_ZwCreateSection(
  OUT PHANDLE            SectionHandle,
  IN ULONG                DesiredAccess,
  IN POBJECT_ATTRIBUTES  ObjectAttributes OPTIONAL,
  IN PLARGE_INTEGER      MaximumSize OPTIONAL,
  IN ULONG                PageAttributess,
  IN ULONG                SectionAttributes,
  IN HANDLE              FileHandle OPTIONAL );

NTSTATUS Hook_ZwCreateProcess(
  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 );

NTSTATUS Hook_ZwCreateProcessEx(
    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 HANDLE UnknownHandle );

NTSTATUS Hook_ZwTerminateProcess(
  IN HANDLE              ProcessHandle OPTIONAL,
  IN NTSTATUS            ExitStatus );
NTSTATUS Hook_ZwOpenProcess(
  OUT PHANDLE            ProcessHandle,
  IN ACCESS_MASK          AccessMask,
  IN POBJECT_ATTRIBUTES  ObjectAttributes,
  IN PCLIENT_ID          ClientId );

NTSTATUS Hook_ZwCreateThread(
  OUT PHANDLE            ThreadHandle,
  IN ACCESS_MASK          DesiredAccess,
  IN POBJECT_ATTRIBUTES  ObjectAttributes OPTIONAL,
  IN HANDLE              ProcessHandle,
  OUT PCLIENT_ID          ClientId,
  IN PCONTEXT            ThreadContext,
  IN PINITIAL_TEB        InitialTeb,
  IN BOOLEAN              CreateSuspended );

NTSTATUS Hook_ZwTerminateThread(
  IN HANDLE              ThreadHandle,
  IN NTSTATUS            ExitStatus );

NTSTATUS Hook_ZwOpenThread(
  OUT PHANDLE            ThreadHandle,
  IN ACCESS_MASK          AccessMask,
  IN POBJECT_ATTRIBUTES  ObjectAttributes,
  IN PCLIENT_ID          ClientId );

NTSTATUS Hook_ZwCreateFile(
  OUT PHANDLE            FileHandle,
  IN ACCESS_MASK          DesiredAccess,
  IN POBJECT_ATTRIBUTES  ObjectAttributes,
  OUT PIO_STATUS_BLOCK    IoStatusBlock,
  IN PLARGE_INTEGER      AllocationSize OPTIONAL,
  IN ULONG                FileAttributes,
  IN ULONG                ShareAccess,
  IN ULONG                CreateDisposition,
  IN ULONG                CreateOptions,
  IN PVOID                EaBuffer OPTIONAL,
  IN ULONG                EaLength );

NTSTATUS Hook_ZwOpenFile(
  OUT PHANDLE            FileHandle,
  IN ACCESS_MASK          DesiredAccess,
  IN POBJECT_ATTRIBUTES  ObjectAttributes,
  OUT PIO_STATUS_BLOCK    IoStatusBlock,
  IN ULONG                ShareAccess,
  IN ULONG                OpenOptions );


NTSTATUS Hook_ZwClose(
  IN HANDLE ObjectHandle );

#ifdef ALLOC_PRAGMA

#pragma alloc_text(INIT, DriverEntry)
#pragma alloc_text(INIT, StartHook)

#pragma alloc_text(PAGE, DispatchCreate)
#pragma alloc_text(PAGE, DispatchClose)
#pragma alloc_text(PAGE, DispatchIoCtrl)
#pragma alloc_text(PAGE, RemoveHook)

#pragma alloc_text(PAGE, UnloadDriver)

#pragma alloc_text(PAGE, Hook_ZwOpenKey)
#pragma alloc_text(PAGE, Hook_ZwSetSecurityObject)
#pragma alloc_text(PAGE, Hook_ZwCreateKey)
#pragma alloc_text(PAGE, Hook_ZwSetValueKey)
#pragma alloc_text(PAGE, Hook_ZwDeleteKey)
#pragma alloc_text(PAGE, Hook_ZwDeleteValueKey)

#pragma alloc_text(PAGE, Hook_ZwOpenSection)
#pragma alloc_text(PAGE, Hook_ZwCreateSection)

#pragma alloc_text(PAGE, Hook_ZwOpenProcess)
#pragma alloc_text(PAGE, Hook_ZwTerminateProcess)


#pragma alloc_text(PAGE, Hook_ZwOpenThread)

#pragma alloc_text(PAGE, Hook_ZwCreateFile)
#pragma alloc_text(PAGE, Hook_ZwOpenFile)
#pragma alloc_text(PAGE, Hook_ZwClose)

#pragma alloc_text(PAGE, Hook_ZwLoadDriver)

#pragma alloc_text(PAGE, Hook_ZwSetSystemInformation)
#pragma alloc_text(PAGE, Hook_ZwQuerySystemInformation)

#pragma alloc_text(PAGE, Hook_ZwReadFile)
#pragma alloc_text(PAGE, Hook_ZwWriteFile)

#endif

/*******************************************************************************

  函数原型定义

********************************************************************************/


typedef NTSTATUS (*ZWLOADDRIVER)(
  IN PUNICODE_STRING DriverServiceName );

typedef NTSTATUS (*ZWCREATEFILE)(
  OUT PHANDLE            FileHandle,
  IN ACCESS_MASK          DesiredAccess,
  IN POBJECT_ATTRIBUTES  ObjectAttributes,
  OUT PIO_STATUS_BLOCK    IoStatusBlock,
  IN PLARGE_INTEGER      AllocationSize OPTIONAL,
  IN ULONG                FileAttributes,
  IN ULONG                ShareAccess,
  IN ULONG                CreateDisposition,
  IN ULONG                CreateOptions,
  IN PVOID                EaBuffer OPTIONAL,
  IN ULONG                EaLength );

typedef NTSTATUS (*ZWOPENFILE)(
  OUT PHANDLE            FileHandle,
  IN ACCESS_MASK          DesiredAccess,
  IN POBJECT_ATTRIBUTES  ObjectAttributes,
  OUT PIO_STATUS_BLOCK    IoStatusBlock,
  IN ULONG                ShareAccess,
  IN ULONG                OpenOptions );

typedef NTSTATUS (*ZWCLOSE)(
  IN HANDLE              ObjectHandle );

typedef NTSTATUS (*ZWWRITEFILE)(
  IN HANDLE              FileHandle,
  IN HANDLE              Event OPTIONAL,
  IN PIO_APC_ROUTINE      ApcRoutine OPTIONAL,
  IN PVOID                ApcContext OPTIONAL,
  OUT PIO_STATUS_BLOCK    IoStatusBlock,
  IN PVOID                Buffer,
  IN ULONG                Length,
  IN PLARGE_INTEGER      ByteOffset OPTIONAL,
  IN PULONG              Key OPTIONAL );

typedef NTSTATUS (*ZWREADFILE)(
  IN HANDLE              FileHandle,
  IN HANDLE              Event OPTIONAL,
  IN PIO_APC_ROUTINE      ApcRoutine OPTIONAL,
  IN PVOID                ApcContext OPTIONAL,
  OUT PIO_STATUS_BLOCK    IoStatusBlock,
  OUT PVOID              Buffer,
  IN ULONG                Length,
  IN PLARGE_INTEGER      ByteOffset OPTIONAL,
  IN PULONG              Key OPTIONAL );

typedef NTSTATUS (*ZWCREATEPROCESS)(
  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);

typedef NTSTATUS (*ZWCREATEPROCESSEX)(
    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 HANDLE Unknown );
 
typedef NTSTATUS (*ZWOPENPROCESS)(
  OUT PHANDLE            ProcessHandle,
  IN ACCESS_MASK          AccessMask,
  IN POBJECT_ATTRIBUTES  ObjectAttributes,
  IN PCLIENT_ID          ClientId );

typedef NTSTATUS (*ZWTERMINATEPROCESS)(
  IN HANDLE              ProcessHandle OPTIONAL,
  IN NTSTATUS            ExitStatus );

typedef NTSTATUS (*ZWCREATETHREAD)(
  OUT PHANDLE            ThreadHandle,
  IN ACCESS_MASK          DesiredAccess,
  IN POBJECT_ATTRIBUTES  ObjectAttributes OPTIONAL,
  IN HANDLE              ProcessHandle,
  OUT PCLIENT_ID          ClientId,
  IN PCONTEXT            ThreadContext,
  IN PINITIAL_TEB        InitialTeb,
  IN BOOLEAN              CreateSuspended );

typedef NTSTATUS (*ZWTERMINATETHREAD)(
  IN HANDLE              ThreadHandle,
  IN NTSTATUS            ExitStatus );

typedef NTSTATUS (*ZWOPENTHREAD)(
  OUT PHANDLE            ThreadHandle,
  IN ACCESS_MASK          AccessMask,
  IN POBJECT_ATTRIBUTES  ObjectAttributes,
  IN PCLIENT_ID          ClientId );

typedef NTSTATUS (*ZWCREATESECTION)(
  OUT PHANDLE            SectionHandle,
  IN ULONG                DesiredAccess,
  IN POBJECT_ATTRIBUTES  ObjectAttributes OPTIONAL,
  IN PLARGE_INTEGER      MaximumSize OPTIONAL,
  IN ULONG                PageAttributess,
  IN ULONG                SectionAttributes,
  IN HANDLE              FileHandle OPTIONAL );

typedef NTSTATUS (*ZWOPENSECTION)(
  OUT PHANDLE            SectionHandle,
  IN ACCESS_MASK          DesiredAccess,
  IN POBJECT_ATTRIBUTES  ObjectAttributes );

//注册表

typedef NTSTATUS (*ZWCREATEKEY) (
    OUT PHANDLE KeyHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    IN ULONG TitleIndex,
    IN PUNICODE_STRING Class OPTIONAL,
    IN ULONG CreateOptions,
    OUT PULONG Disposition OPTIONAL
);

typedef NTSTATUS (*ZWOPENKEY) (
    OUT PHANDLE KeyHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes
);

typedef NTSTATUS (*ZWSETVALUEKEY)(
    IN HANDLE  KeyHandle,
    IN PUNICODE_STRING  ValueName,
    IN ULONG  TitleIndex  OPTIONAL,
    IN ULONG  Type,
    IN PVOID  Data,
    IN ULONG  DataSize
);

typedef NTSTATUS (*ZWSETSECURITYOBJECT)(
  IN HANDLE              ObjectHandle,
  IN SECURITY_INFORMATION SecurityInformationClass,
  IN PSECURITY_DESCRIPTOR DescriptorBuffer);


typedef NTSTATUS (*ZWDELETEKEY)(
    IN HANDLE  KeyHandle);
typedef NTSTATUS (*ZWDELETEVALUEKEY)(
    IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName);



typedef NTSTATUS (*ZWSETSYSTEMINFORMATION)(
  IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
  IN PVOID                SystemInformation,
  IN ULONG                SystemInformationLength );

typedef NTSTATUS (*ZWQUERYSYSTEMINFORMATION)(
  IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
  OUT PVOID              SystemInformation,
  IN ULONG                SystemInformationLength,
  OUT PULONG              ReturnLength OPTIONAL );


/***********************************************************
    
//       SDT 原函数地址


***********************************************************/


static ZWCREATEFILE                OldZwCreateFile;
static ZWOPENFILE                OldZwOpenFile;
static ZWCLOSE                    OldZwClose;
static ZWWRITEFILE                OldZwWriteFile;
static ZWREADFILE                OldZwReadFile;


static ZWTERMINATEPROCESS        OldZwTerminateProcess;
static ZWOPENPROCESS            OldZwOpenProcess;

static ZWOPENTHREAD                OldZwOpenThread;
static ZWCREATESECTION            OldZwCreateSection;
static ZWOPENSECTION            OldZwOpenSection;

static ZWCREATEKEY                OldZwCreateKey;
static ZWSETVALUEKEY            OldZwSetValueKey;
static ZWDELETEKEY                OldZwDeleteKey;
static ZWDELETEVALUEKEY            OldZwDeleteValueKey;
static ZWSETSECURITYOBJECT        OldZwSetSecurityObject;
static ZWOPENKEY                OldZwOpenKey;

static ZWLOADDRIVER                OldZwLoadDriver;

static ZWSETSYSTEMINFORMATION    OldZwSetSystemInformation;
static ZWQUERYSYSTEMINFORMATION    OldZwQuerySystemInformation;


/***********************************************************************************

    挂接函数执行体

***********************************************************************************/

/************************************************************************************************



************************************************************************************************/

NTSTATUS Hook_ZwWriteFile(
  IN HANDLE              FileHandle,
  IN HANDLE              Event OPTIONAL,
  IN PIO_APC_ROUTINE      ApcRoutine OPTIONAL,
  IN PVOID                ApcContext OPTIONAL,
  OUT PIO_STATUS_BLOCK    IoStatusBlock,
  IN PVOID                Buffer,
  IN ULONG                Length,
  IN PLARGE_INTEGER      ByteOffset OPTIONAL,
  IN PULONG              Key OPTIONAL )
{
    NTSTATUS rc;
    rc = OldZwWriteFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,Buffer,Length,ByteOffset,Key);
    return rc;
}

/************************************************************************************************



************************************************************************************************/

NTSTATUS Hook_ZwReadFile(
  IN HANDLE              FileHandle,
  IN HANDLE              Event OPTIONAL,
  IN PIO_APC_ROUTINE      ApcRoutine OPTIONAL,
  IN PVOID                ApcContext OPTIONAL,
  OUT PIO_STATUS_BLOCK    IoStatusBlock,
  OUT PVOID              Buffer,
  IN ULONG                Length,
  IN PLARGE_INTEGER      ByteOffset OPTIONAL,
  IN PULONG              Key OPTIONAL )
{
    NTSTATUS rc;
    rc = OldZwReadFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,Buffer,Length,ByteOffset,Key);
    return rc;
}

/************************************************************************************************



************************************************************************************************/


NTSTATUS Hook_ZwSetSystemInformation(
  IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
  IN PVOID                SystemInformation,
  IN ULONG                SystemInformationLength )
{
    NTSTATUS rc;
    rc = OldZwSetSystemInformation(SystemInformationClass,SystemInformation,SystemInformationLength);
    return rc;
}

/************************************************************************************************



************************************************************************************************/

NTSTATUS Hook_ZwQuerySystemInformation(
  IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
  OUT PVOID              SystemInformation,
  IN ULONG                SystemInformationLength,
  OUT PULONG              ReturnLength OPTIONAL )
{
    NTSTATUS rc;
    rc = OldZwQuerySystemInformation(SystemInformationClass,SystemInformation,SystemInformationLength,ReturnLength);
    return rc;
}

/************************************************************************************************



************************************************************************************************/

NTSTATUS Hook_ZwLoadDriver(
  IN PUNICODE_STRING DriverServiceName )
{
    NTSTATUS rc;

    rc = OldZwLoadDriver(DriverServiceName);
    return rc;
}
/************************************************************************************************



************************************************************************************************/

NTSTATUS Hook_ZwSetSecurityObject(
  IN HANDLE              ObjectHandle,
  IN SECURITY_INFORMATION SecurityInformationClass,
  IN PSECURITY_DESCRIPTOR DescriptorBuffer)
{

    NTSTATUS rc;

    rc = OldZwSetSecurityObject(ObjectHandle,SecurityInformationClass,DescriptorBuffer);
   
    return rc;
}

/************************************************************************************************

    ZwOpenKey

************************************************************************************************/

NTSTATUS Hook_ZwOpenKey(
    OUT PHANDLE  KeyHandle,
    IN ACCESS_MASK  DesiredAccess,
    IN POBJECT_ATTRIBUTES  ObjectAttributes)
{
    NTSTATUS rc;

    rc = OldZwOpenKey(KeyHandle,DesiredAccess,ObjectAttributes);

    return rc;
}

/*************************************************************************************************

  挂接函数 ZwCreateKey

***************************************************************************************************/

NTSTATUS Hook_ZwCreateKey (
    OUT PHANDLE KeyHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    IN ULONG TitleIndex,
    IN PUNICODE_STRING Class OPTIONAL,
    IN ULONG CreateOptions,
    OUT PULONG Disposition OPTIONAL
)
{
    NTSTATUS rc;

    rc = OldZwCreateKey(KeyHandle, DesiredAccess, ObjectAttributes,
        TitleIndex, Class, CreateOptions, Disposition);

    return rc;
}


/***************************************************************************************************


****************************************************************************************************/

NTSTATUS Hook_ZwSetValueKey(
    IN HANDLE  KeyHandle,
    IN PUNICODE_STRING  ValueName,
    IN ULONG  TitleIndex  OPTIONAL,
    IN ULONG  Type,
    IN PVOID  Data,
    IN ULONG  DataSize
    )
{
    NTSTATUS rc;


    rc = OldZwSetValueKey(KeyHandle,ValueName,TitleIndex,Type,Data,DataSize);
   
    return rc;
}


/********************************************************************************************************


********************************************************************************************************/

NTSTATUS Hook_ZwDeleteKey(IN HANDLE  KeyHandle)
{
    NTSTATUS rc;

    rc = OldZwDeleteKey(KeyHandle);

    return rc;
}

/*********************************************************************************************************


*********************************************************************************************************/

NTSTATUS Hook_ZwDeleteValueKey( IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName)
{
    NTSTATUS rc;

    rc = OldZwDeleteValueKey(KeyHandle,ValueName);

    return rc;
}

/*************************************************************************************************


**************************************************************************************************/

NTSTATUS Hook_ZwOpenSection(
  OUT PHANDLE            SectionHandle,
  IN ACCESS_MASK          DesiredAccess,
  IN POBJECT_ATTRIBUTES  ObjectAttributes )
{
    NTSTATUS rc;
//    DbgPrint("Hook_ZwOpenSection/n");
    rc = OldZwOpenSection(SectionHandle,DesiredAccess,ObjectAttributes);
    return rc;
}

/*************************************************************************************************


**************************************************************************************************/

NTSTATUS Hook_ZwCreateSection(
  OUT PHANDLE            SectionHandle,
  IN ULONG                DesiredAccess,
  IN POBJECT_ATTRIBUTES  ObjectAttributes OPTIONAL,
  IN PLARGE_INTEGER      MaximumSize OPTIONAL,
  IN ULONG                PageAttributess,
  IN ULONG                SectionAttributes,
  IN HANDLE              FileHandle OPTIONAL )
{
    NTSTATUS rc;
//    DbgPrint("Hook_ZwCreateSection");
    return OldZwCreateSection(SectionHandle,DesiredAccess,ObjectAttributes,
                                MaximumSize,PageAttributess,SectionAttributes,FileHandle);   
    return rc;
}

/*************************************************************************************************


**************************************************************************************************/


NTSTATUS Hook_ZwTerminateProcess(
  IN HANDLE              ProcessHandle OPTIONAL,
  IN NTSTATUS            ExitStatus )
{
    NTSTATUS rc;

    rc = OldZwTerminateProcess(ProcessHandle,ExitStatus);
    return rc;
}

/*************************************************************************************************


**************************************************************************************************/

NTSTATUS Hook_ZwOpenProcess(
  OUT PHANDLE            ProcessHandle,
  IN ACCESS_MASK          AccessMask,
  IN POBJECT_ATTRIBUTES  ObjectAttributes,
  IN PCLIENT_ID          ClientId )

{
    NTSTATUS rc;

    rc = OldZwOpenProcess(ProcessHandle,AccessMask,ObjectAttributes,ClientId);
    return rc;
}


/*************************************************************************************************


**************************************************************************************************/

NTSTATUS Hook_ZwOpenThread(
  OUT PHANDLE            ThreadHandle,
  IN ACCESS_MASK          AccessMask,
  IN POBJECT_ATTRIBUTES  ObjectAttributes,
  IN PCLIENT_ID          ClientId )
{
    NTSTATUS rc;

    rc =  OldZwOpenThread(ThreadHandle,AccessMask,ObjectAttributes,ClientId);

    return rc;
}

/*************************************************************************************************


**************************************************************************************************/

NTSTATUS Hook_ZwCreateFile(
  OUT PHANDLE            FileHandle,
  IN ACCESS_MASK          DesiredAccess,
  IN POBJECT_ATTRIBUTES  ObjectAttributes,
  OUT PIO_STATUS_BLOCK    IoStatusBlock,
  IN PLARGE_INTEGER      AllocationSize OPTIONAL,
  IN ULONG                FileAttributes,
  IN ULONG                ShareAccess,
  IN ULONG                CreateDisposition,
  IN ULONG                CreateOptions,
  IN PVOID                EaBuffer OPTIONAL,
  IN ULONG                EaLength )
{
    NTSTATUS rc;

    rc = OldZwCreateFile(FileHandle,DesiredAccess,ObjectAttributes,IoStatusBlock,
                            AllocationSize,FileAttributes,ShareAccess,CreateDisposition,
                            CreateOptions,EaBuffer,EaLength);

    return rc;
}

/*************************************************************************************************


**************************************************************************************************/

NTSTATUS Hook_ZwOpenFile(
  OUT PHANDLE            FileHandle,
  IN ACCESS_MASK          DesiredAccess,
  IN POBJECT_ATTRIBUTES  ObjectAttributes,
  OUT PIO_STATUS_BLOCK    IoStatusBlock,
  IN ULONG                ShareAccess,
  IN ULONG                OpenOptions )
{
    NTSTATUS rc;

    rc =  OldZwOpenFile(FileHandle,DesiredAccess,ObjectAttributes,IoStatusBlock,ShareAccess,
                            OpenOptions);

    return rc;
}

/*************************************************************************************************


**************************************************************************************************/

NTSTATUS Hook_ZwClose(
  IN HANDLE              ObjectHandle )
{
    NTSTATUS rc;

    //在这里执行扫描必须十分注意,否则容易蓝屏

    rc = OldZwClose(ObjectHandle);
    return rc;
}

/*************************************************************************************************

  驱动函数入口

**************************************************************************************************/


NTSTATUS DriverEntry(
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath
    )
{
    NTSTATUS        ntStatus;
    UNICODE_STRING  uszDriverString;
    UNICODE_STRING  uszDeviceString;
    UNICODE_STRING  uszEventString;

    PDEVICE_OBJECT    pDeviceObject;
    PDEVICE_EXTENSION extension;
    // 初始化设备对象名
    RtlInitUnicodeString(&uszDriverString, L"//Device//ITSys");
    // 创建并初始化对象
    ntStatus = IoCreateDevice(
        DriverObject,
        sizeof(DEVICE_EXTENSION),
        &uszDriverString,
        FILE_DEVICE_UNKNOWN,
        0,
        FALSE,
        &pDeviceObject
        );
    if(ntStatus != STATUS_SUCCESS)
        return ntStatus;
    extension = pDeviceObject->DeviceExtension;
    RtlInitUnicodeString(&uszDeviceString, L"//DosDevices//ITSys");
    // 创建用户可见连接名称
    ntStatus = IoCreateSymbolicLink(&uszDeviceString, &uszDriverString);
    if(ntStatus != STATUS_SUCCESS)
    {
        // 创建失败,删除对象并返回错误值
        IoDeleteDevice(pDeviceObject);
        return ntStatus;
    }
    // 赋值全局设备对象指针

    // Assign global pointer to the device object for use by the callback functions
    g_pDeviceObject = pDeviceObject;
    // 设置所有可用的DeviceIoControl的处理IRP的函数

    DriverObject->DriverUnload                            = UnloadDriver;
    DriverObject->MajorFunction[IRP_MJ_CREATE]            = DispatchCreate;
    DriverObject->MajorFunction[IRP_MJ_CLOSE]            = DispatchClose;
    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]    = DispatchIoCtrl;

#if DBG
    KdPrint(("RegistryPath : %ws/n",RegistryPath->Buffer));
#endif

    //SDT挂接
    StartHook();

    return ntStatus;
}

/*************************************************************************************************

  启用系统服务挂接

**************************************************************************************************/

void StartHook (void)
{
    //获取未导出的服务函数索引号
    HANDLE    hFile;
    PCHAR    pDllFile;
    ULONG  ulSize;
    ULONG  ulByteReaded;

    __asm
    {
        push    eax
        mov        eax, CR0
        and        eax, 0FFFEFFFFh
        mov        CR0, eax
        pop        eax
    }
    //挂接SDT函数
    OldZwCreateFile                    = (ZWCREATEFILE)    InterlockedExchange((PLONG)
                                                        &SDT(ZwCreateFile),
                                                        (LONG)Hook_ZwCreateFile);
    OldZwOpenFile                    = (ZWOPENFILE)        InterlockedExchange((PLONG)
                                                        &SDT(ZwOpenFile),
                                                        (LONG)Hook_ZwOpenFile);
    OldZwClose                        = (ZWCLOSE)            InterlockedExchange((PLONG)
                                                        &SDT(ZwClose),
                                                        (LONG)Hook_ZwClose);
    OldZwReadFile                    = (ZWREADFILE)        InterlockedExchange((PLONG)
                                                        &SDT(ZwReadFile),
                                                        (LONG)Hook_ZwReadFile);
    OldZwWriteFile                    = (ZWWRITEFILE)        InterlockedExchange((PLONG)
                                                        &SDT(ZwWriteFile),
                                                        (LONG)Hook_ZwWriteFile);

    OldZwTerminateProcess            = (ZWTERMINATEPROCESS)InterlockedExchange((PLONG)
                                                        &SDT(ZwTerminateProcess),
                                                        (LONG)Hook_ZwTerminateProcess);

    OldZwOpenProcess                = (ZWOPENPROCESS)InterlockedExchange((PLONG)
                                                        &SDT(ZwOpenProcess),
                                                        (LONG)Hook_ZwOpenProcess);

    OldZwOpenThread                    = (ZWOPENTHREAD)InterlockedExchange((PLONG)
                                                        &SDT(ZwOpenThread),
                                                        (LONG)Hook_ZwOpenThread);
    OldZwCreateSection                = (ZWCREATESECTION)InterlockedExchange((PLONG)
                                                        &SDT(ZwCreateSection),
                                                        (LONG)Hook_ZwCreateSection);
    OldZwOpenSection                = (ZWOPENSECTION)InterlockedExchange((PLONG)
                                                        &SDT(ZwOpenSection),
                                                        (LONG)Hook_ZwOpenSection);

    OldZwOpenKey                    = (ZWOPENKEY) InterlockedExchange((PLONG)
                                                        &SDT(ZwOpenKey),
                                                        (LONG)Hook_ZwOpenKey);
    OldZwCreateKey                    = (ZWCREATEKEY) InterlockedExchange((PLONG)
                                                        &SDT(ZwCreateKey),
                                                        (LONG)Hook_ZwCreateKey);
    OldZwSetValueKey                = (ZWSETVALUEKEY) InterlockedExchange((PLONG)
                                                        &SDT(ZwSetValueKey),   
                                                        (LONG)Hook_ZwSetValueKey);
    OldZwDeleteKey                    = (ZWDELETEKEY) InterlockedExchange((PLONG)
                                                        &SDT(ZwDeleteKey),
                                                        (LONG)Hook_ZwDeleteKey);
    OldZwDeleteValueKey                = (ZWDELETEVALUEKEY) InterlockedExchange((PLONG)
                                                        &SDT(ZwDeleteValueKey),
                                                        (LONG)Hook_ZwDeleteValueKey);
    OldZwSetSecurityObject            = (ZWSETSECURITYOBJECT)InterlockedExchange((PLONG)
                                                        &SDT(ZwSetSecurityObject),
                                                        (LONG)Hook_ZwSetSecurityObject);

    OldZwLoadDriver                    = (ZWLOADDRIVER)InterlockedExchange((PLONG)
                                                        &SDT(ZwLoadDriver),
                                                        (LONG)Hook_ZwLoadDriver);

    OldZwSetSystemInformation        = (ZWSETSYSTEMINFORMATION)InterlockedExchange((PLONG)
                                                        &SDT(ZwSetSystemInformation),
                                                        (LONG)Hook_ZwSetSystemInformation);

    OldZwQuerySystemInformation        = (ZWQUERYSYSTEMINFORMATION)InterlockedExchange((PLONG)
                                                        &SDT(ZwQuerySystemInformation),
                                                        (LONG)Hook_ZwQuerySystemInformation);

    //关闭
    __asm
    {
        push    eax
        mov        eax, CR0
        or        eax, NOT 0FFFEFFFFh
        mov        CR0, eax
        pop        eax
    }
    return ;
}

/*************************************************************************************************

  移除系统服务挂接

**************************************************************************************************/

void RemoveHook (void)
{
    __asm
    {
        push    eax
        mov        eax, CR0
        and        eax, 0FFFEFFFFh
        mov        CR0, eax
        pop        eax
    }

    InterlockedExchange( (PLONG) &SDT(ZwCreateFile)                ,  (LONG) OldZwCreateFile                );
    InterlockedExchange( (PLONG) &SDT(ZwOpenFile)                ,  (LONG) OldZwOpenFile                    );
    InterlockedExchange( (PLONG) &SDT(ZwClose)                    ,  (LONG) OldZwClose                    );
    InterlockedExchange( (PLONG) &SDT(ZwReadFile)                ,  (LONG) OldZwReadFile                    );
    InterlockedExchange( (PLONG) &SDT(ZwWriteFile)                ,  (LONG) OldZwWriteFile                );

    InterlockedExchange( (PLONG) &SDT(ZwTerminateProcess)        ,  (LONG) OldZwTerminateProcess            );
    InterlockedExchange( (PLONG) &SDT(ZwOpenProcess)            ,  (LONG) OldZwOpenProcess                );
    InterlockedExchange( (PLONG) &SDT(ZwOpenThread)                ,  (LONG) OldZwOpenThread                );
    InterlockedExchange( (PLONG) &SDT(ZwCreateSection)            ,  (LONG) OldZwCreateSection            );
    InterlockedExchange( (PLONG) &SDT(ZwOpenSection)            ,  (LONG) OldZwOpenSection                );

    InterlockedExchange( (PLONG) &SDT(ZwOpenKey)                ,  (LONG) OldZwOpenKey                    );
    InterlockedExchange( (PLONG) &SDT(ZwCreateKey)                ,  (LONG) OldZwCreateKey                );
    InterlockedExchange( (PLONG) &SDT(ZwSetValueKey)            ,  (LONG) OldZwSetValueKey                );
    InterlockedExchange( (PLONG) &SDT(ZwDeleteKey)                ,  (LONG) OldZwDeleteKey                );
    InterlockedExchange( (PLONG) &SDT(ZwDeleteValueKey)            ,  (LONG) OldZwDeleteValueKey            );
    InterlockedExchange( (PLONG) &SDT(ZwSetSecurityObject)        ,  (LONG) OldZwSetSecurityObject        );

    InterlockedExchange( (PLONG) &SDT(ZwLoadDriver)                ,  (LONG) OldZwLoadDriver                );

    InterlockedExchange( (PLONG) &SDT(ZwSetSystemInformation)    ,  (LONG) OldZwSetSystemInformation        );
    InterlockedExchange( (PLONG) &SDT(ZwQuerySystemInformation)    ,  (LONG) OldZwQuerySystemInformation    );

    __asm
    {
        push    eax
        mov        eax, CR0
        or        eax, NOT 0FFFEFFFFh
        mov        CR0, eax
        pop        eax
    }
}

void UnloadDriver(IN PDRIVER_OBJECT DriverObject)
{
    UNICODE_STRING  uszDeviceString;
    NTSTATUS        ntStatus;


    //移除挂接
    RemoveHook();

    IoDeleteDevice(DriverObject->DeviceObject);

    RtlInitUnicodeString(&uszDeviceString, L"//DosDevices//ITSys");
    IoDeleteSymbolicLink(&uszDeviceString);

}


/*************************************************************************************************
//
// 创建与关闭驱动处理历程
//
**************************************************************************************************/


NTSTATUS DispatchCreate(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 DispatchClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
    NTSTATUS rc;

    Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information=0;
   
    rc = Irp->IoStatus.Status;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
    return rc;
}



/**************************************************************************************************

    Win32 使用 DeviceIoControl 获取当前创建进程的信息的响应函数

***************************************************************************************************/

NTSTATUS DispatchIoCtrl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{

    NTSTATUS              ntStatus = STATUS_UNSUCCESSFUL;
    PIO_STACK_LOCATION    irpStack  = IoGetCurrentIrpStackLocation(Irp);
    PDEVICE_EXTENSION    extension = DeviceObject->DeviceExtension;

    switch(irpStack->Parameters.DeviceIoControl.IoControlCode)
    {
        default:
            break;
    }

    Irp->IoStatus.Status = ntStatus;
 
    // 设置返回给用户层程序的数据的字节数
    if(ntStatus == STATUS_SUCCESS)
        Irp->IoStatus.Information = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
    else
        Irp->IoStatus.Information = 0;

    IoCompleteRequest(Irp, IO_NO_INCREMENT);
    return ntStatus;

} 

 

Inf安装文件


;;;
;;; ITSys.inf
;;;
;;;
;;;
;;;

[Version]
signature      = "$Windows NT$"
Class        = "ActivityMonitor"                ;This is determined by the work this filter driver does
ClassGuid     = {b86dff51-a31e-4bac-b3cf-e8cfe75c9fc2}    ;This value is determined by the Class
Provider     = %Msft%
DriverVer     = 08/28/2006,1.0.0.6
CatalogFile    = ITSys.cat                                  ; A CatalogFile entry is required for a WHQL signature.
                                                                ; The actual catalog file will be provided by WHQL.  The
                                                                ; catalog file for this sample is not provided for use.

[DestinationDirs]
DefaultDestDir           = 12
ITSys.DriverFiles      = 12             ;%windir%/system32/drivers

[SourceDisksNames]
1 = %Disk1%

[SourceDisksFiles]
ITSys.sys = 1

;;
;; Default install sections
;;

[DefaultInstall]
OptionDesc          = %ITSysServiceDesc%
CopyFiles          = ITSys.DriverFiles

[DefaultInstall.Services]
AddService          = %ITSysServiceName%,,ITSys.Service
AddReg              = ITSys.AddRegistry

;;
;; Default uninstall sections
;;

[DefaultUninstall]
DelFiles  = ITSys.DriverFiles
DelReg    = ITSys.DelRegistry

[DefaultUninstall.Services]
DelService = ITSys

;
; Services Section
;

[ITSys.Service]
DisplayName      = %ITSysServiceName%
Description      = %ITSysServiceDesc%
ServiceBinary    = %12%/ITSys.sys        ;%windir%/system32/drivers/ITSys.sys
ServiceType      = 1                ;SERVICE_SYSTEM_DRIVER
StartType        = 1                ;SERVICE_SYSTEM_BOOT=1
ErrorControl    = 1                ;SERVICE_ERROR_NORMAL
AddReg         = ITSys.AddRegistry

;
; Registry Modifications
;

[ITSys.AddRegistry]
HKLM,%ITSysRegistry%,%ITSysDebugFlags%,0x00010001 ,0

[ITSys.DelRegistry]
HKLM,%ITSysRegistry%,%ITSysDebugFlags%

;
; Copy Files
;

[ITSys.DriverFiles]
ITSys.sys

;;
;; String Section
;;

[Strings]
Msft             = "ITSafe"
ITSysServiceDesc  = "ITSafe Kernel Driver"
ITSysServiceName  = "ITSys"
ITSysRegistry    = "system/currentcontrolset/services/ITSys"
ITSysDebugFlags  = "DebugFlags"
Disk1            = "ITSys Source Media"
编译文件


TARGETNAME=ITSys
TARGETPATH=obj
TARGETTYPE=DRIVER

TARGETLIBS=

SOURCES=ITSys.c /
    ITSys.rc
Delphi开发的SSDT钩子卸载工具包 本文还有配套的精品资源,点击获取 简介:本工具是使用Delphi语言开发的,能够在内核模式下运行,主要用于从系统服务描述表(SSDT)中移除恶意软件设置的钩子。SSDT是Windows内核的关键部分,被恶意软件篡改后会影响系统功能。工具包含对Windows API的低级访问、内存泄漏检测、DLL加载配置以及安全相关API的封装。这对于系统安全维护和恶意软件检测具有重要意义。... 阅读详情

相关推荐

目前最好用的OD,破洞过各种系统检测专用OD

目前最好用的OD,破洞过各种系统检测专用OD

[内核编程]线程操作

1. 线程枚举 来介绍几个要用到的内核API: PsLookupThreadByThreadId(): NTSTATUS PsLookupThreadByThreadId( IN HANDLE ThreadId, OUT PETHREAD *Thread ); 通过TID获取对应的ETHREAD结构指针。 IoThreadToProcess(): PEPROCESS IoThreadToProcess( IN PETHREAD Thread

輚至消亡 2402

别光看原理图了!手把手教你用Altium Designer搞定STM32F411最小系统的PCB布局(附电源/晶振/复位电路实战)

本文详细介绍了使用Altium Designer进行STM32F411最小系统PCB布局的实战技巧,涵盖电源分配网络优化、高速信号布线及系统级布局策略。通过规范的工程结构建立、关键设计规则预设和核心电路模块布局,帮助工程师提升PCB设计效率与信号完整性。特别针对STM32最小系统的电源、晶振和复位电路提供了专业解决方案。

weixin_42653691的博客 168

内核钩子模板

#include #include #pragma pack(1)typedef struct ServiceDescriptorEntry {    unsigned int *ServiceTableBase;    unsigned int *ServiceCounterTableBase; //Used only in checked build    unsigned int Numbe

lbird 2265

Mmdetection用自己的数据集训练Mask_RCNN

将自己数据的标签写入配置文件,在data前一行添加自己的标签列表,同时在train,val,test中添加classes = classes,如果不添加,模型就会默认读取coco原始数据集的80个标签,与自己的数据集对应不上就会报错。2.打开第二个文件coco_instance.py,将data_root路径改为你自己coco数据集的位置(注意一定要以/结尾),修改输出图片尺寸(根据自己的数据集决定)3.将标注完的数据转为Mask_rcnn训练所需的数据集格式。4.将数据集放到训练代码文件夹中。

m0_64298393的博客 3473

Qlib数据获取避坑指南:从CSV导入到自定义数据源的完整解决方案

本文详细解析了Qlib数据获取的完整解决方案,从CSV导入到自定义数据源,涵盖了股票数据处理的关键技巧和常见陷阱。特别针对Qlib平台的数据格式要求和复权处理提供了实用指南,帮助量化投资者高效整合Wind等第三方数据源,确保数据质量与模型性能。

weixin_29047919的博客 304

抹掉所有进程中自己的句柄(源代码)

 by  achillis之前听过一个检测进程的想法,就是暴力枚举所有进程中的handle,查找其中类型为PROCESS的.此法也被炉子牛用于他的LzOpenProcess().下面我就写了一断代码来对抗这个方法,纯属小伎俩,牛牛们飘过~严格说,此段代码不算原创,是从某rootkit的bin中扒出来的,因此基本保留其原貌,经我修改测试,主要函数如下:Copy codevoid CloseAllmy

2289

基于Yolo11的无人机小目标检测系统的设计与性能优化改进项目实现

该项目旨在开发一个基于YOLO11的无人机目标检测系统,能够实时识别并定位无人机拍摄过程中捕捉的小目标。考虑到无人机拍摄的目标通常较小,系统将采用特定的调优策略,以提高小目标的检测精度和召回率。

m0_73723097的博客 1205

分享内核钩子实例 稳定

分享内核钩子实例 稳定 From:Internet #include &lt;ntddk.h&gt;#include &lt;ntimage.h&gt; #pragma pack(1)typedef struct ServiceDescriptorEntry { unsigned int *ServiceTableBase; unsigned int *ServiceCounterTable...

爱.NET 306

ArcGIS基础实战:面数据拓扑创建和错误修改全流程

通过下图的操作我们可以发现,图层的【Shape_Length】和【Shape_Area】字段的数值都发生了改变,表明两个图层重叠的那一部分图斑合并到另一个图班上,其面积会减小、长度会变大(自己重新计算一下也可以得到此验证结果的)。如图【拓扑实验结果】文件夹里右键,新建【文件地理数据库】,并进行命名为【xx拓扑检查】备注:养成良好的命名习惯。然后在【xx拓扑检查】下右键打开【新建要素数据集】,并对数据集进行命名为【XX拓扑】,然后进行下一步设置。在【KK拓扑】数据集上右键,新建【拓扑】。

yuanYW7556的博客 1万+

29、固态变压器拓扑、设计及其应用深度解析

本文深入解析了固态变压器(SST)的拓扑结构、设计方法及其在智能电网和能源互联网中的应用。重点探讨了机器学习在SST优化设计中的应用,包括中高频变压器设计、整体系统优化与建模研究。文章详细介绍了多端口SST的拓扑特点、功率传输机制及其作为能源路由器的关键作用,分析了不同端口数量下的控制复杂度与应用场景,并通过案例研究展示了四端口SST在分布式能源系统中的实际应用。最后,文章总结了多端口SST面临的技术挑战,并展望了未来在先进控制策略、集成化设计和标准化方面的发展方向。

study的专栏 3793

Ring3下结束进程的方法汇总

所有的 OpenProcess/ZwOpenProcess/OpenThread/ZwOpenThread 都可以替换为 ZwQuerySystemInformation->ZwOpenProcess->ZwDuplicateObject 。具体是为什么请自己研究。 (Zw)OpenProcess(PID+0/1/2/3)->(Zw)TerminateProcess (Zw)OpenProce

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1140

【MATLAB代码】TDOA+TOA融合算法,高精度定位。通过多边定位解算4个锚点、平面目标的位置,附代码

二维平面下的TOA、TDOA及混合定位算法,通过4个锚节点对目标点进行定位。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 211

【亲测免费】 探索KernelHook:一种强大的内核钩子技术

探索KernelHook:一种强大的内核钩子技术 项目简介 是一个开源的项目,由开发者smallzhong创建,它提供了一种在Linux内核中实现高效、安全的钩子(hook)机制的方法。通过此项目,开发者可以轻松地插入自定义代码到内核关键函数中,以实现对系统行为的监控、调试或增强。 技术分析 KernelHook的核心在于它的钩子实现策略。项目利用了内核模块(kernel module)和动态代码...

gitblog_00060的博客 1601

手把手教你从入门到精通C# MES通信

本文是C#与MES通信通信的目录,使用C#与各种MES系统通信的方法我都会在专栏中讲到,比如WebService、Http、Ftp、共享文件夹、串口通信等,绝对是上位机软件工程师实现与MES系统通信的必备教程!

qq_34059233的博客 8749

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

KernelSU内核钩子技术:函数拦截与修改原理

KernelSU作为Android设备上基于内核的root解决方案,其核心技术之一就是内核钩子(Kernel Hook)技术。这种技术允许在内核空间拦截和修改系统调用、函数执行流程,从而实现精细化的权限控制和功能扩展。本文将深入解析KernelSU中内核钩子的实现原理、技术细节和应用场景。 ## 内核钩子技术基础 ### 什么是内核钩子? 内核钩子(Kernel Hook)是一种在内核级别拦...

gitblog_00926的博客 909

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

探索内核级编程新境界:Windows内核中的即时钩子实现

探索内核级编程新境界:Windows内核中的即时钩子实现 在安全与逆向工程的领域中,深入内核层面的操作一直是技术人员梦寐以求的技术高峰。今天,我们有幸为大家推介一个开源项目——Windows内核中的即时钩子实现,它不仅展示了如何巧妙地在内核层创建即时钩子,还巧妙规避了诸多传统方法所面临的挑战。 项目介绍 这个工具直击内核层级,示例性地揭示了一种安全、高效的方法来执行Windows内核内的即时钩子(...

gitblog_00097的博客 683

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

HookLib²内核态到用户态钩子实现:跨特权级拦截技术详解

HookLib是一款基于纯C和NativeAPI开发的函数拦截库,同时支持用户态(UserMode)和内核态(KernelMode)操作,为开发者提供了强大的跨特权级函数拦截解决方案。无论是系统级应用开发还是底层调试分析,HookLib都能帮助开发者高效地实现函数钩子,监控和修改程序行为。 ## 🚀 HookLib核心功能解析 ### 跨特权级拦截技术 HookLib最显著的特点是其同时支持

gitblog_01085的博客 1037

Windows 内核态与用户态 IAT 钩子开源项目介绍

Windows 内核态与用户态 IAT 钩子开源项目介绍 本文将为您详细介绍一个开源项目——Windows 内核态与用户态 IAT 钩子,该项目以 C 语言为主要编程语言。 1. 项目基础介绍 该项目名为 iathook,托管于 GitHub,主要提供了一种在 Windows 系统中实现内核态和用户态函数调用的拦截(hook)方法。通过修改 Import Address Table(IAT),项目...

gitblog_00979的博客 424

Spectre Rootkit文件对象钩子技术:绕过Windows内核防护的关键

Spectre是一款Windows内核模式Rootkit,它通过滥用合法通信渠道实现对计算机的控制。其中,文件对象钩子技术是其绕过Windows内核防护的核心手段之一,通过精妙的设计实现了对文件操作的隐蔽监控与控制。 ## 一、文件对象钩子技术的核心原理 文件对象钩子(FileObjHook)技术通过替换文件对象的设备对象指针,将文件操作重定向到恶意实现。这一技术的精妙之处在于它不直接修改内核

gitblog_00595的博客 289

InfinityHookPro:跨世代Windows系统的内核级钩子增强库

**InfinityHookPro** 是一个由C++和少量C编写的开源项目,旨在提供从Windows 7至Windows 11系统的广泛兼容性内核钩子解决方案。这个项目源自对原有InfinityHook的继承与改进,由开发者FiYHer维护,展现了其在内核级编程与驱动开发上的深厚功底。项目遵循MIT许可协议,鼓励社区参与和技术共享。 ## 核心功能 该项目的核心在于实现了一套强大且灵活的内核...

gitblog_00072的博客 474

探索DXGKRNL Hook Ex: 强大的Windows内核钩子工具

探索DXGKRNL Hook Ex: 强大的Windows内核钩子工具 在这个数字化的时代,开发者们经常需要深入系统底层以优化性能或实现独特的功能。 是一个专为Windows内核级编程打造的强大工具,它提供了一种高效的方式来挂钩DXGKRNL接口,从而允许开发者监控和控制图形处理单元(GPU)的行为。 项目简介 DXGKRNL Hook Ex是一个开源项目,其目标是简化对DXGKRNL接口的挂钩操...

gitblog_00060的博客 649

Suterusu内核钩子技术:inet_ioctl函数劫持与LKM隐藏实现

Suterusu是一款针对Linux 2.6/3.x内核的LKM(可加载内核模块)rootkit,支持x86(_64)和ARM架构。本文将深入解析其核心技术——inet_ioctl函数劫持与LKM隐藏实现,揭示内核钩子技术的工作原理与应用场景。 ## 内核钩子技术基础:函数劫持机制 内核钩子技术是rootkit实现核心功能的基础,通过修改内核函数入口地址实现对系统调用的拦截与控制。Suteru

gitblog_01013的博客 1005

HookLib²单元测试详解:确保钩子稳定性的关键步骤

HookLib是一款基于纯C和NativeAPI开发的函数拦截库,同时支持用户模式(UserMode)和内核模式(KernelMode),其单元测试体系是保障钩子功能稳定性的核心环节。本文将深入解析HookLib的单元测试框架、关键测试场景及实施步骤,帮助开发者全面理解如何通过系统化测试确保钩子拦截的可靠性。 ## 单元测试框架概览 HookLib的单元测试模块主要通过**HookLibTes

gitblog_00073的博客 530

Linux系统中的“钩子”

上述钩子覆盖了从内核到用户空间、从硬件事件到软件行为的多种场景。LD_PRELOAD:拦截动态库函数调用(用户态)ptrace:调试并修改进程行为(如GDB底层原理)内核模块挂钩:直接修改内核函数指令(需谨慎,影响稳定性)。具体选择取决于需求的安全层级和复杂度。例如,快速调试可用bpftrace,而安全审计更适合LSM或auditd。

LuckyLay的博客 760
上一篇: Worm.Magistr.g
下一篇: 判断程序的执行环境是VM
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值