x64 gs暫存器的一點資料
阿新 • • 發佈:2018-11-25
gs:[0x20] prcb
gs:[0x30] TEB
gs:[0x40] Pid
gs:[0x48] Tid
gs:[0x60] PEB
gs:[0x68] LastError
gs:[0x188] _ethread
值得一提的是,雖然gs:[0x60] 直接存放的PEB,但是由於vista/7後的地址隨機化機制,還是從TEB獲取比較靠譜.
0:009> dt 000007fffff98000 _TEB
ntdll!_TEB
+0×000 NtTib : _NT_TIB
+0×038 EnvironmentPointer : (null)
+0×040 ClientId : _CLIENT_ID
+0×050 ActiveRpcHandle : (null)
+0×058 ThreadLocalStoragePointer : (null)
+0×060 ProcessEnvironmentBlock : 0x000007ff`fffd5000 _PEB //這裡即是PEB
//用c語言描述就是
#define x64_GetPeb() ( (LONG64*)(*((LONG64*)((BYTE*)x64_GetTeb()+0×060))) )
得到了PEB,剩下的就和x86下一樣了.只是偏移不一樣了
0:009> dt 0x000007ff`fffd5000 _PEB
ntdll!_PEB
+0×000 InheritedAddressSpace : 0 ”
+0×001 ReadImageFileExecOptions : 0 ”
+0×002 BeingDebugged : 0×1 ”
+0×003 BitField : 0×8 ”
+0×003 ImageUsesLargePages : 0y0
+0×003 IsProtectedProcess : 0y0
+0×003 IsLegacyProcess : 0y0
+0×003 IsImageDynamicallyRelocated : 0y1
+0×003 SkipPatchingUser32Forwarders : 0y0
+0×003 SpareBits : 0y000
+0×008 Mutant : 0xffffffff`ffffffff Void
+0×010 ImageBaseAddress : 0×00000000`ff310000 Void
+0×018 Ldr : 0×00000000`77222640 _PEB_LDR_DATA
0:009> dt 0×00000000`77222640 _PEB_LDR_DATA
ntdll!_PEB_LDR_DATA
+0×000 Length : 0×58
+0×004 Initialized : 0×1 ”
+0×008 SsHandle : (null)
+0×010 InLoadOrderModuleList : _LIST_ENTRY [ 0x00000000`00202780 - 0x2421b0 ]
+0×020 InMemoryOrderModuleList : _LIST_ENTRY [ 0x00000000`00202790 - 0x2421c0 ]
+0×030 InInitializationOrderModuleList : _LIST_ENTRY [ 0x00000000`00202890 - 0x2421d0 ]
同樣的,搜尋InInitializationOrderModuleList 即可得到Kernel32的基址.
由於x64下vs2005沒法直接使用內聯彙編,所以只把必須使用匯編來做的事情寫成單獨的asm
x64下.指標的長度已經是8個位元組,所以偏移不一樣了.
0:009> dt _LDR_DATA_TABLE_ENTRY
ntdll!_LDR_DATA_TABLE_ENTRY
+0×000 InLoadOrderLinks : _LIST_ENTRY
+0×010 InMemoryOrderLinks : _LIST_ENTRY
+0×020 InInitializationOrderLinks : _LIST_ENTRY
+0×030 DllBase : Ptr64 Void
+0×038 EntryPoint : Ptr64 Void
+0×040 SizeOfImage : Uint4B
+0×048 FullDllName : _UNICODE_STRING
https://blog.csdn.net/cosmoslife/article/details/52851788