驱动下通过进程PID获得进程名 (动态获取ImageFileName在EPROCESS结构体中的相对偏移)...
思路
進(jìn)程EPROCESS結(jié)構(gòu)體中含有進(jìn)程名ImageFileName(需求處ImageFileName在EPROCESS結(jié)構(gòu)體中的相對偏移)——》獲得進(jìn)程EPROCESS——》通過進(jìn)程句柄獲得EPROCESS——》通過進(jìn)程PID打開進(jìn)程獲得進(jìn)程句柄
- 計算ImageFileName在EPROCESS結(jié)構(gòu)體中的相對偏移
方法一 來個判斷操作系統(tǒng),再利用windbg調(diào)試得到相應(yīng)的偏移來對應(yīng)
方法二 動態(tài)獲取這些變量的偏移地址 ?GetProcessNameOffset
原理是?DriverEntry和AddDEVICE例程運行在系統(tǒng)進(jìn)程System中。當(dāng)需要加載時這個進(jìn)程中會有一個線程將驅(qū)動程序加載到內(nèi)核模式地址空間,并調(diào)用DriverEntry例程。此時調(diào)用PsGetCurrentProcess獲得的是System進(jìn)程的EPROCESS。當(dāng)然也可以利用PsInitialSystemProcess獲得System進(jìn)程的EPROCESS,因為已知進(jìn)程名,所以可以在EPROCESS中匹配到對應(yīng)的字符串,返回此時偏移。
?
?
獲得進(jìn)程名兩種方法
實測在 WIN7 X86 X64下可用
#pragma once#include<ntddk.h> #include<wdm.h>UCHAR* PsGetProcessImageFileName(PEPROCESS Process);VOID DriverUnload(PDRIVER_OBJECT DriverObject) {DbgPrint("DriverUnload()\r\n"); } ULONG GetProcessNameOffset ( void ) {PEPROCESS curproc;int i = 0;curproc = PsGetCurrentProcess();for ( i = 0; i < 3 * PAGE_SIZE; i++ ) {if( !strncmp( "System", (PCHAR)curproc + i, strlen("System") )) {DbgPrint("offset:%d",i);return i;}}return 0;}void GetProcessName(ULONG dwPid) {HANDLE ProcessHandle;NTSTATUS status;OBJECT_ATTRIBUTES ObjectAttributes;CLIENT_ID myCid;PEPROCESS EProcess;int a=GetProcessNameOffset();InitializeObjectAttributes(&ObjectAttributes,0,0,0,0); myCid.UniqueProcess = (HANDLE)dwPid;myCid.UniqueThread = 0;//打開進(jìn)程,獲取句柄status = ZwOpenProcess (&ProcessHandle,PROCESS_ALL_ACCESS,&ObjectAttributes,&myCid);if (!NT_SUCCESS(status)){DbgPrint("error/n");return;}//得到EPROCESS,結(jié)構(gòu)中取進(jìn)程名status = ObReferenceObjectByHandle(ProcessHandle,FILE_READ_DATA,0,KernelMode,&EProcess, 0);if (status == STATUS_SUCCESS){char *ProcessName = (char*)EProcess + a;char *PsName = PsGetProcessImageFileName(EProcess);DbgPrint("ProcessName is %s",ProcessName);DbgPrint("PsName is %s/n",PsName);ObDereferenceObject(EProcess);ZwClose(ProcessHandle);}else{DbgPrint("Get ProcessName error");ObDereferenceObject(EProcess);ZwClose(ProcessHandle);} }NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath) {DbgPrint("sucess load/n");GetProcessName(2900);DriverObject->DriverUnload = DriverUnload; return STATUS_SUCCESS; }?
轉(zhuǎn)載于:https://www.cnblogs.com/Crisczy/p/8387944.html
總結(jié)
以上是生活随笔為你收集整理的驱动下通过进程PID获得进程名 (动态获取ImageFileName在EPROCESS结构体中的相对偏移)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python之socketserver模
- 下一篇: js常用DOM操作