驱动层分别使用PEB和sectionObject获取进程执行文件全路径的方法

在WIN2003 SP2环境下,通过PEB的ProcessParameters和SectionObject的Segment及ControlArea获取进程执行文件的完整路径。代码示例展示了如何从EPROCESS结构中遍历到必要的数据结构,最终转换为ANSI字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本人是在WIN2003 SP2下开发的,请注意不同操作系统的偏移量不同

 

PEB

 

EPROCESS->PEB(_PEB)->ProcessParameters((_RTL_USER_PROCESS_PARAMETERS)->ImagePathName(_UNICODE_STRING)

  1. void GetProcessName( IN OUT PCHAR pszName)
  2. {
  3.         int pebOffeset=0x1a0;
  4.         int RTLUSERPROCESSPARAMETERSOffset= 0x010;
  5.         int imagePathNameOffset=0x038;
  6.     ANSI_STRING astr;
  7.     UNICODE_STRING US;
  8.     PEPROCESS peCurProc;
  9.     ULONG* dwAddress;
  10.     peCurProc=PsGetCurrentProcess();//EPROCESS
  11.     dwAddress=(ULONG*)peCurProc;
  12.     
  13.     if(dwAddress!=NULL)
  14.     {
  15.         dwAddress=*((ULONG**)dwAddress+pebOffeset/sizeof(ULONG));//EPROCESS->PEB
  16.         if(dwAddress!=NULL)
  17.         {
  18.             dwAddress=*((ULONG**)dwAddress+RTLUSERPROCESSPARAMETERSOffset /sizeof(ULONG));//PEB->ProcessParameters(_RTL_USER_PROCESS_PARAMETERS)
  19.             if(dwAddress!=NULL)
  20.             {
  21.                 US=*((UNICODE_STRING*)dwAddress+imagePathNameOffset/sizeof(UNICODE_STRING));//PEB->ProcessParameters->ImagePathName(_UNICODE_STRING)
  22.                 if(RtlUnicodeStringToAnsiString(&astr,(PUNICODE_STRING)&US,TRUE)==STATUS_SUCCESS)
  23.                 {
  24.                     strcpy(pszName, astr.Buffer);
  25.                     RtlFreeAnsiString( &astr );
  26.                 }
  27.             }
  28.         }
  29.     
  30.     }
  31. }

 

SectionObject

EPROCESS->SectionObject(_SECTION_OBJECT)->Segment(_SEGMENT)->ControlArea (_CONTROL_AREA)->FilePointer( _FILE_OBJECT)

 

  1. PEPROCESS   peCurProc;
  2. ULONG* dwAddress;
  3. PFILE_OBJECT FileObject;
  4. UNICODE_STRING usDosName;
  5. STRING fileName; 
  6. STRING dosName;
  7. peCurProc = PsGetCurrentProcess();
  8. dwAddress=(ULONG*)peCurProc;
  9. if(MmIsAddressValid(dwAddress))
  10. {
  11.     dwAddress=*((ULONG**)dwAddress+0x124/sizeof(ULONG));//EPROCESS->SectionObject
  12.     if(MmIsAddressValid(dwAddress))
  13.     {
  14.         dwAddress=*((ULONG**)dwAddress+0x014/sizeof(ULONG));//EPROCESS->SectionObject->Segment
  15.         if(MmIsAddressValid(dwAddress))
  16.         {
  17.             dwAddress=*((ULONG**)dwAddress+0x000/sizeof(ULONG));//EPROCESS->SectionObject->Segment->ControlArea
  18.             if(MmIsAddressValid(dwAddress))
  19.             {
  20.                 FileObject=(PFILE_OBJECT)(*((ULONG**)dwAddress+0x024 /sizeof(ULONG)));//EPROCESS->SectionObject->Segment->ControlArea->FilePointer
  21.                 if(MmIsAddressValid(FileObject));
  22.                 {
  23.                       
  24.                     if(RtlVolumeDeviceToDosName(FileObject->DeviceObject,&usDosName)==STATUS_SUCCESS)//获取磁盘逻辑名称
  25.                     {
  26.                         RtlUnicodeStringToAnsiString(&dosName,&usDosName, TRUE); 
  27.                         RtlUnicodeStringToAnsiString(&fileName,&FileObject->FileName, TRUE);//文件名
  28.                         DbgPrint(dosName.Buffer);
  29.                         DbgPrint(fileName.Buffer);
  30.                         DbgPrint("/n/n");
  31.                         RtlFreeAnsiString(&dosName);
  32.                         RtlFreeAnsiString(&fileName);
  33.                     }
  34.                 }
  35.             }
  36.         }
  37.     }
  38. }
  39.         

 

PEB可以通过某种方式擦除

 

相关链接:

EPROCESS 的结构导出(WINXP和WIN2003)

PEB 结构导出(WINXP和WIN2003)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值