内核层监控进程 线程 创建和销毁
来源:互联网 发布: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;}
阅读全文
0 0
- 内核层监控进程 线程 创建和销毁
- 内核层监控进程 线程 创建和销毁
- 通过hook Linux内核函数,监控进程/线程创建与销毁
- 监控系统所有进程的创建和销毁 (PsSetCreateProcessNotifyRoutine)
- 【进程线程与同步】5.1 创建和销毁子进程
- 内核线程创建与销毁
- 测试创建和销毁进程开销于创建和销毁线程开销对比
- 创建和销毁子进程
- 创建和销毁子进程
- linux内核线程创建销毁机制
- linux内核线程创建销毁机制
- linux内核线程的创建与销毁
- linux内核线程的创建与销毁
- linux内核线程的创建与销毁
- 内核中线程的创建与销毁
- 进程.线程,内核线程创建的区别
- 进程创建与销毁
- Linux 进程管理剖析: 创建、管理、调度和销毁进程
- 模型数据降序排列(快排)
- ssh-agent使用
- linux上安装mysql(rpm)
- 扩展方法&泛型的变化
- SqlMapConfig.xml文件配置 mybatis
- 内核层监控进程 线程 创建和销毁
- Selenium IDE使用的相关功能
- 【状态压缩dp 入门】POJ
- 模型数据升序排列(快排)
- web测试方法总结
- 第二章 重构原则
- 浅析Class类(反射机制原理)
- c语言读书笔记
- mapper.xml映射文件配置 mybatis