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

ShadowSSDT

  1. #pragma once
  2. #include "common.h"

  3. typedef struct _SYSTEM_SERVICE_TABLE
  4. {
  5.         PULONG        ServiceTable;        // array of entry points
  6.         PDWORD        CounterTable;        // array of usage counters
  7.         DWORD        ServiceLimit;        // number of table entries
  8.         PBYTE        ArgumentTable;        // array of byte counts
  9. }SYSTEM_SERVICE_TABLE, *PSYSTEM_SERVICE_TABLE;

  10. typedef struct _ShadowServiceDescriptorTable
  11. {
  12.         SYSTEM_SERVICE_TABLE ntoskrnl;        // ntoskrnl.exe ( native api )
  13.         SYSTEM_SERVICE_TABLE win32k;        // win32k.sys (gdi/user support)
  14.         SYSTEM_SERVICE_TABLE Table3;        // not used
  15.         SYSTEM_SERVICE_TABLE Table4;        // not used
  16. }ShadowSSDT, *PShadowServiceDescriptorTable;




  17. extern PVOID GetShadowSSDTAddr();

  18. extern VOID ShadowSSDTHookTest();
复制代码
  1. #include "StdAfx.h"

  2. #include "ShadowSSDT.h"
  3. #include "common.h"
  4. //#include <ntifs.h>
  5. //#pragma comment(lib, "ntstrsafe.lib")

  6. extern "C" PVOID KeServiceDescriptorTable;

  7. PVOID GetShadowSSDTAddr()
  8. {
  9.     PUCHAR pKeAddSST = (PUCHAR)KeAddSystemServiceTable;

  10.     for (int i = 0; i < 4096; i++, pKeAddSST++)
  11.     {
  12.         if (MmIsAddressValid((PVOID)(*(ULONG*)pKeAddSST)) && MmIsAddressValid((PUCHAR)(*(ULONG*)pKeAddSST) + sizeof(ShadowSSDT) - 1))
  13.         {
  14.                         PVOID pShadowSSDTAddr = (PVOID)(*(ULONG*)pKeAddSST);
  15.             __try
  16.             {
  17.                 if ((sizeof(ShadowSSDT) == RtlCompareMemory(pShadowSSDTAddr, KeServiceDescriptorTable, sizeof(ShadowSSDT))) &&
  18.                     (pShadowSSDTAddr != KeServiceDescriptorTable))
  19.                 {
  20.                     //DbgPrint("Shadow SSDT Addr: 0x%8x\n", pShadowSSDTAddr);
  21.                     return pShadowSSDTAddr;
  22.                 }
  23.             }
  24.             __except(EXCEPTION_EXECUTE_HANDLER)
  25.             {
  26.                 return NULL;
  27.             }
  28.         }
  29.     }

  30.     return NULL;
  31. }




  32. PVOID GetInfoTable(SYSTEM_INFORMATION_CLASS sic)
  33. {
  34.     ULONG uSize = 0x4000;
  35.     PVOID pPtr = NULL;
  36.     NTSTATUS status;

  37.     do
  38.     {
  39.         pPtr = ExAllocatePool(PagedPool, uSize);
  40.         if (NULL != pPtr)
  41.         {
  42.             memset(pPtr, 0, uSize);
  43.             status = ZwQuerySystemInformation(sic, pPtr, uSize, NULL);
  44.         }
  45.         else
  46.         {
  47.             return NULL;
  48.         }

  49.         if (status == STATUS_INFO_LENGTH_MISMATCH)
  50.         {
  51.             ExFreePool(pPtr);
  52.             uSize = uSize * 2;
  53.         }
  54.     } while (status == STATUS_INFO_LENGTH_MISMATCH);

  55.     if (status == STATUS_SUCCESS)
  56.     {
  57.         return pPtr;
  58.     }

  59.     ExFreePool(pPtr);

  60.     return NULL;
  61. }


  62. HANDLE GetCsrPid()
  63. {
  64.     HANDLE                          hProcess = NULL;
  65.     HANDLE                          hObject = NULL;
  66.     HANDLE                          CsrId = (HANDLE)0;
  67.     OBJECT_ATTRIBUTES               oa;
  68.     CLIENT_ID                       cid;
  69.     UCHAR                           szBuff[0x100];
  70.     POBJECT_NAME_INFORMATION        ObjName = (POBJECT_NAME_INFORMATION)&szBuff;
  71.     PSYSTEM_HANDLE_INFORMATION_EX   pSysHandleInfo;
  72.     ULONG                           uIndex;

  73.     pSysHandleInfo = (PSYSTEM_HANDLE_INFORMATION_EX)GetInfoTable(SystemHandleInformation);

  74.     if (!pSysHandleInfo)
  75.     {
  76.         return CsrId;
  77.     }

  78.     for (uIndex = 0; uIndex < pSysHandleInfo->NumberOfHandles; uIndex++)
  79.     {
  80.         if (pSysHandleInfo->Information[uIndex].ObjectTypeNumber == 21) //Port object
  81.         {
  82.             InitializeObjectAttributes(&oa, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);

  83.             cid.UniqueProcess = (HANDLE)pSysHandleInfo->Information[uIndex].ProcessId;
  84.             cid.UniqueThread  = 0;

  85.             if (NT_SUCCESS(NtOpenProcess(&hProcess, PROCESS_DUP_HANDLE, &oa, &cid)))
  86.             {
  87.                 if (NT_SUCCESS(ZwDuplicateObject(hProcess,
  88.                                                 (HANDLE)pSysHandleInfo->Information[uIndex].Handle,
  89.                                                 NtCurrentProcess(),
  90.                                                 &hObject,
  91.                                                 0, 0, DUPLICATE_SAME_ACCESS)))
  92.                 {
  93.                     if (NT_SUCCESS(ZwQueryObject(hObject,
  94.                                                 ObjectNameInformation,
  95.                                                 ObjName,
  96.                                                 0x100, NULL)))
  97.                     {
  98.                         if (ObjName->Name.Buffer &&
  99.                             !wcsncmp(L"\\Windows\\ApiPort", ObjName->Name.Buffer, 20))
  100.                         {
  101.                             CsrId = (HANDLE)pSysHandleInfo->Information[uIndex].ProcessId;
  102.                             break;
  103.                         }
  104.                     }

  105.                     ZwClose(hObject);
  106.                 }

  107.                 ZwClose(hProcess);
  108.             }
  109.         }
  110.     }

  111.     if (NULL != hObject)
  112.     {
  113.         ZwClose(hObject);
  114.     }

  115.     if (NULL != hProcess)
  116.     {
  117.         ZwClose(hProcess);
  118.     }

  119.     ExFreePool(pSysHandleInfo);

  120.     return CsrId;

  121. }


  122. VOID ShadowSSDTHookTest()
  123. {
  124.         //附加csrss.exe
  125.         //..查找csrss.exe

  126.     NTSTATUS status;
  127.     PEPROCESS crsPEProc;

  128.     status = PsLookupProcessByProcessId(GetCsrPid(), &crsPEProc);

  129.     if (!NT_SUCCESS(status))
  130.     {
  131.         return;
  132.     }
  133.    
  134.     KAPC_STATE kapc_state;

  135.     KeStackAttachProcess(crsPEProc, &kapc_state);

  136.     //HOOK  Shadow SSDT

  137.     KeUnstackDetachProcess(&kapc_state);
  138. }
复制代码

返回列表