网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.

内核R0层通过_EPROCESS结构体获取进程的路径( Windows 7 x86)

本文出自悠然品鉴小悠,转载请注明出处: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));
}


  • 标签:
  • EPROCESS获取进程路径
  • R0获取进程路径
网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.