日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

驱动下通过进程PID获得进程名 (动态获取ImageFileName在EPROCESS结构体中的相对偏移)...

發布時間:2023/12/18 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 驱动下通过进程PID获得进程名 (动态获取ImageFileName在EPROCESS结构体中的相对偏移)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

思路

  進程EPROCESS結構體中含有進程名ImageFileName(需求處ImageFileName在EPROCESS結構體中的相對偏移)——》獲得進程EPROCESS——》通過進程句柄獲得EPROCESS——》通過進程PID打開進程獲得進程句柄

  • 計算ImageFileName在EPROCESS結構體中的相對偏移

    方法一 來個判斷操作系統,再利用windbg調試得到相應的偏移來對應

    方法二 動態獲取這些變量的偏移地址 ?GetProcessNameOffset

        原理是?DriverEntry和AddDEVICE例程運行在系統進程System中。當需要加載時這個進程中會有一個線程將驅動程序加載到內核模式地址空間,并調用DriverEntry例程。此時調用PsGetCurrentProcess獲得的是System進程的EPROCESS。當然也可以利用PsInitialSystemProcess獲得System進程的EPROCESS,因為已知進程名,所以可以在EPROCESS中匹配到對應的字符串,返回此時偏移。

?

?

獲得進程名兩種方法

  • 利用函數PsGetProcessImageFileName
  • 利用已經計算出來的偏移加上EPROCESS首地址得到ImageFileName成員。
  • 實測在 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;//打開進程,獲取句柄status = ZwOpenProcess (&ProcessHandle,PROCESS_ALL_ACCESS,&ObjectAttributes,&myCid);if (!NT_SUCCESS(status)){DbgPrint("error/n");return;}//得到EPROCESS,結構中取進程名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; }

    ?

    轉載于:https://www.cnblogs.com/Crisczy/p/8387944.html

    總結

    以上是生活随笔為你收集整理的驱动下通过进程PID获得进程名 (动态获取ImageFileName在EPROCESS结构体中的相对偏移)...的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。