ring0获取指定进程的PEB
#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的更多相关文章
- dotnet 获取指定进程的输入命令行
本文告诉大家如何在 dotnet 获取指定的进程的命令行参数 很多的程序在启动的时候都需要传入参数,那么如何拿到这些程序传入的参数? 我找到两个方法,一个需要引用 C++ 库支持 x86 和 x64 ...
- dotnet 通过 WMI 获取指定进程的输入命令行
本文告诉大家如何使用 WMI 通过 Process 获取这个进程传入的命令行 使用下面代码,使用 Win32_Process 拿到所有的进程,通过 WHERE 判断当前的进程,然后拿到进程传入的命令 ...
- 获取指定进程号,并kill掉
直接上案例: 例子:获取nginx进程 方法:$ps -aux |grep nginx |grep -v grep |awk '{print $2}' 或者 $ps -ef |grep nginx ...
- 在Shell脚本中获取指定进程的PID
注意这条命令用反引号(Tab上面的那个键)括起来,作用类似于${ } processId = ` ps -ef | grep fms.jar | grep -v grep | awk '{print ...
- [Win32]获取指定进程的父进程PID
// // #include <Windows.h> #include <winnt.h> #include <winternl.h> typedef NTSTAT ...
- wireshark 获取指定进程id的数据
>netstat -aon | findstr 11380 TCP 191.127.1.7:57936 29.225.107.216:3734 ESTABLISHED 11380 过滤器: tc ...
- windows下使用C#获取特定进程网络流量
最近老板接了一个中船重工的项目,需要做一个有关海军软件系统的组件评估项目,项目中有一个子项目需要获取特定进程的各种系统参数,项目使用.NET平台.在获取特定进程各种系统参数时,其它诸如进程ID,进程名 ...
- 2019-11-29-dotnet-通过-WMI-获取指定进程的输入命令行
原文:2019-11-29-dotnet-通过-WMI-获取指定进程的输入命令行 title author date CreateTime categories dotnet 通过 WMI 获取指定进 ...
- 2019-11-29-dotnet-获取指定进程的输入命令行
title author date CreateTime categories dotnet 获取指定进程的输入命令行 lindexi 2019-11-29 08:35:11 +0800 2019-0 ...
随机推荐
- 二分查找法的C++泛型实现
算法非常easy,直接贴代码啦 #include <iostream> using namespace std; template<typename T> int binary ...
- Laravel中的信息验证 和 语言包
首先,谈下语言包的问题 1.安装语言包,通过composer进行安装 composer require "overtrue/laravel-lang:dev-master" 2.成 ...
- YACC、LEX、JAVACC-------常用的编译工具
CC(Compiler Compiler) CC的意思就是"编译器的编译器". 你可以定义一种上下文无关文法(CFG),然后针对这个特定的CFG你可以写出一个C程序来解释这种CFG ...
- 分布式缓存技术memcached学习系列(五)—— memcached java客户端的使用
Memcached的客户端简介 我们已经知道,memcached是一套分布式的缓存系统,memcached的服务端只是缓存数据的地方,并不能实现分布式,而memcached的客户端才是实现分布式的地方 ...
- 解决js中文输入法无法触发onkeyup事件问题(转)
当监听一个input的keyup的事件的时候,英文输入法的情况下可以实时的通过keyup事件检测到文本框value的变化,但是当输入法变成中文后,input的keyup事件就不会被正常触发. onin ...
- Android四款系统架构工具
开发者若想开发出一款高质量的应用,一款功能强大的开发工具想必是不可或缺的.开发工具简化了应用的开发流程,也能使开发者在应用开发本身投入更多的精力.本文就为大家带来4款实用的Android应用架构工具. ...
- python学习笔记——mongodb数据库
1 概述 1.1 文件管理阶段 优点:可以长期保存 能存储大量数据 缺点:没有结构化的组织 查找不方便 数据容易冗余 1.2 数据库管理阶段 有文件存储的优点,同时解决了文件存储的问题 缺点 : 操作 ...
- Python练习笔记——编写一个装饰器,测算出一个函数的运行时间
import time def time_value(dec): def wrapper(*args,**kwargs): start_time = time.time() get_str = dec ...
- go 学习 ---数据类型
25个关键字 程序声明:import, package 程序实体声明和定义:chan, const, func, interface, map, struct, type, var 程序流程控制:go ...
- EF 多线程TransactionScope事务异常"事务EFTransaction类定义:与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。"
解决方案代码一:使用lock锁定 //对于锁推荐使用静态私有静态变量 private readonly static object _MyLock = new object(); /// <su ...