익히 알려진 것들이겠지만... 정리차원에서 살포시 올려봅니다.


일단 "프로세스" 에 대한 전체 경로이기 때문에 EPROCESS 에서부터 시작합니다. ^^;;;;




편의상 WinXP SP3 OS 환경 하의 notepad.exe 를 타겟으로 잡고 진행합니다. ^^;;

( XP 이상이면 가능할 것으로 생각됩니다...ㅎ )


타겟으로 잡은 notepad.exe 의 EPROCESS 는 다음과 같습니다.


notepad.exe 의 EPROCESS 펼치기



EPROCESS 의 여러 정보들 중에서  SectionObject, Peb, SeAuditProcessCreationInfo ...


이상의 세가지를 통해 전체경로를 구해보도록 하겠습니다. ( 물론 다른 방법도 있을 수 있겠죠..^^;; )



1. Peb


유저레벨에서도 접근이 가능한 Peb 를 이용하는 것이 가장 일반적인 방법이 아닐까 싶네요.


Peb 에는 다음과 같은 정보들이 있습니다.


notepad.exe 의 PEB 펼치기



ProcessParameters 는 프로세스의 파라메터에 대한 정보를 담고있는데...


ImagePathName 이라는 필드에 해당 프로세스의 전체 경로가 저장이 됩니다.


kd> dt nt!_RTL_USER_PROCESS_PARAMETERS 0x00020000
   +0x000 MaximumLength    : 0x1000
   +0x004 Length           : 0x700
   +0x008 Flags            : 0x22001
   +0x00c DebugFlags       : 0
   +0x010 ConsoleHandle    : (null) 
   +0x014 ConsoleFlags     : 0
   +0x018 StandardInput    : (null) 
   +0x01c StandardOutput   : 0x00010001 Void
   +0x020 StandardError    : (null) 
   +0x024 CurrentDirectory : _CURDIR
   +0x030 DllPath          : _UNICODE_STRING "C:\WINDOWS\system32;C:\WINDOWS\system32;C:\WINDOWS\system;C:\WINDOWS;.;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\UTIL;C:\MyTools\OllyDBG;C:\MyTools\LordPE;C:\MyTools\ImpREC"
   +0x038 ImagePathName    : _UNICODE_STRING "C:\WINDOWS\system32\notepad.exe"
   +0x040 CommandLine      : _UNICODE_STRING ""C:\WINDOWS\system32\notepad.exe" "
   +0x048 Environment      : 0x00010000 Void
   +0x04c StartingX        : 0
   +0x050 StartingY        : 0
   +0x054 CountX           : 0
   +0x058 CountY           : 0
   +0x05c CountCharsX      : 0
   +0x060 CountCharsY      : 0
   +0x064 FillAttribute    : 0
   +0x068 WindowFlags      : 0x401
   +0x06c ShowWindowFlags  : 1
   +0x070 WindowTitle      : _UNICODE_STRING "C:\WINDOWS\system32\notepad.exe"
   +0x078 DesktopInfo      : _UNICODE_STRING "WinSta0\Default"
   +0x080 ShellInfo        : _UNICODE_STRING ""
   +0x088 RuntimeData      : _UNICODE_STRING ""
   +0x090 CurrentDirectores : [32] _RTL_DRIVE_LETTER_CURDIR



2. SeAuditProcessCreationInfo


   +0x1f4 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO
      +0x000 ImageFileName    : 0x86027008 _OBJECT_NAME_INFORMATION
         +0x000 Name             : _UNICODE_STRING "\Device\HarddiskVolume1\WINDOWS\system32\notepad.exe"



3. SectionObject


kd> dt nt!_SECTION_OBJECT 0xe19085f8
   +0x000 StartingVa       : (null) 
   +0x004 EndingVa         : (null) 
   +0x008 Parent           : (null) 
   +0x00c LeftChild        : (null) 
   +0x010 RightChild       : (null) 
   +0x014 Segment          : 0xe182dd08 _SEGMENT_OBJECT

kd> dt nt!_SEGMENT 0xe182dd08
   +0x000 ControlArea      : 0x86005008 _CONTROL_AREA
   +0x004 TotalNumberOfPtes : 0x14
   +0x008 NonExtendedPtes  : 0x14
   +0x00c WritableUserReferences : 0
   +0x010 SizeOfSegment    : 0x14000
   +0x018 SegmentPteTemplate : _MMPTE
   +0x020 NumberOfCommittedPages : 0
   +0x024 ExtendInfo       : (null) 
   +0x028 SystemImageBase  : (null) 
   +0x02c BasedAddress     : 0x01000000 Void
   +0x030 u1               : __unnamed
   +0x034 u2               : __unnamed
   +0x038 PrototypePte     : 0xe182dd48 _MMPTE
   +0x040 ThePtes          : [1] _MMPTE

kd> dt nt!_CONTROL_AREA 0x86005008
   +0x000 Segment          : 0xe182dd08 _SEGMENT
   +0x004 DereferenceList  : _LIST_ENTRY [ 0x0 - 0x0 ]
   +0x00c NumberOfSectionReferences : 1
   +0x010 NumberOfPfnReferences : 0x13
   +0x014 NumberOfMappedViews : 1
   +0x018 NumberOfSubsections : 4
   +0x01a FlushInProgressCount : 0
   +0x01c NumberOfUserReferences : 2
   +0x020 u                : __unnamed
   +0x024 FilePointer      : 0x86132220 _FILE_OBJECT
   +0x028 WaitingForDeletion : (null) 
   +0x02c ModifiedWriteCount : 0
   +0x02e NumberOfSystemCacheViews : 0

kd> dt nt!_FILE_OBJECT 0x86132220
   +0x000 Type             : 0n5
   +0x002 Size             : 0n112
   +0x004 DeviceObject     : 0x863bd900 _DEVICE_OBJECT
   +0x008 Vpb              : 0x863e28e0 _VPB
   +0x00c FsContext        : 0xe1043d90 Void
   +0x010 FsContext2       : 0xe1043ee8 Void
   +0x014 SectionObjectPointer : 0x86133424 _SECTION_OBJECT_POINTERS
   +0x018 PrivateCacheMap  : (null) 
   +0x01c FinalStatus      : 0n0
   +0x020 RelatedFileObject : (null) 
   +0x024 LockOperation    : 0 ''
   +0x025 DeletePending    : 0 ''
   +0x026 ReadAccess       : 0x1 ''
   +0x027 WriteAccess      : 0 ''
   +0x028 DeleteAccess     : 0 ''
   +0x029 SharedRead       : 0x1 ''
   +0x02a SharedWrite      : 0 ''
   +0x02b SharedDelete     : 0x1 ''
   +0x02c Flags            : 0x44042
   +0x030 FileName         : _UNICODE_STRING "\WINDOWS\system32\notepad.exe"
   +0x038 CurrentByteOffset : _LARGE_INTEGER 0x0
   +0x040 Waiters          : 0
   +0x044 Busy             : 0
   +0x048 LastLock         : (null) 
   +0x04c Lock             : _KEVENT
   +0x05c Event            : _KEVENT
   +0x06c CompletionContext : (null) 


"프로세스" 에 포커스를 맞춰서 전체경로를 얻어오는 방법을 정리한건데...


"전체경로" 에 포커스를 맞춘다면 Peb 의 Ldr 정보를 이용하거나...


VadRoot 를 이용해서 로딩된 모듈들의 전체 경로를 구할 수도 있습니다.

그 중에서 프로세스의 경로만 가져오면 되겠죠... ^^;;;;;