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 ...
随机推荐
- Go 1.5keyword搜索文件夹、文件、文件内容_修复一个小BUG
package main import ( "bufio" "bytes" "flag" "fmt" "io& ...
- 【微信小程序】实现类似WEB端【返回顶部】功能
1.原理:利用小程序自带的<scroll-view>组件,该组件的bindScroll和scroll-top方法.属性进行联合操作 2.效果图: 3.wxml: <scroll-vi ...
- 【LeetCode】136. Single Number (4 solutions)
Single Number Given an array of integers, every element appears twice except for one. Find that sing ...
- Linux命令-用户管理:useradd,userdel,usermod,id,su,env,exit
添加一个linux用户之后,相当于在linux系统里面创建了如下文件: 添加一个用户(默认也会创建一个同名的用户组,在linux下面用户默认必须在一个用户组里面): useradd wyp 添加用户w ...
- Java中堆内存和栈内存详解【转】
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...
- Javascript-js实现多线程
原文地址:https://www.cnblogs.com/haodawang/articles/5850822.html 在讲之前,大家都知道js是基于单线程的,而这个线程就是浏览器的js引擎.首先来 ...
- Response.Flush() Response.End()的区别
//Response.Flush() 将缓存中的内容立即显示出来//Response.End() 缓冲的输出发送到客户端 停止页面执行//例://Response.Write("520& ...
- oc引入头文件
建立.h的头文件(header file)命名为Hi.h,源码如下: #ifndef oc3_Hi_h #define oc3_Hi_h void sayHi(); #endif 建立.c的头文件(c ...
- Linux 分区注意事项
必须分区: 1)/(根分区) 2)/swap(交换分区,当内存不超过4G时,建议swap大小为内存2倍,若超过4G,建议交换分区跟内存一样大) 推荐分区 /boot(启动分区,单独分区,最新200M)
- A simple case to use Celery:
Prerequisites: 1: Install RabbitMQ as it would be used as message broker for Celery. In windows, i ...