NTProcDrv.c
上传用户:jstlsd
上传日期:2007-01-13
资源大小:186k
文件大小:8k
源码类别:

钩子与API截获

开发平台:

Visual C++

  1. //---------------------------------------------------------------------------
  2. //
  3. // NTProcDrv.c
  4. //
  5. // SUBSYSTEM: 
  6. // System monitor
  7. // MODULE:    
  8. // Driver for monitoring NT process and DLLs mapping
  9. //              monitoring. 
  10. //
  11. // DESCRIPTION:
  12. //              This code is based on the James Finnegan抯 sample 
  13. //              (MSJ January 1999).
  14. //
  15. // AUTHOR: Ivo Ivanov (ivopi@hotmail.com), January 2002
  16. //                                                                         
  17. //---------------------------------------------------------------------------
  18. //---------------------------------------------------------------------------
  19. //
  20. // Includes
  21. //  
  22. //---------------------------------------------------------------------------
  23. #include <ntddk.h>
  24. //---------------------------------------------------------------------------
  25. //
  26. // Defines
  27. //  
  28. //---------------------------------------------------------------------------
  29. #define FILE_DEVICE_UNKNOWN             0x00000022
  30. #define IOCTL_UNKNOWN_BASE              FILE_DEVICE_UNKNOWN
  31. #define IOCTL_NTPROCDRV_GET_PROCINFO    CTL_CODE(IOCTL_UNKNOWN_BASE, 0x0800, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
  32. //---------------------------------------------------------------------------
  33. //
  34. // Forward declaration
  35. //  
  36. //---------------------------------------------------------------------------
  37. void UnloadDriver(
  38. PDRIVER_OBJECT DriverObject
  39. );
  40. NTSTATUS DispatchCreateClose(
  41. IN PDEVICE_OBJECT DeviceObject, 
  42. IN PIRP Irp
  43. );
  44. NTSTATUS DispatchIoctl(
  45. IN PDEVICE_OBJECT DeviceObject, 
  46. IN PIRP Irp
  47. );
  48. //
  49. // process structure callbacks
  50. //  
  51. VOID ProcessCallback(
  52. IN HANDLE  hParentId, 
  53. IN HANDLE  hProcessId, 
  54. IN BOOLEAN bCreate
  55. );
  56. //
  57. // Structure for process callback information
  58. //
  59. typedef struct _CallbackInfo
  60. {
  61.     HANDLE  hParentId;
  62.     HANDLE  hProcessId;
  63.     BOOLEAN bCreate;
  64. }CALLBACK_INFO, *PCALLBACK_INFO;
  65. //
  66. // Private storage 
  67. //
  68. typedef struct _DEVICE_EXTENSION 
  69. {
  70.     PDEVICE_OBJECT DeviceObject;
  71.     HANDLE  hProcessHandle;
  72.     PKEVENT ProcessEvent;
  73.     HANDLE  hPParentId;
  74.     HANDLE  hPProcessId;
  75.     BOOLEAN bPCreate;
  76. } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
  77. PDEVICE_OBJECT g_pDeviceObject;
  78. //
  79. // The main entry point of the driver module
  80. //
  81. NTSTATUS DriverEntry(
  82. IN PDRIVER_OBJECT DriverObject, 
  83. IN PUNICODE_STRING RegistryPath
  84. )
  85. {
  86.     NTSTATUS        ntStatus;
  87.     UNICODE_STRING  uszDriverString;
  88.     UNICODE_STRING  uszDeviceString;
  89.     UNICODE_STRING  uszProcessEventString;
  90.     PDEVICE_OBJECT    pDeviceObject;
  91.     PDEVICE_EXTENSION extension;
  92.     
  93. // Point uszDriverString at the driver name
  94.     RtlInitUnicodeString(&uszDriverString, L"\Device\NTProcDrv");
  95.     // Create and initialize device object
  96.     ntStatus = IoCreateDevice(
  97. DriverObject,
  98.         sizeof(DEVICE_EXTENSION),
  99.         &uszDriverString,
  100.         FILE_DEVICE_UNKNOWN,
  101.         0,
  102.         FALSE,
  103.         &pDeviceObject
  104. );
  105.     if(ntStatus != STATUS_SUCCESS)
  106.         return ntStatus;
  107.     
  108. // Assign extension variable
  109.     extension = pDeviceObject->DeviceExtension;
  110.     
  111. // Point uszDeviceString at the device name
  112.     RtlInitUnicodeString(&uszDeviceString, L"\DosDevices\NTProcDrv");
  113.     
  114. // Create symbolic link to the user-visible name
  115.     ntStatus = IoCreateSymbolicLink(&uszDeviceString, &uszDriverString);
  116.     if(ntStatus != STATUS_SUCCESS)
  117.     {
  118.         // Delete device object if not successful
  119.         IoDeleteDevice(pDeviceObject);
  120.         return ntStatus;
  121.     }
  122.     // Assign global pointer to the device object for use by the callback functions
  123.     g_pDeviceObject = pDeviceObject;
  124.     // Load structure to point to IRP handlers
  125.     DriverObject->DriverUnload                         = UnloadDriver;
  126.     DriverObject->MajorFunction[IRP_MJ_CREATE]         = DispatchCreateClose;
  127.     DriverObject->MajorFunction[IRP_MJ_CLOSE]          = DispatchCreateClose;
  128.     DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoctl;
  129.     // Create event for user-mode processes to monitor
  130.     RtlInitUnicodeString(&uszProcessEventString, L"\BaseNamedObjects\NTProcDrvProcessEvent");
  131.     extension->ProcessEvent = IoCreateNotificationEvent (&uszProcessEventString, &extension->hProcessHandle);
  132.     // Clear it out
  133.     KeClearEvent(extension->ProcessEvent);
  134.     // Set up callback routines
  135.     ntStatus = PsSetCreateProcessNotifyRoutine(ProcessCallback, FALSE);
  136.     // Return success
  137.     return ntStatus;
  138. }
  139. //
  140. // Create and close routine
  141. //
  142. NTSTATUS DispatchCreateClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
  143. {
  144.     Irp->IoStatus.Status = STATUS_SUCCESS;
  145.     Irp->IoStatus.Information=0;
  146.     IoCompleteRequest(Irp, IO_NO_INCREMENT);
  147.     return STATUS_SUCCESS;
  148. }
  149. //
  150. // Process function callback
  151. //
  152. VOID ProcessCallback(
  153. IN HANDLE  hParentId, 
  154. IN HANDLE  hProcessId, 
  155. IN BOOLEAN bCreate
  156. )
  157. {
  158.     PDEVICE_EXTENSION extension;
  159.     // Assign extension variable
  160.     extension = g_pDeviceObject->DeviceExtension;
  161.     // Assign current values into device extension.  
  162. // User-mode apps will pick it up using DeviceIoControl calls.
  163.     extension->hPParentId  = hParentId;
  164.     extension->hPProcessId = hProcessId;
  165.     extension->bPCreate    = bCreate;
  166.     // Pulse the event so any user-mode apps listening will know something
  167.     // interesting has happened.  Sadly, user-mode apps can't reset a KM
  168.     // event, which is why we're pulsing it here...
  169.     KeSetEvent(extension->ProcessEvent, 0, FALSE);
  170.     KeClearEvent(extension->ProcessEvent);
  171. }
  172. NTSTATUS DispatchIoctl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
  173. {
  174.     NTSTATUS              ntStatus = STATUS_UNSUCCESSFUL;
  175.     PIO_STACK_LOCATION    irpStack  = IoGetCurrentIrpStackLocation(Irp);
  176.     PDEVICE_EXTENSION     extension = DeviceObject->DeviceExtension;
  177.     PCALLBACK_INFO        pCallbackInfo;
  178. //
  179.     // These IOCTL handlers get the current data out of the device
  180.     // extension structure.  
  181. //
  182.     switch(irpStack->Parameters.DeviceIoControl.IoControlCode)
  183.     {
  184.         case IOCTL_NTPROCDRV_GET_PROCINFO:
  185.             if(irpStack->Parameters.DeviceIoControl.OutputBufferLength >= sizeof(CALLBACK_INFO))
  186.             {
  187.                 pCallbackInfo = Irp->AssociatedIrp.SystemBuffer;
  188.                 pCallbackInfo->hParentId  = extension->hPParentId;
  189.                 pCallbackInfo->hProcessId = extension->hPProcessId;
  190.                 pCallbackInfo->bCreate    = extension->bPCreate;
  191.     
  192.                 ntStatus = STATUS_SUCCESS;
  193.             }
  194.             break;
  195.         default:
  196.             break;
  197.     }
  198.     Irp->IoStatus.Status = ntStatus;
  199.    
  200.     // Set number of bytes to copy back to user-mode
  201.     if(ntStatus == STATUS_SUCCESS)
  202.         Irp->IoStatus.Information = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
  203.     else
  204.         Irp->IoStatus.Information = 0;
  205.     IoCompleteRequest(Irp, IO_NO_INCREMENT);
  206.     return ntStatus;
  207. }
  208. //
  209. // Driver unload routine
  210. //
  211. void UnloadDriver(IN PDRIVER_OBJECT DriverObject)
  212. {
  213.     UNICODE_STRING  uszDeviceString;
  214. NTSTATUS        ntStatus;
  215.     // restore the call back routine, thus givinig chance to the 
  216. // user mode application to unload dynamically the driver
  217.     ntStatus = PsSetCreateProcessNotifyRoutine(ProcessCallback, TRUE);
  218.     IoDeleteDevice(DriverObject->DeviceObject);
  219.     RtlInitUnicodeString(&uszDeviceString, L"\DosDevices\NTProcDrv");
  220.     IoDeleteSymbolicLink(&uszDeviceString);
  221. }
  222. //----------------------End of file -----------------------------------------