免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 发帖

实现hook ssdt

  1. #include "ntddk.h"

  2. #define PAGEDCODE code_seg("PAGE")
  3. #define LOCKEDCODE code_seg()
  4. #define INITCODE code_seg("INIT")

  5. #define PAGEDDATA data_seg("PAGE")
  6. #define LOCKEDDATA data_seg()
  7. #define INITDATA data_seg("INIT")

  8. #pragma pack(1)
  9. typedef struct ServiceDescriptorEntry {
  10.         unsigned int *ServiceTableBase;
  11.         unsigned int *ServiceCounterTableBase; //仅适用于checked build版本
  12.         unsigned int NumberOfServices;
  13.         unsigned char *ParamTableBase;
  14. } ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
  15. #pragma pack()

  16. __declspec (dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable;

  17. ULONG g_ntopenprocess;

  18. typedef NTSTATUS (*pNtOpenProcess) (
  19.         __out PHANDLE ProcessHandle,
  20.         __in ACCESS_MASK DesiredAccess,
  21.         __in POBJECT_ATTRIBUTES ObjectAttributes,
  22.         __in_opt PCLIENT_ID ClientId
  23.         );

  24. NTSTATUS PsLookupProcessByProcessId(
  25.    IN HANDLE ProcessId,
  26.    OUT PEPROCESS *Process
  27.    );



  28. void PageProtectOn()
  29. {
  30.         //恢复内存保护
  31.         __asm
  32.         {
  33.                 mov eax, cr0
  34.                 or eax, 10000h
  35.                 mov cr0, eax
  36.                 sti
  37.         }
  38. }

  39. void PageProtectOff()
  40. {
  41.         //去掉内存保护
  42.         __asm
  43.         {
  44.                 cli
  45.                 mov eax, cr0
  46.                 and eax, not 10000h
  47.                 mov cr0, eax
  48.         }
  49. }

  50. BOOLEAN ProtectProcess(HANDLE ProcessId, char* strProtectObjName)
  51. {
  52.         NTSTATUS Status;
  53.         PEPROCESS process_obj;

  54.         if (!MmIsAddressValid(strProtectObjName))
  55.         {
  56.                 return FALSE;
  57.         }
  58.        
  59.         if (ProcessId == 0)
  60.         {
  61.                 return FALSE;
  62.         }

  63.         Status = PsLookupProcessByProcessId(ProcessId, &process_obj);
  64.         if (!NT_SUCCESS(Status))
  65.         {
  66.                 KdPrint(("error code:%X", Status));
  67.                 return FALSE;
  68.         }

  69.         if (strcmp((UCHAR *)process_obj + 0x174, strProtectObjName) == 0)
  70.         {
  71.                 ObDereferenceObject(process_obj);
  72.                 return TRUE;
  73.         }
  74.        
  75.         ObDereferenceObject(process_obj);
  76.         return FALSE;
  77. }


  78. NTSTATUS NewNtOpenProcess (
  79.    __out PHANDLE ProcessHandle,
  80.    __in ACCESS_MASK DesiredAccess,
  81.    __in POBJECT_ATTRIBUTES ObjectAttributes,
  82.    __in_opt PCLIENT_ID ClientId
  83.    )
  84. {
  85.         //KdPrint(("NewNtOpenProcess comming!---%s", (UCHAR *)PsGetCurrentProcess() + 0x174));
  86.        
  87.         if (ProtectProcess(ClientId->UniqueProcess, "notepad.exe"))
  88.         {
  89.                 KdPrint(("Procect comming!...."));
  90.                 return STATUS_UNSUCCESSFUL;
  91.         }

  92.         return ((pNtOpenProcess)g_ntopenprocess)(ProcessHandle, DesiredAccess, ObjectAttributes, ClientId);
  93. }


  94. #pragma PAGEDCODE
  95. NTSTATUS HookNtOpenProcess()
  96. {
  97.         NTSTATUS Status = STATUS_SUCCESS;

  98.         //ULONG u_index;

  99.         //for (u_index = 0; u_index < KeServiceDescriptorTable.NumberOfServices; u_index++)
  100.         //{
  101.         //        KdPrint(("ServiceTableBase[%d]:%X", u_index, KeServiceDescriptorTable.ServiceTableBase[u_index]));
  102.         //}

  103.         PageProtectOff();
  104.        
  105.         g_ntopenprocess = KeServiceDescriptorTable.ServiceTableBase[122];
  106.         KeServiceDescriptorTable.ServiceTableBase[122] = (unsigned int )NewNtOpenProcess;
  107.                
  108.         PageProtectOn();
  109.        


  110.         return Status;
  111. }

  112. #pragma PAGEDCODE
  113. void UnHookOpenProcess()
  114. {
  115.         PageProtectOff();

  116.         KeServiceDescriptorTable.ServiceTableBase[122] = g_ntopenprocess;

  117.         PageProtectOn();

  118. }


  119. #pragma PAGEDCODE
  120. VOID MyDriverUnload(IN PDRIVER_OBJECT pDriverObject)
  121. {

  122.         KdPrint(("DriverEntry unLoading...\n"));
  123.         UnHookOpenProcess();
  124. }



  125. #pragma INITCODE
  126. NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegistryPath)
  127. {
  128.         NTSTATUS status = STATUS_SUCCESS;

  129.         HookNtOpenProcess();

  130.         pDriverObject->DriverUnload = MyDriverUnload;
  131.         return status;
  132. }
复制代码

返回列表