通过SECTION对象得到文件名

进程创建、dll加载,都要用到section。我们可以hook相关的函数,比如ZwMapViewOfSection,替换section。可以通过section_object得到对应的文件对象。


lkd> dt _eprocess 8248da78
ntdll!_EPROCESS
   +0x000 Pcb              : _KPROCESS
   ....
   +0x138 SectionObject    : 0xe1ad2158 Void
   +0x13c SectionBaseAddress : 0x01000000 Void

lkd> dt _section_object 0xe1ad2158
nt!_SECTION_OBJECT
   +0x000 StartingVa       : (null) 
   +0x004 EndingVa         : (null) 
   +0x008 Parent           : (null) 
   +0x00c LeftChild        : (null) 
   +0x010 RightChild       : (null) 
   +0x014 Segment          : 0xe11166d8 _SEGMENT_OBJECT

lkd> dt _SEGMENT_OBJECT 0xe11166d8
nt!_SEGMENT_OBJECT
   +0x000 BaseAddress      : 0x822c7e08 Void
   +0x004 TotalNumberOfPtes : 0x97
   +0x008 SizeOfSegment    : _LARGE_INTEGER 0x97
   +0x010 NonExtendedPtes  : 0x97000
   +0x014 ImageCommitment  : 0
   +0x018 ControlArea      : 0x00000420 _CONTROL_AREA
   +0x01c Subsection       : 0x822c7eb8 _SUBSECTION
   +0x020 LargeControlArea : (null) 
   +0x024 MmSectionFlags   : (null) 
   +0x028 MmSubSectionFlags : (null)
 
lkd> dt _CONTROL_AREA 0x822c7e08
nt!_CONTROL_AREA
   +0x000 Segment          : 0xe11166d8 _SEGMENT
   +0x004 DereferenceList  : _LIST_ENTRY [ 0x0 - 0x0 ]
   +0x00c NumberOfSectionReferences : 1
   +0x010 NumberOfPfnReferences : 0x7b
   +0x014 NumberOfMappedViews : 1
   +0x018 NumberOfSubsections : 5
   +0x01a FlushInProgressCount : 0
   +0x01c NumberOfUserReferences : 2
   +0x020 u                : __unnamed
   +0x024 FilePointer      : 0x82101ad0 _FILE_OBJECT
   +0x028 WaitingForDeletion : (null) 
   +0x02c ModifiedWriteCount : 0
   +0x02e NumberOfSystemCacheViews : 0

lkd> dt _file_object 0x82101ad0
ntdll!_FILE_OBJECT
   +0x000 Type             : 0n5
   +0x002 Size             : 0n112
   +0x004 DeviceObject     : 0x82539900 _DEVICE_OBJECT
   +0x008 Vpb              : 0x8246e288 _VPB
   +0x00c FsContext        : 0xe22cf990 Void
   +0x010 FsContext2       : 0xe22cfae8 Void
   +0x014 SectionObjectPointer : 0x8235dc5c _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 "\WinDDK\7600.16385.1\Debuggers\windbg.exe"
   +0x038 CurrentByteOffset : _LARGE_INTEGER 0x0
   +0x040 Waiters          : 0
   +0x044 Busy             : 0
   +0x048 LastLock         : (null) 
   +0x04c Lock             : _KEVENT
   +0x05c Event            : _KEVENT
   +0x06c CompletionContext : (null) 


lkd> dt _SEGMENT_OBJECT 0xe11166d8
nt!_SEGMENT_OBJECT
   +0x000 BaseAddress      : 0x822c7e08 Void
这个BaseAddress指向一个CONTROL_AREA结构。


据说微软的符号表出了问题,SECTION_OBJECT的最后一个成员不是SEGMENT_OBJECT结构,而是SEGMENT结构。这么说是有道理的,我们看看把它解析成SEGMENT的情况:


lkd> dt _segment 0xe11166d8
nt!_SEGMENT
   +0x000 ControlArea      : 0x822c7e08 _CONTROL_AREA
   +0x004 TotalNumberOfPtes : 0x97
   +0x008 NonExtendedPtes  : 0x97
   +0x00c WritableUserReferences : 0
   +0x010 SizeOfSegment    : 0x97000
   +0x018 SegmentPteTemplate : _MMPTE
   +0x020 NumberOfCommittedPages : 0
   +0x024 ExtendInfo       : (null) 
   +0x028 SystemImageBase  : (null) 
   +0x02c BasedAddress     : 0x01000000 Void
   +0x030 u1               : __unnamed
   +0x034 u2               : __unnamed
   +0x038 PrototypePte     : 0xe1116718 _MMPTE
   +0x040 ThePtes          : [1] _MMPTE
lkd> dt _CONTROL_AREA 0x822c7e08
nt!_CONTROL_AREA
   +0x000 Segment          : 0xe11166d8 _SEGMENT
   +0x004 DereferenceList  : _LIST_ENTRY [ 0x0 - 0x0 ]
   +0x00c NumberOfSectionReferences : 1
   +0x010 NumberOfPfnReferences : 0x7b
   +0x014 NumberOfMappedViews : 1
   +0x018 NumberOfSubsections : 5
   +0x01a FlushInProgressCount : 0
   +0x01c NumberOfUserReferences : 2
   +0x020 u                : __unnamed
   +0x024 FilePointer      : 0x82101ad0 _FILE_OBJECT
   +0x028 WaitingForDeletion : (null) 
   +0x02c ModifiedWriteCount : 0
   +0x02e NumberOfSystemCacheViews : 0


顺眼了不少,不知道微软怎么搞的。