看流星社区

 找回密码
 注册账号
查看: 1428|回复: 0

注册表回调整体框架

[复制链接]

该用户从未签到

发表于 2017-6-1 13:32:38 | 显示全部楼层 |阅读模式
注册表回调整体框架
这个就不多说了,想详细了解的可以自行百度,网上有很多相关内容
  1. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
  2. {
  3.         NTSTATUS ntStatus;
  4.         ntStatus = CmRegisterCallback(MyRegistryCallback, NULL,  &pCookie);
  5.        
  6.         return ntStatus;
  7. }
  8. //see demo:
  9. //7eightl-minifilter\Demo\REG-hips
  10. NTSTATUS HOOK_PreNtDeleteKey(PREG_DELETE_KEY_INFORMATION Data)
  11. {
  12.         NTSTATUS status = 0;
  13.         PUNICODE_STRING keyName;
  14.         UNICODE_STRING uTarget;
  15.         return STATUS_SUCCESS;
  16. }
  17. NTSTATUS MyRegistryCallback( __in PVOID CallbackContext, __in_opt PVOID Argument1,            / / REG_NOTIFY_CLASS __in_opt PVOID Argument2            //  KEY_INFORMATION ) {
  18.             switch( (REG_NOTIFY_CLASS) Argument1)
  19. {
  20.          case RegNtPreDeleteKey :
  21. return HOOK_PreNtDeleteKey((PREG_DELETE_KEY_INFORMATION) Argument2);
  22.           case RegNtPreRenameKey:
  23. return HOOK_PreNtRenameKey((PREG_RENAME_KEY_INFORMATION) Argument2);
  24.           case RegNtPreCreateKeyEx:         // pre 操作
  25. return HOOK_PreNtCreateKeyEx((PREG_CREATE_KEY_INFORMATION) Argument2);
  26.           case RegNtPostCreateKeyEx :    // post 操作
  27. return HOOK_PostNtCreateKeyEx((PRGG_POST_OPERATION_INFORMATION )}
  28.    }      
  29. }                                                                                                                                  }
  30. main.c
  31. #include "precomp.h"
  32. #define                DEVICE_NAME                                        L"\\device\\HipsRegDrv"
  33. #define                LINK_NAME                                        L"\\dosDevices\\HipsRegDrv"
  34. // function to dispatch the IRPs
  35. NTSTATUS DispatchOK(PDEVICE_OBJECT DeviceObject, PIRP Irp)
  36. {
  37.    Irp->IoStatus.Status = STATUS_SUCCESS;
  38.    IoCompleteRequest(Irp,IO_NO_INCREMENT);
  39.    return STATUS_SUCCESS;
  40. }
  41. VOID DriverUnload (
  42.     IN PDRIVER_OBJECT        pDriverObject)
  43. {
  44.         UNICODE_STRING strLink;
  45.         RtlInitUnicodeString(&strLink, LINK_NAME);
  46.         stopRegMon();
  47.         IoDeleteSymbolicLink(&strLink);
  48.         IoDeleteDevice(pDriverObject->DeviceObject);
  49.         DbgPrint(" Unloaded\n");
  50. }
  51. NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
  52. {
  53.     UNICODE_STRING         DeviceName;
  54.     UNICODE_STRING         LinkName;  
  55.     NTSTATUS                 status;
  56.     PDEVICE_OBJECT         pDriverDeviceObject;  
  57.         ULONG i;
  58.    
  59.     //DbgPrint("Driver loaded.");
  60.     pDriverObject->DriverUnload = DriverUnload;   
  61.    
  62.     // init strings
  63.     RtlInitUnicodeString(&DeviceName, DEVICE_NAME);
  64.     RtlInitUnicodeString(&LinkName, LINK_NAME);
  65.    
  66.     // to communicate with usermode, we need a device
  67.     status = IoCreateDevice(
  68.            pDriverObject,        // ptr to caller object
  69.            0,  // extension device allocated byte number
  70.            &DeviceName,         // device name
  71.            FILE_DEVICE_UNKNOWN,
  72.            0,                   // no special caracteristics
  73.            FALSE,               // we can open many handles in same time
  74.            &pDriverDeviceObject); // [OUT] ptr to the created object
  75.            
  76.     if ( !NT_SUCCESS(status) )
  77.        return STATUS_NO_SUCH_DEVICE;
  78.    
  79.         pDriverDeviceObject-> Flags |= DO_BUFFERED_IO;
  80.     // we also need a symbolic link
  81.     status = IoCreateSymbolicLink(&LinkName,&DeviceName);
  82.     if( !NT_SUCCESS(status) )
  83.     {
  84.                 IoDeleteDevice( pDriverDeviceObject );
  85.         return STATUS_NO_SUCH_DEVICE;
  86.     }  
  87.     for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
  88.                 pDriverObject->MajorFunction[i] = DispatchOK;
  89.    
  90.     startRegMon(pDriverObject);
  91.     //Do other things...   
  92.    
  93.     return STATUS_SUCCESS;
  94. }
  95. precomp.h
  96. #ifndef _PRECOMP_H_
  97. #define _PRECOMP_H_
  98. #include <ntifs.h>
  99. #include <ntddk.h>
  100. #include <windef.h>
  101. #include "regmon.h"
  102. #endif
  103. regmon.c
  104. #include "precomp.h"
  105. GENERIC_MAPPING g_KeyMapping = {KEY_READ, KEY_WRITE, KEY_EXECUTE, KEY_ALL_ACCESS};
  106. static WCHAR g_wszAltitude[] = L"370020";
  107. PGENERIC_MAPPING IoGetKeyGenericMapping( )
  108. {
  109.         return &g_KeyMapping;
  110. }
  111. BOOL MyObQueryObjectName(HANDLE hObjHandle, PUNICODE_STRING ustrObjectName, BOOL bNeedAllocateName)
  112. {
  113.         PVOID                        pQueryBuffer                = NULL;
  114.         DWORD                        dwReqSize                        = 0;
  115.         NTSTATUS                ntStatus                        = 0;
  116.         __try
  117.         {
  118.                 dwReqSize = sizeof(OBJECT_NAME_INFORMATION) + (MAX_PATH + 32)*sizeof(WCHAR);
  119.                
  120.                 pQueryBuffer = ExAllocatePoolWithTag(PagedPool, dwReqSize, 'RFLM');
  121.                
  122.                 if(pQueryBuffer == NULL)
  123.                         return FALSE;
  124.                
  125.                 ntStatus = ZwQueryObject(hObjHandle,
  126.                         ObjectNameInfo,
  127.                         pQueryBuffer,
  128.                         dwReqSize,
  129.                         &dwReqSize);
  130.                
  131.                 if((ntStatus == STATUS_INFO_LENGTH_MISMATCH) ||
  132.                         (ntStatus == STATUS_BUFFER_OVERFLOW) ||
  133.                         (ntStatus == STATUS_BUFFER_TOO_SMALL))
  134.                 {
  135.                         ExFreePool(pQueryBuffer);
  136.                         pQueryBuffer = NULL;
  137.                        
  138.                         pQueryBuffer = ExAllocatePoolWithTag(PagedPool, dwReqSize, 'RFLM');
  139.                        
  140.                         if(pQueryBuffer == NULL)
  141.                         {
  142.                                 return FALSE;
  143.                         }
  144.                        
  145.                         ntStatus = ZwQueryObject(hObjHandle,
  146.                                 ObjectNameInfo,
  147.                                 pQueryBuffer,
  148.                                 dwReqSize,
  149.                                 &dwReqSize);
  150.                        
  151.                 }
  152.                
  153.                 if(NT_SUCCESS(ntStatus))
  154.                 {
  155.                         OBJECT_NAME_INFORMATION * pNameInfo = (OBJECT_NAME_INFORMATION *)pQueryBuffer;
  156.                        
  157.                         if(bNeedAllocateName)
  158.                         {
  159.                                 ustrObjectName->Buffer = ExAllocatePoolWithTag(PagedPool, pNameInfo->Name.Length + sizeof(WCHAR), 'RFLM');
  160.                                
  161.                                 if(ustrObjectName->Buffer)
  162.                                 {
  163.                                         RtlZeroMemory(ustrObjectName->Buffer, pNameInfo->Name.Length + sizeof(WCHAR));
  164.                                         ustrObjectName->Length = 0;
  165.                                         ustrObjectName->MaximumLength = pNameInfo->Name.Length;
  166.                                         RtlCopyUnicodeString(ustrObjectName, &pNameInfo->Name);
  167.                                 }
  168.                                 else
  169.                                         ntStatus = STATUS_INSUFFICIENT_RESOURCES;
  170.                                
  171.                         }
  172.                         else
  173.                                 RtlCopyUnicodeString(ustrObjectName, &pNameInfo->Name);
  174.                 }
  175.         }
  176.         __except(EXCEPTION_EXECUTE_HANDLER)
  177.         {
  178.                 ntStatus = GetExceptionCode();
  179.         }
  180.        
  181.         if(pQueryBuffer)
  182.         {
  183.                 ExFreePool(pQueryBuffer);
  184.                 pQueryBuffer = NULL;
  185.         }
  186.        
  187.         return NT_SUCCESS(ntStatus);
  188. }
  189. LARGE_INTEGER g_RegCookie;
  190. #if (NTDDI_VERSION >= NTDDI_VISTA)
  191. NTSTATUS TlGetObjectNameOnVistaAndLater(PVOID Object, PUNICODE_STRING Name)
  192. {
  193.         PUNICODE_STRING                        pKeyName = NULL;
  194.         NTSTATUS                                ntStatus = 0;
  195.         if(Object == NULL || Name == NULL)
  196.                 return STATUS_INVALID_PARAMETER;
  197.         ntStatus = CmCallbackGetKeyObjectID(&g_RegCookie,
  198.                                                                           Object,
  199.                                                                           NULL,
  200.                                                                          &pKeyName);
  201.         if(NT_SUCCESS(ntStatus) == FALSE)
  202.         {
  203.                 return ntStatus;
  204.         }
  205.         Name->Buffer = ( PWCHAR )ExAllocatePoolWithTag(
  206.                                                         PagedPool,
  207.                                                         pKeyName->Length,
  208.                                                         'RFLM'
  209.                                                         );
  210.         if(Name->Buffer == NULL)
  211.         {
  212.                 return STATUS_INSUFFICIENT_RESOURCES;
  213.         }
  214.         RtlZeroMemory(Name->Buffer, pKeyName->Length);
  215.         Name->Length = 0;
  216.         Name->MaximumLength = pKeyName->Length;
  217.         RtlCopyUnicodeString(Name, pKeyName);
  218.         return STATUS_SUCCESS;
  219. }
  220. #endif
  221. NTSTATUS TlGetObjectNameOnXP(PVOID Object, PUNICODE_STRING Name)
  222. {
  223.         UNICODE_STRING                                ustrKeyName                                = {0};
  224.         HANDLE                                                ObjectHandle                        = NULL;
  225.         NTSTATUS                                        ntStatus                                = 0;
  226.         if(Object == NULL || Name == NULL)
  227.                 return STATUS_INVALID_PARAMETER;
  228.         ntStatus = ObOpenObjectByPointer(Object,
  229.                                                           OBJ_KERNEL_HANDLE ,
  230.                                                           0,
  231.                                                           0,
  232.                                                           NULL,
  233.                                                           KernelMode,
  234.                                                           &ObjectHandle);
  235.         if(NT_SUCCESS(ntStatus) == FALSE)
  236.         {
  237.                 return ntStatus;
  238.         }
  239.         if(MyObQueryObjectName(ObjectHandle, &ustrKeyName, TRUE) == FALSE)
  240.         {
  241.                 ZwClose(ObjectHandle);
  242.                 return STATUS_INSUFFICIENT_RESOURCES;
  243.         }
  244.        
  245.         ZwClose(ObjectHandle);
  246.         Name->Buffer = ( PWCHAR )ExAllocatePoolWithTag(
  247.                                                         PagedPool,
  248.                                                         ustrKeyName.Length,
  249.                                                         'RFLM'
  250.                                                         );
  251.         if(Name->Buffer == NULL)
  252.         {
  253.                 return STATUS_INSUFFICIENT_RESOURCES;
  254.         }
  255.         RtlZeroMemory(Name->Buffer, ustrKeyName.Length);
  256.         Name->Length = 0;
  257.         Name->MaximumLength = ustrKeyName.Length;
  258.         RtlCopyUnicodeString(Name, &ustrKeyName);
  259.         ExFreePool(ustrKeyName.Buffer);
  260.         return STATUS_SUCCESS;
  261. }
  262. NTSTATUS TlGetObjectFullName(PVOID Object, PUNICODE_STRING Name)
  263. {
  264. #if (NTDDI_VERSION >= NTDDI_LONGHORN)
  265.         return TlGetObjectNameOnVistaAndLater(Object, Name);
  266. #else
  267.         return TlGetObjectNameOnXP(Object, Name);
  268. #endif
  269. }
  270. NTSTATUS MyDeleteKey(PREG_DELETE_KEY_INFORMATION Data)
  271. {
  272.         NTSTATUS                        ntStatus                = 0;
  273.         UNICODE_STRING                ustrKeyName                = {0};
  274.         __try
  275.         {
  276.                 if((ExGetPreviousMode() == KernelMode))
  277.                 {
  278.                         return STATUS_SUCCESS;
  279.                 }
  280.                 if(NT_SUCCESS(TlGetObjectFullName(Data->Object, &ustrKeyName)) == FALSE)
  281.                 {
  282.                         return STATUS_SUCCESS;
  283.                 }
  284.                 DbgPrint("DeleteKey Key:%wZ\n", &ustrKeyName);
  285.                 ExFreePool(ustrKeyName.Buffer);
  286.         }
  287.         __except(EXCEPTION_EXECUTE_HANDLER)
  288.         {
  289.         }
  290.         return STATUS_SUCCESS;
  291. }
  292. NTSTATUS MySetValueKey(PREG_SET_VALUE_KEY_INFORMATION Data)
  293. {
  294.         NTSTATUS                                ntStatus                                = 0;
  295.         UNICODE_STRING                        ustrKeyName                                = {0};
  296.         UNICODE_STRING                        ustrTarget                                = {0};
  297.         WCHAR                                        wszKeyPath[MAX_PATH]        = {0};
  298.         __try
  299.         {
  300.                
  301.                 if((ExGetPreviousMode() == KernelMode))
  302.                 {
  303.                         return STATUS_SUCCESS;
  304.                 }
  305.                 if(NT_SUCCESS(TlGetObjectFullName(Data->Object, &ustrKeyName)) == FALSE)
  306.                 {
  307.                         return STATUS_SUCCESS;
  308.                 }
  309.                 ustrTarget.Buffer = wszKeyPath;
  310.                 ustrTarget.MaximumLength = MAX_PATH * sizeof(WCHAR);
  311.                
  312.                 RtlCopyUnicodeString(&ustrTarget, &ustrKeyName);
  313.                 ExFreePool(ustrKeyName.Buffer);
  314.                 if (ustrTarget.Buffer[ustrTarget.Length/sizeof(WCHAR) - 1] != L'\\' )
  315.                         RtlAppendUnicodeToString(&ustrTarget, L"\\");
  316.                 RtlAppendUnicodeStringToString(&ustrTarget, Data->ValueName);
  317.                 DbgPrint("SetValueKey Key:%wZ\n", &ustrTarget);
  318.         }
  319.         __except(EXCEPTION_EXECUTE_HANDLER)
  320.         {
  321.         }
  322.         return STATUS_SUCCESS;
  323. }
  324. NTSTATUS MyDeleteValueKey(PREG_DELETE_VALUE_KEY_INFORMATION Data)
  325. {
  326.         NTSTATUS                                ntStatus                                = 0;
  327.         UNICODE_STRING                        ustrKeyName                                = {0};
  328.         UNICODE_STRING                        ustrTarget                                = {0};
  329.         WCHAR                                        wszKeyPath[MAX_PATH]        = {0};
  330.         __try
  331.         {
  332.                 if((ExGetPreviousMode() == KernelMode))
  333.                 {
  334.                         return STATUS_SUCCESS;
  335.                 }
  336.                 if(NT_SUCCESS(TlGetObjectFullName(Data->Object, &ustrKeyName)) == FALSE)
  337.                 {
  338.                         return STATUS_SUCCESS;
  339.                 }
  340.                 ustrTarget.Buffer = wszKeyPath;
  341.                 ustrTarget.MaximumLength = MAX_PATH * sizeof(WCHAR);
  342.                
  343.                 RtlCopyUnicodeString(&ustrTarget, &ustrKeyName);
  344.                 ExFreePool(ustrKeyName.Buffer);
  345.                 if (ustrTarget.Buffer[ustrTarget.Length/sizeof(WCHAR) - 1]!=L'\\' )
  346.                         RtlAppendUnicodeToString(&ustrTarget, L"\\");
  347.                 RtlAppendUnicodeStringToString(&ustrTarget, Data->ValueName);
  348.                 DbgPrint("DeleteValueKey Key:%wZ\n", &ustrTarget);
  349.         }
  350.         __except(EXCEPTION_EXECUTE_HANDLER)
  351.         {
  352.         }
  353.         return STATUS_SUCCESS;
  354. }
  355. NTSTATUS MyRenameKey(PREG_RENAME_KEY_INFORMATION Data)
  356. {
  357.         NTSTATUS                                ntStatus        = 0;
  358.         UNICODE_STRING                        ustrKeyName = {0};
  359.        
  360.         __try
  361.         {
  362.                 if((ExGetPreviousMode() == KernelMode))
  363.                 {
  364.                         return STATUS_SUCCESS;
  365.                 }
  366.                 if(NT_SUCCESS(TlGetObjectFullName(Data->Object, &ustrKeyName)) == FALSE)
  367.                 {
  368.                         return STATUS_SUCCESS;
  369.                 }
  370.                 DbgPrint("RenameKey Key:%wZ\n", &ustrKeyName);
  371.                 ExFreePool(ustrKeyName.Buffer);
  372.         }
  373.         __except(EXCEPTION_EXECUTE_HANDLER)
  374.         {
  375.         }
  376.         return STATUS_SUCCESS;
  377. }
  378. NTSTATUS MyCreateKey(PREG_PRE_CREATE_KEY_INFORMATION Data)
  379. {
  380.         NTSTATUS                        ntStatus                                = 0;
  381.         UNICODE_STRING                ustrTarget                                = {0};
  382.         WCHAR                                wszKeyName[MAX_PATH]        = {0};
  383.         __try
  384.         {
  385.                 if((ExGetPreviousMode() == KernelMode))
  386.                 {
  387.                         return STATUS_SUCCESS;
  388.                 }
  389.                
  390.                 ustrTarget.Buffer = wszKeyName;
  391.                 ustrTarget.MaximumLength = MAX_PATH * sizeof(WCHAR);
  392.                
  393.                 RtlCopyUnicodeString(&ustrTarget, Data->CompleteName);
  394.                 DbgPrint("CreateKey Key:%wZ\n", &ustrTarget);
  395.         }
  396.         __except(EXCEPTION_EXECUTE_HANDLER)
  397.         {
  398.         }
  399.         return STATUS_SUCCESS;
  400. }
  401. NTSTATUS MyCreateKeyEx(PREG_CREATE_KEY_INFORMATION Data)
  402. {
  403.         NTSTATUS                        ntStatus        = 0;
  404.         UNICODE_STRING                ustrKeyName        = {0};
  405.         UNICODE_STRING                ustrTarget        = {0};
  406.         __try
  407.         {
  408.                 if((ExGetPreviousMode() == KernelMode))
  409.                 {
  410.                         return STATUS_SUCCESS;
  411.                 }
  412.                 if(NT_SUCCESS(TlGetObjectFullName(Data->RootObject, &ustrKeyName)) == FALSE)
  413.                 {
  414.                         return STATUS_SUCCESS;
  415.                 }
  416.                 ustrTarget.MaximumLength = MAX_PATH * sizeof(WCHAR);
  417.                
  418.                 RtlCopyUnicodeString(&ustrTarget, &ustrKeyName);
  419.                 ExFreePool(ustrKeyName.Buffer);
  420.                
  421.                 if(Data->CompleteName)
  422.                 {
  423.                         RtlAppendUnicodeToString(&ustrTarget, L"\\");
  424.                         RtlAppendUnicodeStringToString(&ustrTarget, Data->CompleteName);
  425.                 }
  426.                 DbgPrint("CreateKeyEx :%wZ\n", ustrTarget);
  427.         }
  428.         __except(EXCEPTION_EXECUTE_HANDLER)
  429.         {
  430.         }
  431.         return STATUS_SUCCESS;
  432. }
  433. NTSTATUS MyRegCallback
  434. (
  435.         PVOID CallbackContext,
  436.         PVOID Argument1,
  437.         PVOID Argument2
  438. )
  439. {
  440.         switch( (REG_NOTIFY_CLASS) Argument1)
  441.         {
  442.         case RegNtPreDeleteKey :
  443.                 return MyDeleteKey((PREG_DELETE_KEY_INFORMATION) Argument2);
  444.         case RegNtPreSetValueKey:
  445.                 return MySetValueKey((PREG_SET_VALUE_KEY_INFORMATION) Argument2);
  446.         case RegNtPreDeleteValueKey:
  447.                 return MyDeleteValueKey((PREG_DELETE_VALUE_KEY_INFORMATION) Argument2);
  448.         case RegNtPreRenameKey:
  449.                 return MyRenameKey((PREG_RENAME_KEY_INFORMATION) Argument2);
  450.         case RegNtPreCreateKey:
  451.                 return MyCreateKey((PREG_PRE_CREATE_KEY_INFORMATION) Argument2);       
  452.         case RegNtPreCreateKeyEx:
  453.                 return MyCreateKeyEx((PREG_CREATE_KEY_INFORMATION) Argument2);
  454.         }
  455.         return STATUS_SUCCESS;
  456. }
  457. NTSTATUS startRegMon(PDRIVER_OBJECT driverObject)
  458. {
  459. #if (NTDDI_VERSION >= NTDDI_VISTA)
  460.         UNICODE_STRING uAltitude;
  461.         RtlInitUnicodeString(&uAltitude, g_wszAltitude);
  462.         return CmRegisterCallbackEx(MyRegCallback,
  463.                                                   &uAltitude,
  464.                                                   driverObject,
  465.                                                   NULL,
  466.                                                   &g_RegCookie,
  467.                                                   NULL);       
  468. #else
  469.         return CmRegisterCallback(MyRegCallback,
  470.                                                           NULL,
  471.                                                          &g_RegCookie);
  472. #endif
  473.                                                   
  474. }
  475. VOID stopRegMon( )
  476. {
  477.         CmUnRegisterCallback(g_RegCookie);
  478. }
  479. regmon.c
  480. #ifndef __REGMON_H__
  481. #define __REGMON_H__
  482. typedef enum _OBJECT_INFO_CLASS {
  483.     ObjectBasicInfo,
  484.                 ObjectNameInfo,
  485.                 ObjectTypeInfo,
  486.                 ObjectAllTypesInfo,
  487.                 ObjectProtectionInfo
  488. } OBJECT_INFO_CLASS;
  489. PGENERIC_MAPPING IoGetKeyGenericMapping( );
  490. NTSTATUS
  491. MyRegCallback
  492. (
  493.         PVOID CallbackContext,
  494.         PVOID Argument1,
  495.         PVOID Argument2
  496. );
  497. NTSTATUS startRegMon(PDRIVER_OBJECT driverObject);
  498. VOID stopRegMon( );
  499. #endif
复制代码







可以参考TA的教程
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-19 11:52

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表