内核层监控进程 线程 创建和销毁

来源:互联网 发布:mac登录不了app store 编辑:程序博客网 时间:2024/05/20 19:28
#include "ntddk.h"  #include "windef.h"  #include "string.h"  #define SYSNAME "System"  ULONG ProcessNameOffset = 0;ULONG GetProcessNameOffset();VOID DriverUnload(IN PDRIVER_OBJECT DriverObject);NTSTATUS CommonDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);NTSTATUS PsLookupProcessByProcessId(IN ULONG ulProcId, OUT PEPROCESS *pEProcess);VOID ProcessCreateMon(IN HANDLE hParentId, IN HANDLE PId, IN BOOLEAN bCreate);VOID ThreadCreateMon(IN HANDLE PId, IN HANDLE TId, IN BOOLEAN bCreate);//VOID ImageCreateMon(IN PUNICODE_STRING FullImageName, IN HANDLE ProcessId, IN PIMAGE_INFO ImageInfo );  // Çý¶¯Èë¿Ú  NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath){UNICODE_STRING  nameString, linkString;PDEVICE_OBJECT  deviceObject;NTSTATUS        status;int             i;//½¨Á¢É豸  RtlInitUnicodeString(&nameString, L"\\Device\\ProcWatch");status = IoCreateDevice(DriverObject,0,&nameString,FILE_DEVICE_UNKNOWN,0,TRUE,&deviceObject);if (!NT_SUCCESS(status)){return status;}RtlInitUnicodeString(&linkString, L"\\DosDevices\\ProcWatch");status = IoCreateSymbolicLink(&linkString, &nameString);if (!NT_SUCCESS(status)){IoDeleteDevice(DriverObject->DeviceObject);return status;}ProcessNameOffset = GetProcessNameOffset();if (ProcessNameOffset == 0){IoDeleteDevice(DriverObject->DeviceObject);return STATUS_UNSUCCESSFUL;}//status = PsSetLoadImageNotifyRoutine(ImageCreateMon);  //if (!NT_SUCCESS( status ))  //{  //  IoDeleteDevice(DriverObject->DeviceObject);  //  DbgPrint("PsSetLoadImageNotifyRoutine()\n");  //  return status;  //}   status = PsSetCreateThreadNotifyRoutine(ThreadCreateMon);   if (!NT_SUCCESS( status ))   {    IoDeleteDevice(DriverObject->DeviceObject);    DbgPrint("PsSetCreateThreadNotifyRoutine()\n");    return status;   }    //status = PsSetCreateProcessNotifyRoutine(ProcessCreateMon, FALSE);//if (!NT_SUCCESS(status))//{//IoDeleteDevice(DriverObject->DeviceObject);//DbgPrint("PsSetCreateProcessNotifyRoutine()\n");//return status;//}for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++){DriverObject->MajorFunction[i] = CommonDispatch;}DriverObject->DriverUnload = DriverUnload;return STATUS_SUCCESS;}VOID DriverUnload(IN PDRIVER_OBJECT DriverObject){UNICODE_STRING linkString;//PsRemoveLoadImageNotifyRoutine(ImageCreateMon);  PsRemoveCreateThreadNotifyRoutine(ThreadCreateMon);PsSetCreateProcessNotifyRoutine(ProcessCreateMon, TRUE);RtlInitUnicodeString(&linkString, L"\\DosDevices\\ProcWatch");IoDeleteSymbolicLink(&linkString);IoDeleteDevice(DriverObject->DeviceObject);}//´¦ÀíÉ豸¶ÔÏó²Ù×÷  NTSTATUS CommonDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp){Irp->IoStatus.Status = STATUS_SUCCESS;Irp->IoStatus.Information = 0L;IoCompleteRequest(Irp, 0);return Irp->IoStatus.Status;}HANDLE g_dwProcessId;BOOL g_bMainThread;VOID ProcessCreateMon(IN HANDLE hParentId, IN HANDLE PId, IN BOOLEAN bCreate){PEPROCESS   EProcess;ULONG       ulCurrentProcessId;LPTSTR      lpCurProc;NTSTATUS    status;#ifdef _AMD64_  ULONG ProcessId = HandleToUlong(PId);status = PsLookupProcessByProcessId(ProcessId, &EProcess);#else  HANDLE ProcessId = PId;status = PsLookupProcessByProcessId((ULONG)PId, &EProcess);#endif  if (!NT_SUCCESS(status)){DbgPrint("PsLookupProcessByProcessId()\n");return;}if (bCreate){g_bMainThread = TRUE;lpCurProc = (LPTSTR)EProcess;lpCurProc = lpCurProc + ProcessNameOffset;DbgPrint("CREATE PROCESS = PROCESS NAME: %s , PROCESS PARENTID: %d, PROCESS ID: %d, PROCESS ADDRESS %x:\n",lpCurProc,hParentId,PId,EProcess);}else{DbgPrint("TERMINATED == PROCESS ID: %d\n", PId);}}VOID ThreadCreateMon(IN HANDLE PId, IN HANDLE TId, IN BOOLEAN bCreate){PEPROCESS  EProcess, ParentEProcess;LPTSTR     lpCurProc, lpParnentProc;NTSTATUS   status;#ifdef _AMD64_  ULONG System = 4;ULONG dwParentPID = HandleToUlong(PsGetCurrentProcessId());//´´½¨¸ÃÏ̵߳Ľø³Ì  ULONG ProcessId = HandleToUlong(PId);status = PsLookupProcessByProcessId(ProcessId, &EProcess);status = PsLookupProcessByProcessId(dwParentPID, &ParentEProcess);#else  HANDLE System = (HANDLE)4;HANDLE dwParentPID = PsGetCurrentProcessId();//´´½¨¸ÃÏ̵߳Ľø³Ì  HANDLE ProcessId = PId;//ProcessId Êǽø³ÌºÅ£¬ÕâÀïµÄ½ø³ÌºÅÊÇÖ¸Ïò°üÀ¨¸ÃÏ̵߳Ľø³Ì£¬¶ø²»ÊÇ´´½¨¸ÃÏ̵߳Ľø³Ì  status = PsLookupProcessByProcessId((ULONG)ProcessId, &EProcess);status = PsLookupProcessByProcessId((ULONG)dwParentPID, &ParentEProcess);#endif  if (!NT_SUCCESS(status)){DbgPrint("PsLookupProcessByProcessId()\n");return;}if (bCreate){if ((g_bMainThread == TRUE) && (ProcessId != System) && (ProcessId != dwParentPID)){HANDLE dwParentTID = PsGetCurrentThreadId();lpCurProc = (LPTSTR)EProcess;lpParnentProc = (LPTSTR)ParentEProcess;lpCurProc += ProcessNameOffset;lpParnentProc += ProcessNameOffset;DbgPrint("caller: Name=%s PID=%d TID=%d\t\tcalled: Name=%s PID=%d TID=%d\n", \lpParnentProc, dwParentPID, dwParentTID, lpCurProc, ProcessId, TId);g_bMainThread = FALSE;}lpCurProc = (LPTSTR)EProcess;lpCurProc = lpCurProc + ProcessNameOffset;DbgPrint("CREATE THREAD = PROCESS NAME: %s PROCESS ID: %d, THREAD ID: %d\n", lpCurProc, PId, TId);}else{DbgPrint("TERMINATED == THREAD ID: %d\n", TId);}}VOID ImageCreateMon(IN PUNICODE_STRING FullImageName, IN HANDLE ProcessId, IN PIMAGE_INFO ImageInfo){DbgPrint("FullImageName: %S,Process ID: %d\n", FullImageName->Buffer, ProcessId);DbgPrint("ImageBase: %x,ImageSize: %d\n", ImageInfo->ImageBase, ImageInfo->ImageSize);}ULONG GetProcessNameOffset(){PEPROCESS   curproc;int         i;curproc = PsGetCurrentProcess();//  // Scan for 12KB, hopping the KPEB never grows that big!  //  for (i = 0; i < 3 * PAGE_SIZE; i++){if (!strncmp(SYSNAME, (PCHAR)curproc + i, strlen(SYSNAME))){return i;}}//  // Name not found - oh, well  //  return 0;}

原创粉丝点击