x64 gs寄存器的一点资料

2019-07-24 16:21:58 浏览数 (2)

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

0 人点赞