#ifndef TYPEDEF_H
#define TYPEDEF_H typedef PPEB (__stdcall *P_PsGetProcessPeb)(PEPROCESS); typedef unsigned char BYTE; typedef struct _RTL_USER_PROCESS_PARAMETERS {
BYTE Reserved1[16];
PVOID Reserved2[10];
UNICODE_STRING ImagePathName;
UNICODE_STRING CommandLine;
} RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS; typedef struct _PEB_LDR_DATA {
BYTE Reserved1[8];
PVOID Reserved2[3];
LIST_ENTRY InMemoryOrderModuleList;
} PEB_LDR_DATA, *PPEB_LDR_DATA; typedef
VOID
(NTAPI *PPS_POST_PROCESS_INIT_ROUTINE) (
VOID
); typedef struct _PEB {
BYTE Reserved1[2];
BYTE BeingDebugged;
BYTE Reserved2[1];
PVOID Reserved3[2];
PPEB_LDR_DATA Ldr;
PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
BYTE Reserved4[104];
PVOID Reserved5[52];
PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
BYTE Reserved6[128];
PVOID Reserved7[1];
ULONG SessionId;
} PEB, *PPEB; #endif
#include <Ntifs.h>
#include <ntddk.h>
#include <Ntstrsafe.h>
#include "typedef.h" DRIVER_INITIALIZE DriverEntry;
DRIVER_UNLOAD UnloadDevice;
DRIVER_DISPATCH DispatchGen; VOID ProcessMon(HANDLE In_hParentId, HANDLE In_hProcessId, BOOLEAN In_BIsCreate)
{
ANSI_STRING astrProcessImage = {0};
ANSI_STRING astrProcessParam = {0};
PPEB pPEB = NULL;
PRTL_USER_PROCESS_PARAMETERS pParam = NULL;
UNICODE_STRING unstrFunName = {0};
PEPROCESS pEProcess = NULL;
P_PsGetProcessPeb PsGetProcessPeb = NULL;
KAPC_STATE KAPC = {0};
BOOLEAN BIsAttached = FALSE; if (In_BIsCreate == FALSE)
{
goto fun_ret;
} if (!NT_SUCCESS(PsLookupProcessByProcessId(In_hProcessId, &pEProcess)))
{
goto fun_ret;
}
//__debugbreak();
RtlInitUnicodeString(&unstrFunName, L"PsGetProcessPeb");
PsGetProcessPeb = MmGetSystemRoutineAddress(&unstrFunName);
if (PsGetProcessPeb == NULL)
{
goto fun_ret;
}
pPEB = PsGetProcessPeb(pEProcess);
if (pPEB == NULL)
{
goto fun_ret;
}
KeStackAttachProcess(pEProcess, &KAPC);
BIsAttached = TRUE;
pParam = pPEB->ProcessParameters;
if (pParam == NULL)
{
goto fun_ret;
}
if (NT_SUCCESS(RtlUnicodeStringToAnsiString(&astrProcessImage, &(pParam->ImagePathName), TRUE)))
{
DbgPrint("PID::%u\t%s\n", In_hProcessId, astrProcessImage.Buffer);
}
if (NT_SUCCESS(RtlUnicodeStringToAnsiString(&astrProcessParam, &(pParam->CommandLine), TRUE)))
{
DbgPrint("PID::%u\t%s\n", In_hProcessId, astrProcessParam.Buffer);
} fun_ret:
if (BIsAttached != FALSE)
{
KeUnstackDetachProcess(&KAPC);
}
if (pEProcess != NULL)
{
ObDereferenceObject(pEProcess);
pEProcess = NULL;
}
RtlFreeAnsiString(&astrProcessImage);
RtlFreeAnsiString(&astrProcessParam);
return;
} NTSTATUS DispatchGen(PDEVICE_OBJECT In_pDevObj, PIRP In_pIRP)
{
if (In_pDevObj == NULL || In_pIRP == NULL)
{
return STATUS_SEVERITY_ERROR;
} In_pIRP->IoStatus.Information = 0;
In_pIRP->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(In_pIRP, IO_NO_INCREMENT);
return STATUS_SUCCESS;
} VOID UnloadDevice(PDRIVER_OBJECT In_pDriObj)
{
PsSetCreateProcessNotifyRoutine(ProcessMon, TRUE);
if (In_pDriObj != NULL)
{
IoDeleteDevice(In_pDriObj->DeviceObject);
}
} NTSTATUS DriverEntry(PDRIVER_OBJECT In_pDriObj, PUNICODE_STRING In_punstrRegPath)
{
ULONG uli = 0;
NTSTATUS stRetVal = STATUS_SUCCESS;
PDEVICE_OBJECT pDevObj = NULL; if (In_pDriObj == NULL || In_punstrRegPath == NULL)
{
stRetVal = STATUS_SEVERITY_ERROR;
goto fun_ret;
} for (uli = 0; uli <= IRP_MJ_MAXIMUM_FUNCTION; uli ++)
{
In_pDriObj->MajorFunction[uli] = DispatchGen;
}
In_pDriObj->DriverUnload = UnloadDevice; stRetVal = IoCreateDevice(In_pDriObj, 0, NULL, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDevObj);
if (!NT_SUCCESS(stRetVal))
{
goto fun_ret;
} stRetVal = PsSetCreateProcessNotifyRoutine(ProcessMon, FALSE); fun_ret:
return stRetVal;
}

ring0获取指定进程的PEB的更多相关文章

  1. dotnet 获取指定进程的输入命令行

    本文告诉大家如何在 dotnet 获取指定的进程的命令行参数 很多的程序在启动的时候都需要传入参数,那么如何拿到这些程序传入的参数? 我找到两个方法,一个需要引用 C++ 库支持 x86 和 x64 ...

  2. dotnet 通过 WMI 获取指定进程的输入命令行

    本文告诉大家如何使用 WMI 通过 Process 获取这个进程传入的命令行 使用下面代码,使用 Win32_Process 拿到所有的进程,通过 WHERE 判断当前的进程,然后拿到进程传入的命令 ...

  3. 获取指定进程号,并kill掉

    直接上案例: 例子:获取nginx进程 方法:$ps -aux |grep nginx |grep -v grep |awk '{print $2}'  或者 $ps -ef |grep nginx ...

  4. 在Shell脚本中获取指定进程的PID

    注意这条命令用反引号(Tab上面的那个键)括起来,作用类似于${ } processId = ` ps -ef | grep fms.jar | grep -v grep | awk '{print ...

  5. [Win32]获取指定进程的父进程PID

    // // #include <Windows.h> #include <winnt.h> #include <winternl.h> typedef NTSTAT ...

  6. wireshark 获取指定进程id的数据

    >netstat -aon | findstr 11380 TCP 191.127.1.7:57936 29.225.107.216:3734 ESTABLISHED 11380 过滤器: tc ...

  7. windows下使用C#获取特定进程网络流量

    最近老板接了一个中船重工的项目,需要做一个有关海军软件系统的组件评估项目,项目中有一个子项目需要获取特定进程的各种系统参数,项目使用.NET平台.在获取特定进程各种系统参数时,其它诸如进程ID,进程名 ...

  8. 2019-11-29-dotnet-通过-WMI-获取指定进程的输入命令行

    原文:2019-11-29-dotnet-通过-WMI-获取指定进程的输入命令行 title author date CreateTime categories dotnet 通过 WMI 获取指定进 ...

  9. 2019-11-29-dotnet-获取指定进程的输入命令行

    title author date CreateTime categories dotnet 获取指定进程的输入命令行 lindexi 2019-11-29 08:35:11 +0800 2019-0 ...

随机推荐

  1. docker登录没有配置https的harbor镜像仓库

    已经搭建harbor 仓库 ,域名  172.16.1.99 出现问题: 客户端尝试登录 仓库 [root@localhost docker]# docker login 172.16.1.99:80 ...

  2. PHP-线程安全与非线程安全版本的区别

    Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍. ...

  3. HDUOJ ---1269迷宫城堡

    http://acm.hdu.edu.cn/showproblem.php?pid=1269 迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  4. CoreData 增删改查

    #pragma mark - Core Data Methods - (void)insertObjectWithFileName:(NSString *)fileName { /** SQL新增记录 ...

  5. php 类和对象

    ⾯向对象是⼀种编程范式,它将对象作为程序的基本单元,将程序和数据封装起来, 以此来提⾼程序的重⽤性.灵活性和可扩展性. ⽬前很多语⾔都⽀持⾯向对象编程,既然对象对象是⼀种范式,其实这就和具体的编程语⾔ ...

  6. MFC中创建多线程

    1.   列举几种进程的同步机制,并比较其优缺点. 原子操作    信号量机制   自旋锁    管程,会合,分布式系统 2.   进程之间通信的途径 共享存储系统       消息传递系统      ...

  7. Windows WaveIn 录音

    设置采集音频格式 WAVEFORMATEX waveform; //采集音频的格式,结构体 waveform.wFormatTag = WAVE_FORMAT_PCM;//声音格式为PCM wavef ...

  8. STL之内存处理

    说明:本文仅供学习交流,转载请标明出处,欢迎转载! STL中与内存配置相关的类是allocator类,头文件为:#include<alllocator>这是一个模板类,用于内存的分配.对象 ...

  9. lcx.exe内网转发命令教程 + LCX免杀下载

    作者: 小健 本机: lcx -listen 2222 3333 2222为转发端口,3333为本机任意未被占用的端口 肉鸡:lcx -slave 119.75.217.56 2222 127.0.0 ...

  10. django中models阅读笔记

    一.使用数据库需要设置settings.py文件. DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', # Add 'postgre ...