zoukankan      html  css  js  c++  java
  • 动态监控驱动、dll、exe加载

      1 /*
      2 windows2003 x86/x64 window7 x86 windows2008 R2 x64测试通过
      3 */
      4 
      5 #include <ntddk.h>
      6 #include "nt_help.h"
      7 DRIVER_INITIALIZE DriverEntry;
      8 
      9 typedef struct _OBJECT_TYPE_INITIALIZER {
     10     USHORT Length;
     11     BOOLEAN UseDefaultObject;
     12     BOOLEAN CaseInsensitive;
     13 #if WINVER>=0x0600
     14     ULONG ObjectTypeCode;
     15 #endif
     16     ULONG InvalidAttributes;
     17     GENERIC_MAPPING GenericMapping;
     18     ULONG ValidAccessMask;
     19     BOOLEAN SecurityRequired;
     20     BOOLEAN MaintainHandleCount;
     21     BOOLEAN MaintainTypeList;
     22     POOL_TYPE PoolType;
     23     ULONG DefaultPagedPoolCharge;
     24     ULONG DefaultNonPagedPoolCharge;
     25     PVOID DumpProcedure;
     26     PVOID OpenProcedure;
     27     PVOID CloseProcedure;
     28     PVOID DeleteProcedure;
     29     PVOID ParseProcedure;
     30     PVOID SecurityProcedure;
     31     PVOID QueryNameProcedure;
     32     PVOID OkayToCloseProcedure;
     33 } OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;
     34 
     35 typedef struct _OBJECT_TYPE {
     36 #if WINVER<0x0600
     37     ERESOURCE Mutex;
     38 #endif
     39     LIST_ENTRY TypeList;
     40     UNICODE_STRING Name;            // Copy from object header for convenience
     41     PVOID DefaultObject;
     42     ULONG Index;
     43     ULONG TotalNumberOfObjects;
     44     ULONG TotalNumberOfHandles;
     45     ULONG HighWaterNumberOfObjects;
     46     ULONG HighWaterNumberOfHandles;
     47     OBJECT_TYPE_INITIALIZER TypeInfo;
     48 } OBJECT_TYPE, *POBJECT_TYPE;
     49 
     50 extern POBJECT_TYPE* MmSectionObjectType;
     51 PVOID pNtCreateSection = NULL;
     52 SYSTEM_MODULE_INFORMATION ntModInfo = {0};
     53 
     54 #pragma alloc_text(INIT, DriverEntry)
     55 
     56 NTSTATUS DevicePassthrough(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
     57 {
     58         NTSTATUS status = STATUS_SUCCESS;
     59         PIO_STACK_LOCATION  irpSp;
     60         
     61         irpSp = IoGetCurrentIrpStackLocation(Irp);
     62         Irp->IoStatus.Status = status;
     63         IoCompleteRequest(Irp, IO_NO_INCREMENT);
     64         return status;
     65 }
     66 
     67 VOID DriverUnload (IN PDRIVER_OBJECT DriverObject)
     68 {
     69         (*MmSectionObjectType)->TypeInfo.OpenProcedure = NULL;
     70         KdPrint(("DriverUnload Done!
    "));
     71 }
     72 
     73 #if WINVER>=0x0600
     74 NTSTATUS HookSectionOpen(
     75     IN ULONG OpenReason,
     76     IN ULONG AccessMode,
     77     IN PEPROCESS Process OPTIONAL,
     78     IN PVOID Object,
     79     IN ACCESS_MASK* GrantedAccess,
     80     IN ULONG HandleCount
     81     )
     82 #else
     83 NTSTATUS HookSectionOpen(
     84     IN ULONG OpenReason,
     85     IN PEPROCESS Process OPTIONAL,
     86     IN PVOID Object,
     87     IN ACCESS_MASK GrantedAccess,
     88     IN ULONG HandleCount
     89     )
     90 #endif
     91 {
     92         PVOID* esp = (PVOID*)&esp;
     93         PVOID* esp_end = (PVOID*)((((DWORD64)esp>>12) + 1)<<12);        //4k round up
     94         PVOID* p = esp;
     95         ULONG SectionPageProtection, AllocationAttributes;
     96         HANDLE FileHandle;
     97         NTSTATUS Status;
     98 
     99         /*
    100          * do stack walk back to NtCreateSection function
    101          */
    102         while (p < esp_end &&
    103                 (*p < pNtCreateSection ||
    104                  *p > (PVOID)((PBYTE)pNtCreateSection + 0x300)))
    105                 p++;
    106 
    107         if (p >= esp_end){
    108                 //KdPrint(("no found NtCreateSection %p -> %p
    ", esp, esp_end));
    109                 return STATUS_SUCCESS;
    110         }
    111 
    112         //KdPrint(("%p HookSectionOpen-Object:%p esp:%p %p
    ", pNtCreateSection, Object, esp, *p));
    113 #ifdef _WIN64
    114         /*
    115          * esp layout look likes[2003 X64 DUMP]:
    116          fffff800`0104113d nt!KiSystemServiceCopyEnd+0x3 retaddr <-------call nt!NtCreateSection
    117          fffffadf`f662ec00  00000000`00000000 param1
    118          fffffadf`f662ec08  00000000`000f001f param2 DesiredAccess
    119          fffffadf`f662ec10  00000000`00000000
    120          fffffadf`f662ec18  00000000`00000000
    121          fffffadf`f662ec20  00000100`00000010 SectionPageProtection
    122          fffffadf`f662ec28  00000000`01000000 AllocationAttributes
    123          fffffadf`f662ec30  00000000`0000054c FileHandle
    124          * - ...
    125          */
    126         p++;
    127         /*
    128          * search retaddr -> nt!KiSystemServiceCopyEnd
    129          */
    130         while (p < esp_end &&
    131                 (*p < ntModInfo.ImageBase ||
    132                  *p > (PVOID)((PBYTE)ntModInfo.ImageBase + ntModInfo.ImageSize)))
    133                 p++;
    134 
    135         if (p >= esp_end){
    136                 //KdPrint(("no found nt!KiSystemxxxx %p -> %p
    ", esp, esp_end));
    137                 return STATUS_SUCCESS;
    138         }
    139 #else
    140         /* stack DUMP from 2003/x86
    141          * ebp = p - 1
    142          fa06f4d8  fa06f540
    143          fa06f4dc  80908715 nt!NtCreateSection+0x15c
    144          ...
    145          fa06f540  fa06f564
    146          fa06f544  808234cb nt!KiFastCallEntry+0xf8
    147          fa06f548  fa06f668 param1
    148          */
    149         p = (PVOID*)*(p - 1);
    150         p++;
    151 #endif
    152 
    153         SectionPageProtection = (ULONG)*(p + 5);
    154         AllocationAttributes = (ULONG)*(p + 6);
    155         FileHandle = *(p + 7);
    156 
    157         //KdPrint(("%x %x %p
    ", SectionPageProtection, AllocationAttributes, FileHandle));
    158 
    159         if (FileHandle
    160                 && SectionPageProtection == PAGE_EXECUTE
    161                 && (AllocationAttributes == SEC_IMAGE || AllocationAttributes == 0x100000)){
    162                 /* windows7 AllocationAttributes = 0x100000 to LoadDriver */
    163                 PFILE_OBJECT File;
    164 
    165                 Status = ObReferenceObjectByHandle (FileHandle,
    166                                 0,
    167                                 NULL,
    168                                 KernelMode,
    169                                 (PVOID *)&File,
    170                                 NULL);
    171 
    172                 if (!NT_SUCCESS(Status)) {
    173                         return STATUS_SUCCESS;
    174                 }
    175                 KdPrint(("FileName:%wZ
    ", &File->FileName));
    176                 ObDereferenceObject(File);
    177         }
    178 
    179         return STATUS_SUCCESS;
    180 }
    181 
    182 BOOL GetNtImgBase(PSYSTEM_MODULE_INFORMATION modInfo)
    183 {
    184         PSYSMODULELIST sysModuleList = NULL;
    185         ULONG size, i;
    186 
    187         NtQuerySystemInformation(SystemModuleInformation, &size, 0, &size);
    188         sysModuleList = ExAllocatePoolWithTag(PagedPool, size, 'hlpm');
    189 
    190         if (sysModuleList){
    191                 NtQuerySystemInformation(SystemModuleInformation, sysModuleList, size, NULL);
    192                 /* nt module should be the first one */
    193                 *modInfo = *sysModuleList->Modules;
    194                 ExFreePool(sysModuleList);
    195                 return TRUE;
    196         }
    197         return FALSE;
    198 }
    199 
    200 NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
    201 {
    202         DWORD i;
    203         UNICODE_STRING sFuncName;
    204         
    205         RtlInitUnicodeString(&sFuncName, L"NtCreateSection");
    206         pNtCreateSection = MmGetSystemRoutineAddress(&sFuncName);
    207 
    208         if (!GetNtImgBase(&ntModInfo)){
    209                 KdPrint(("EnumSysModule nt base failed!
    "));
    210                 return STATUS_UNSUCCESSFUL;
    211         }
    212 
    213         KdPrint(("nt:%p pNtCreateSection:%p
    MmSectionObjectType:%p %p %p
    ",
    214                                 ntModInfo.ImageBase,
    215                                 pNtCreateSection,
    216                                 *MmSectionObjectType,
    217                                 (*MmSectionObjectType)->TypeInfo.OpenProcedure,
    218                                 (*MmSectionObjectType)->TypeInfo.DeleteProcedure));
    219         
    220         (*MmSectionObjectType)->TypeInfo.OpenProcedure = HookSectionOpen;
    221 
    222         for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
    223                 DriverObject->MajorFunction[i] = DevicePassthrough;
    224 
    225         DriverObject->DriverUnload = DriverUnload;
    226 
    227         return STATUS_SUCCESS;
    228 } 
  • 相关阅读:
    Leetcode 121. Best Time to Buy and Sell Stock
    Leetcode 120. Triangle
    Leetcode 26. Remove Duplicates from Sorted Array
    Leetcode 767. Reorganize String
    Leetcode 6. ZigZag Conversion
    KMP HDU 1686 Oulipo
    多重背包 HDU 2844 Coins
    Line belt 三分嵌套
    三分板子 zoj 3203
    二分板子 poj 3122 pie
  • 原文地址:https://www.cnblogs.com/microzone/p/3397682.html
Copyright © 2011-2022 走看看