วันอาทิตย์ที่ 18 พฤศจิกายน พ.ศ. 2550

โครงสร้างข้อมูล (data structure) ของ PEB บน Windows XP SP2

ตอนนี้อยู่ระหว่างการพัฒนา lspd ให้สามารถทำงานได้บน Windows XP SP2 (ของเก่าที่เขียนโดย Harlan Carvey ทำงานได้บน Windows 2000 เท่านั้น) ซึ่งจากการไล่โค้ดดูพบว่ามันมีการอ่าน PEB ด้วย เนื่องจาก PEB บน Windows 2000 กับบน Windows XP SP2 น่าจะมีความแตกต่างกันบ้าง...

ว่าแล้วก็เปิด Windbg ขึ้นมาแล้วเลือกที่ File -> Kernel Debug ... จากนั้นเลือกที่แถบ Local จากนั้น click ที่ OK เพื่อเป็นการรัน Kernel Debugger แบบ Local (การรัน Kernel Debugger นั้นสามารถทำได้ตั้งแต่ระบบปฏิบัติการ Windows XP SP เท่าไหร่ก็ไม่รู้ขึ้นไป แต่รันบน Windows 2000 ไม่ได้ครับ ต้องใช้ livekd แทน)

เมื่อรันได้ผลดังนี้

Microsoft (R) Windows Debugger Version 6.6.0007.5
Copyright (c) Microsoft Corporation. All rights reserved.

Connected to Windows XP 2600 x86 compatible target, ptr64 FALSE
Symbol search path is: C:\WINDOWS\SYSTEM32\ntoskrnl.exe;C:\WINDOWS\Symbols

Executable search path is:

*** ERROR: Symbol file could not be found. Defaulted to export symbols for ntoskrnl.exe -

*******************************************************************************


(มีต่ออีกแต่ตัดมาแค่นี้) มัน error แฮะ - -" ลองรันคำสั่ง .reload ก้อยังมี error เหมือนเดิม พอรันคำสั่ง dt _PEB เพื่อทดสอบมันก็ฟ้องว่าไม่สามารถ resolve _PEB ได้

ไปๆมาลองสังเกตที่ Symbol search path ดูพบว่ามันเป็น C:\WINDOWS\SYSTEM32\ntoskrnl.exe;C:\WINDOWS\Symbols แต่ไอ้ที่ตั้งค่าไว้มันมีแค่ C:\WINDOWS\Symbols นี่หน่า... ว่าแล้วก็เลยไปไปดูที่ File --> Symbol Path File... พบว่ามันตั้งค่าเป็น C:\WINDOWS\system32 - -" ไปกันใหญ่เลย ว่าแล้วก็ตั้งค่าเป็น C:\WINDOWS\Symbols ซะแล้วรันคำสั่ง .reload จากนั้นรันคำสั่งเพื่อดูโครงสร้างข้อมูลของ PEB ได้ผลดังข้างล่าง

lkd> dt _PEB
+0x000 InheritedAddressSpace : UChar
+0x001 ReadImageFileExecOptions : UChar
+0x002 BeingDebugged : UChar
+0x003 SpareBool : UChar
+0x004 Mutant : Ptr32 Void
+0x008 ImageBaseAddress : Ptr32 Void
+0x00c Ldr : Ptr32 _PEB_LDR_DATA
+0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS
+0x014 SubSystemData : Ptr32 Void
+0x018 ProcessHeap : Ptr32 Void
+0x01c FastPebLock : Ptr32 _RTL_CRITICAL_SECTION
+0x020 FastPebLockRoutine : Ptr32 Void
+0x024 FastPebUnlockRoutine : Ptr32 Void
+0x028 EnvironmentUpdateCount : Uint4B
+0x02c KernelCallbackTable : Ptr32 Void
+0x030 SystemReserved : [1] Uint4B
+0x034 AtlThunkSListPtr32 : Uint4B
+0x038 FreeList : Ptr32 _PEB_FREE_BLOCK
+0x03c TlsExpansionCounter : Uint4B
+0x040 TlsBitmap : Ptr32 Void
+0x044 TlsBitmapBits : [2] Uint4B
+0x04c ReadOnlySharedMemoryBase : Ptr32 Void
+0x050 ReadOnlySharedMemoryHeap : Ptr32 Void
+0x054 ReadOnlyStaticServerData : Ptr32 Ptr32 Void
+0x058 AnsiCodePageData : Ptr32 Void
+0x05c OemCodePageData : Ptr32 Void
+0x060 UnicodeCaseTableData : Ptr32 Void
+0x064 NumberOfProcessors : Uint4B
+0x068 NtGlobalFlag : Uint4B
+0x070 CriticalSectionTimeout : _LARGE_INTEGER
+0x078 HeapSegmentReserve : Uint4B
+0x07c HeapSegmentCommit : Uint4B
+0x080 HeapDeCommitTotalFreeThreshold : Uint4B
+0x084 HeapDeCommitFreeBlockThreshold : Uint4B
+0x088 NumberOfHeaps : Uint4B
+0x08c MaximumNumberOfHeaps : Uint4B
+0x090 ProcessHeaps : Ptr32 Ptr32 Void
+0x094 GdiSharedHandleTable : Ptr32 Void
+0x098 ProcessStarterHelper : Ptr32 Void
+0x09c GdiDCAttributeList : Uint4B
+0x0a0 LoaderLock : Ptr32 Void
+0x0a4 OSMajorVersion : Uint4B
+0x0a8 OSMinorVersion : Uint4B
+0x0ac OSBuildNumber : Uint2B
+0x0ae OSCSDVersion : Uint2B
+0x0b0 OSPlatformId : Uint4B
+0x0b4 ImageSubsystem : Uint4B
+0x0b8 ImageSubsystemMajorVersion : Uint4B
+0x0bc ImageSubsystemMinorVersion : Uint4B
+0x0c0 ImageProcessAffinityMask : Uint4B
+0x0c4 GdiHandleBuffer : [34] Uint4B
+0x14c PostProcessInitRoutine : Ptr32
+0x150 TlsExpansionBitmap : Ptr32 Void
+0x154 TlsExpansionBitmapBits : [32] Uint4B
+0x1d4 SessionId : Uint4B
+0x1d8 AppCompatFlags : _ULARGE_INTEGER
+0x1e0 AppCompatFlagsUser : _ULARGE_INTEGER
+0x1e8 pShimData : Ptr32 Void
+0x1ec AppCompatInfo : Ptr32 Void
+0x1f0 CSDVersion : _UNICODE_STRING
+0x1f8 ActivationContextData : Ptr32 Void
+0x1fc ProcessAssemblyStorageMap : Ptr32 Void
+0x200 SystemDefaultActivationContextData : Ptr32 Void
+0x204 SystemAssemblyStorageMap : Ptr32 Void
+0x208 MinimumStackCommit : Uint4B

ได้แหล้ว :) จะได้เขียนต่อซะที

ไม่มีความคิดเห็น: