今天继续看逆向工程核心原理,今天看到了TEB,这个部分之前看加密与解密的时候基本上就没看明白,这次打算把环境配置完备,全部都实践一次。
首先看到的是TEB结构体
TEB结构体成员
里面的重要成员有两个
- _NT_TIB
- ProcessEnvironmentalBlock
第二个是个指向结构体的指针
第一个是NT_TIB结构体 这个TIB是线程信息块
第一个是一个意外报错项
其他重要的就是self,这是一个自引用指针
还有一个是刚刚的ProcessEnvironmentBlock成员
在虚拟机里面实践一下
用OD打开一个进程,比如这个notepad,在查找所有模块名称里面找到这个API
点进去
可以看到这里是把fs:【0x18】,根据信息框的信息,是7EFDD018的内容,也就是7EFDD000给了EAX,然后传了出去
所以这里返回的其实是7EFDD000。
然后后面要研究一下FS这个是干什么用的。
根据另外的一些资料,计算机系统当中不止这一个段寄存器,在线程分配过来的时候,FS分到了。然后FS分配到了notepad所需要的内存空间。
而FS作为16位,无法表示4G虚拟内存,所以这个FS其实并非直接指向地址,而是一个SDT的索引,类似于一个表,这个SDT有TEB地址,所以是FS【0x18】指向这个表的0x18位,然后0x18位有个TEB位置。
他需要GDTR共同作用。
后续继续学习,今天先睡了
—————————————–
今天翻了一下《加密与解密》这本书,里面也讲到了用windbg看TEB结构,具体交了一个方法
就是file-kernel debug-local,点击确定就可以、
但是还是遇到了问题,说不支持本地调试
这种情况需要在cmd里面先打开调试
输入这条指令,再重启一下
再以管理员启动,就没有了
先输入!teb找到加载的位置,再dt _teb xxxx(位置)就可以看到里面的成员了。
。
点击查看代码
``` 0:000> dt _teb ntdll!_TEB +0x000 NtTib : _NT_TIB +0x01c EnvironmentPointer : Ptr32 Void +0x020 ClientId : _CLIENT_ID +0x028 ActiveRpcHandle : Ptr32 Void +0x02c ThreadLocalStoragePointer : Ptr32 Void +0x030 ProcessEnvironmentBlock : Ptr32 _PEB +0x034 LastErrorValue : Uint4B +0x038 CountOfOwnedCriticalSections : Uint4B +0x03c CsrClientThread : Ptr32 Void +0x040 Win32ThreadInfo : Ptr32 Void +0x044 User32Reserved : [26] Uint4B +0x0ac UserReserved : [5] Uint4B +0x0c0 WOW32Reserved : Ptr32 Void +0x0c4 CurrentLocale : Uint4B +0x0c8 FpSoftwareStatusRegister : Uint4B +0x0cc ReservedForDebuggerInstrumentation : [16] Ptr32 Void +0x10c SystemReserved1 : [26] Ptr32 Void +0x174 PlaceholderCompatibilityMode : Char +0x175 PlaceholderHydrationAlwaysExplicit : UChar +0x176 PlaceholderReserved : [10] Char +0x180 ProxiedProcessId : Uint4B +0x184 _ActivationStack : _ACTIVATION_CONTEXT_STACK +0x19c WorkingOnBehalfTicket : [8] UChar +0x1a4 ExceptionCode : Int4B +0x1a8 ActivationContextStackPointer : Ptr32 _ACTIVATION_CONTEXT_STACK +0x1ac InstrumentationCallbackSp : Uint4B +0x1b0 InstrumentationCallbackPreviousPc : Uint4B +0x1b4 InstrumentationCallbackPreviousSp : Uint4B +0x1b8 InstrumentationCallbackDisabled : UChar +0x1b9 SpareBytes : [23] UChar +0x1d0 TxFsContext : Uint4B +0x1d4 GdiTebBatch : _GDI_TEB_BATCH +0x6b4 RealClientId : _CLIENT_ID +0x6bc GdiCachedProcessHandle : Ptr32 Void +0x6c0 GdiClientPID : Uint4B +0x6c4 GdiClientTID : Uint4B +0x6c8 GdiThreadLocalInfo : Ptr32 Void +0x6cc Win32ClientInfo : [62] Uint4B +0x7c4 glDispatchTable : [233] Ptr32 Void +0xb68 glReserved1 : [29] Uint4B +0xbdc glReserved2 : Ptr32 Void +0xbe0 glSectionInfo : Ptr32 Void +0xbe4 glSection : Ptr32 Void +0xbe8 glTable : Ptr32 Void +0xbec glCurrentRC : Ptr32 Void +0xbf0 glContext : Ptr32 Void +0xbf4 LastStatusValue : Uint4B +0xbf8 StaticUnicodeString : _UNICODE_STRING +0xc00 StaticUnicodeBuffer : [261] Wchar +0xe0c DeallocationStack : Ptr32 Void +0xe10 TlsSlots : [64] Ptr32 Void +0xf10 TlsLinks : _LIST_ENTRY +0xf18 Vdm : Ptr32 Void +0xf1c ReservedForNtRpc : Ptr32 Void +0xf20 DbgSsReserved : [2] Ptr32 Void +0xf28 HardErrorMode : Uint4B +0xf2c Instrumentation : [9] Ptr32 Void +0xf50 ActivityId : _GUID +0xf60 SubProcessTag : Ptr32 Void +0xf64 PerflibData : Ptr32 Void +0xf68 EtwTraceData : Ptr32 Void +0xf6c WinSockData : Ptr32 Void +0xf70 GdiBatchCount : Uint4B +0xf74 CurrentIdealProcessor : _PROCESSOR_NUMBER +0xf74 IdealProcessorValue : Uint4B +0xf74 ReservedPad0 : UChar +0xf75 ReservedPad1 : UChar +0xf76 ReservedPad2 : UChar +0xf77 IdealProcessor : UChar +0xf78 GuaranteedStackBytes : Uint4B +0xf7c ReservedForPerf : Ptr32 Void +0xf80 ReservedForOle : Ptr32 Void +0xf84 WaitingOnLoaderLock : Uint4B +0xf88 SavedPriorityState : Ptr32 Void +0xf8c ReservedForCodeCoverage : Uint4B +0xf90 ThreadPoolData : Ptr32 Void +0xf94 TlsExpansionSlots : Ptr32 Ptr32 Void +0xf98 MuiGeneration : Uint4B +0xf9c IsImpersonating : Uint4B +0xfa0 NlsCache : Ptr32 Void +0xfa4 pShimData : Ptr32 Void +0xfa8 HeapData : Uint4B +0xfac CurrentTransactionHandle : Ptr32 Void +0xfb0 ActiveFrame : Ptr32 _TEB_ACTIVE_FRAME +0xfb4 FlsData : Ptr32 Void +0xfb8 PreferredLanguages : Ptr32 Void +0xfbc UserPrefLanguages : Ptr32 Void +0xfc0 MergedPrefLanguages : Ptr32 Void +0xfc4 MuiImpersonation : Uint4B +0xfc8 CrossTebFlags : Uint2B +0xfc8 SpareCrossTebBits : Pos 0, 16 Bits +0xfca SameTebFlags : Uint2B +0xfca SafeThunkCall : Pos 0, 1 Bit +0xfca InDebugPrint : Pos 1, 1 Bit +0xfca HasFiberData : Pos 2, 1 Bit +0xfca SkipThreadAttach : Pos 3, 1 Bit +0xfca WerInShipAssertCode : Pos 4, 1 Bit +0xfca RanProcessInit : Pos 5, 1 Bit +0xfca ClonedThread : Pos 6, 1 Bit +0xfca SuppressDebugMsg : Pos 7, 1 Bit +0xfca DisableUserStackWalk : Pos 8, 1 Bit +0xfca RtlExceptionAttached : Pos 9, 1 Bit +0xfca InitialThread : Pos 10, 1 Bit +0xfca SessionAware : Pos 11, 1 Bit +0xfca LoadOwner : Pos 12, 1 Bit +0xfca LoaderWorker : Pos 13, 1 Bit +0xfca SkipLoaderInit : Pos 14, 1 Bit +0xfca SpareSameTebBits : Pos 15, 1 Bit +0xfcc TxnScopeEnterCallback : Ptr32 Void +0xfd0 TxnScopeExitCallback : Ptr32 Void +0xfd4 TxnScopeContext : Ptr32 Void +0xfd8 LockCount : Uint4B +0xfdc WowTebOffset : Int4B +0xfe0 ResourceRetValue : Ptr32 Void +0xfe4 ReservedForWdf : Ptr32 Void +0xfe8 ReservedForCrt : Uint8B +0xff0 EffectiveContainerId : _GUID ```而其中NT BIT当中有一个成员ExceptionList还可以研究一下
点击查看代码
``` 0:000> dt _NT_TIB ntdll!_NT_TIB +0x000 ExceptionList : Ptr32 _EXCEPTION_REGISTRATION_RECORD +0x004 StackBase : Ptr32 Void +0x008 StackLimit : Ptr32 Void +0x00c SubSystemTib : Ptr32 Void +0x010 FiberData : Ptr32 Void +0x010 Version : Uint4B +0x014 ArbitraryUserPointer : Ptr32 Void +0x018 Self : Ptr32 _NT_TIB 0:000> dt _EXCEPTION_REGISTRATION_RECORD ntdll!_EXCEPTION_REGISTRATION_RECORD +0x000 Next : Ptr32 _EXCEPTION_REGISTRATION_RECORD +0x004 Handler : Ptr32 _EXCEPTION_DISPOSITION ```可以看到ExceptionList其实是一个指向_EXCEPTION_REGISTRATION_RECORD的指针,而ntdll中的_EXCEPTION_REGISTRATION_RECORD里面有俩成员
- Next指向下一个_EXCEPTION_REGISTRATION_RECORD节点
- Handler指向这个节点处理某个异常的函数 。 StackBase 这个线程的堆栈的最高地址 StackLimit堆栈的最低地址 FiberData/Version 联合体,多线程编程的时候使用。FiberData指向Fiber数据结构,实现轻量级线程的切换。Version记录操作系统版本,以供兼容性。 ArbitraryUserPointer 指向任何一个用户定义的数据 。 关于NT_TIB与TEB的关系: NT_TIB是TEB当的一个重要成员,而NT_TIB中又有如上的各个成员。 除了NT_TIB之外还有如 PEB进程环境块 ActivationContextStackPointer 激活上下文的栈指针 等等成员