本文出自悠然品鉴小悠,转载请注明出处:http://www.youranshare.com/codeorg/sid/134.html
在R3用户层很轻松就能通过一个进程的PID获取到当前进程的名称以及进程所在的路径,但是在R3层获取路径的函数很容易会被Hook掉,这样你获取的进程路径可能是已经被修改过的,本文这里将会介绍在win7 x86下如何通过_EPROCESS这个结构体获取到进程所在的位置.
在开始之前请自己准备好Windbg,我们将用它来分析_EPROCESS的结构.
我是以我的虚拟机内的dwm.exe这个进程为示例来演示的,首先我们通过 命令 !process 0 0 dwm.exe 来获取到dwm.exe进程的信息,如图所示:
我们可以获取到他的_EPROCESS的地址 0x87ede940,下面我们将通过此地址分析dwm.exe的位置信息。
OK,下面开始分析吧,输入名令 dt _EPROCESS 87ede940 先看一下dwm.exe的_EPROCESS的信息,注意一下偏移为0x1ec的位置,如图所示:
这个_SE_AUDIT_PROCESS_CREATION_INFO的结构(4字节)与位置信息有关,我们跟进一下,看一下这个结构到底存放了什么,使用命令
dt _SE_AUDIT_PROCESS_CREATION_INFO 87ede940+1ec
如图所示:
这个_SE_AUDIT_PROCESS_CREATION_INFO结构里面存放了一个_OBJECT_NAME_INFORMATION类型的指针,并且可以看到对应的地址为0x87edfb60,我们再次跟进一下这个地址看看,使用命令 dt _OBJECT_NAME_INFORMATION 0x87edfb60
如图所示,我们可以看到dwm.exe的路径了:
注意这里的路径是 【以设备名+相对路径】
下面附上一个对应的示例函数代码,通过传入EPROCESS的指针,打印出对应的路径信息:
//对于win7 x86
void DisplayPathByEP( PEPROCESS pEP ) { if (*(PULONG)((ULONG)pEP+0x0b4) == 0x4) { KdPrint(("Systemn")); return ; } //获取 _SE_AUDIT_PROCESS_CREATION_INFO ULONG SEAuditValue = *(PULONG)((ULONG)pEP+0x1ec); //获取_OBJECT_NAME_INFORMATION指针 PULONG pNameInfo = (PULONG)SEAuditValue; PUNICODE_STRING lpPath = (PUNICODE_STRING)(PVOID)pNameInfo; KdPrint(("路径为:%wZ n",lpPath)); }