内核层监控进程 线程 创建和销毁
2017-09-02 17:38
447 查看
#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; }
相关文章推荐
- 内核层监控进程 线程 创建和销毁
- 通过hook Linux内核函数,监控进程/线程创建与销毁
- 测试创建和销毁进程开销于创建和销毁线程开销对比
- 监控系统所有进程的创建和销毁 (PsSetCreateProcessNotifyRoutine)
- 【进程线程与同步】5.1 创建和销毁子进程
- 【进程线程与同步】5.1 创建和销毁子进程
- 进程与线程(二)——进程的管理、创建与销毁
- 进程和线程的创建过程
- JavaSE线程与进程的区别线程的创建与执行
- Java并发编程:线程、进程的创建
- DestroyWindow 窗口创建和销毁要在同一个线程里
- Java并发编程:如何创建线程、进程?
- 进程与线程,线程的两种创建方式
- 卷二 Dalvik与Android源码分析 第二章 进程与线程 2.1 Dalvik虚拟机的进程创建机制 图书版试读--请勿转发
- Linux 创建多进程 & 线程时的进程栈段处理
- Dalvik虚拟机进程和线程的创建过程分析
- Linux进程/线程协作 之 创建指定数量的进程
- Dalvik虚拟机进程和线程的创建过程分析
- 进程注入DLL实现(APC和远程线程创建)
- windbg脚本实践3----监控特定进程创建