思路

  进程EPROCESS结构体中含有进程名ImageFileName(需求处ImageFileName在EPROCESS结构体中的相对偏移)——》获得进程EPROCESS——》通过进程句柄获得EPROCESS——》通过进程PID打开进程获得进程句柄

  • 计算ImageFileName在EPROCESS结构体中的相对偏移

    方法一 来个判断操作系统,再利用windbg调试得到相应的偏移来对应

    方法二 动态获取这些变量的偏移地址  GetProcessNameOffset

        原理是 DriverEntry和AddDEVICE例程运行在系统进程System中。当需要加载时这个进程中会有一个线程将驱动程序加载到内核模式地址空间,并调用DriverEntry例程。此时调用PsGetCurrentProcess获得的是System进程的EPROCESS。当然也可以利用PsInitialSystemProcess获得System进程的EPROCESS,因为已知进程名,所以可以在EPROCESS中匹配到对应的字符串,返回此时偏移。

获得进程名两种方法

  1. 利用函数PsGetProcessImageFileName
  2. 利用已经计算出来的偏移加上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结构体中的相对偏移)...相关推荐

  1. Ubuntu下查看进程PID 终止进程方法汇总

    Ubuntu下查看进程PID & 终止进程方法汇总 一.查看进程及PID 1.top命令查看进程pid 2.直接在终端输入ps命令来查看进程及对应PID 3.pstree 4.pgrep &l ...

  2. malloc和free——结构体中动态内存的管理

    C语言中内存的管理主要是依据malloc和free实现的,其中malloc主要是实现内存的分配,而free则是实现内存的释放.虽然这是我们已经很熟悉的,但是还是存在一些问题.特别是当结构体中存在指针的 ...

  3. windows下查看进程PID

    进行一些操作的时候需要知道进程的标识符,大家都知道进程可以在任务管理器中查看,不过我们看不到有PID 标识符.下面简单提供两种查看进程PID的方法: 方法一:设置任务管理器让其显示PID 方法二:使用 ...

  4. Windows下根据进程id获得进程名

    //根据进程id获得进程名 wstring GetModuleName(DWORD dwPid) {HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS ...

  5. Android --- 动态获取定位权限时: Fragment 中 onRequestPermissionsResult 方法不执行

    今天我在写百度地图 API 定位功能的时候遇到了这样一个问题,需要在打开 APP 首页的时候动态获取定位权限,然后我的代码是这样写的(在 Fragment 中) @Nullablepublic Vie ...

  6. 如何理解进程结构体中的mm和active_mm?

    结构体 task_struct里面有一个mm成员,和一个active_mm成员. 其中mm成员主要是用来区分是用户进程还是内核进程的,对于内核进程来说,mm成员是为NULL空的. 进程地址空间的创建 ...

  7. 【笔试题】C语言结构体中,不同的数据类型在32位和64位下所占字节的区别

    题目 如下C程序,在64位处理器上运行后sz的值是什么? struct st {int *p;int i;char a; }; int sz=sizeof(struct st); 答案 16 解析 考 ...

  8. C语言动态二维数组,结构体动态申请内存空间

    在C语言中,申请一般数组时,数组大小必须是常量.即使是赋了特定值的变量,也不行,比如:int n=3;int a[3];这样的做法是错误的,我们需要动态申请数组内存,如下申请一个动态整数(int)二维 ...

  9. 在windows内核模式下隐藏进程

    进程隐藏之内核实现 1.在内核模式下,系统为每个进程维护了一个EPROCESS结构体,系统所有的进程是通过EPROCESS结构体中的一个ActiveProcessLinks指向的双端链表连接起来的,通 ...

最新文章

  1. 预告 · Flutter Live 2018 全球同步直播
  2. esp8266 wifi模组手机一键配网,配置一次,下次重启设备后不需再进行配网
  3. SQL Server 2012 Always ON笔记
  4. centos6.7x86_64php7安装笔记 new
  5. linux定时执行python脚本_ubuntu定时执行python脚本实例代码
  6. python是什么语言-Python是什么?为什么现在越来越多的人选择学习Python语言
  7. 一些关于java网站开发的相关 文档/工具
  8. 哔哩哔哩手机客户端下载视频转到电脑上播放
  9. excel如何去重统计户数_如何用好excel统计函数
  10. 如何更改iPhone备份和iTunes MobileSync备份文件夹的位置
  11. 微信二维码线下推广是否有效
  12. 虚拟机未正常关闭,结果再次启动的时候打不开了?
  13. java es 如何查询_使用elasticsearch的java-api进行查询
  14. D3D管线以及着色器工作原理-画一个三角形
  15. ViewPager的使用及获取子view控件的操作(inflate)
  16. Golang源码探索----GC的实现原理(6)
  17. 微信小程序--P2P消息收发模式(MQTT)
  18. 企业数字化转型的“迷途”和“指南”
  19. python图形界面设计代码_(八)Python 图形化界面设计
  20. head和tail命令

热门文章

  1. oracle 游标循环 while,Oracle的游标使用方法 三种循环
  2. vsco使用教程_VSCO如何使用 vsco新手教程
  3. wpf文本框限制输入长度_Excel办公实操,限制输入日期,手机号码,不重复数据的使用...
  4. 数据科学项目(二)之明确问题及确立目标
  5. 计算机分级时无法度量视频播放,Win7 64位系统电脑评分出现“无法度量视频播放性能”怎么解决...
  6. matlab逆变换法产生随机数_matlab数值积分方法(一)
  7. 本地tomcat 配置环境变量
  8. IntelliJ IDEA 使用Maven工具 (新手入门简单操作,maven的下载,安装,配置)
  9. intel fpga 开发工具Quartus Prime 软件的安装,使用详细教程
  10. centos文件服务器软件,seafile服务器端的centos8的快速部署