• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            無(wú)我

            讓內(nèi)心永遠(yuǎn)燃燒著偉大的光明的精神之火!
            靈活的思考,嚴(yán)謹(jǐn)?shù)膶?shí)現(xiàn)
            豪邁的氣魄、頑強(qiáng)的意志和周全的思考

            [轉(zhuǎn)]TLS callback科普小知識(shí)

            本文轉(zhuǎn)自http://hi.baidu.com/ayarei/blog/item/1cfc9d0262c5900a4bfb511f.html

             

            前言:最初想了解TLS callback是來(lái)自于team509翻譯的一篇關(guān)于TLS callback反ida的文章。當(dāng)時(shí)問(wèn)了幾個(gè)朋友對(duì)TLS callback都不太了解,但是問(wèn)到dummy牛,他給了一個(gè)他曾經(jīng)寫過(guò)的使用TLS callback anti-debugger的殼,于是就看了下TLS callback機(jī)制。如果你是新手,并對(duì)TLS callback機(jī)制感興趣,那么這篇基礎(chǔ)文章也許對(duì)你有用。不過(guò),了解的就勿看了,沒(méi)有什么東西 :)。另外,文章沒(méi)有進(jìn)行排版修改.....= =|||

            ======================我是邪惡的分割線=========================

            每個(gè)線程擁有自己的線程局部存儲(chǔ),互補(bǔ)干擾。系統(tǒng)中線程局部存儲(chǔ)是存放在線程的TEB中,每個(gè)線程都有自己的TEB因此互相獨(dú)立。見(jiàn)下面的TEB結(jié)構(gòu)中的ThreadLocalStoragePointer、TlsSlots、TlsLinksTlsExpansionSlots域。對(duì)TLS的訪問(wèn)通過(guò) TlsAlloc、TlsSetValue和TlsGetValue以及TlsFree幾個(gè)API進(jìn)行。這些API也是對(duì)TEB中Tls相關(guān)域的訪問(wèn)。跟蹤Tls*等API函數(shù)發(fā)現(xiàn),系統(tǒng)通過(guò)PEB中的TlsBitmap來(lái)保存Tls的使用記錄,并據(jù)此分配Tls索引,另外PEB還有 TlsExpansionCounter和TlsBitmapBits來(lái)跟蹤Tls的使用情況。

            選擇子fs所對(duì)應(yīng)的段用來(lái)存儲(chǔ)TEB和PEB等信息,由ring3下FS選擇子如下:
            selector 3B, DATA32, BaseAddress 7FFDF000, Limit 00000FFF, DPL 3, Present, RW
            因此在ring3下是可讀寫的。fs:[0]指向_NT_TIB中的ExceptionList,fs:[18]指向_NT_TIB自身,也就是指向_TEB結(jié)構(gòu);
            mov eax, dword ptr fs:[18]
            mov esi, dword ptr [eax+30]
            此時(shí)esi指向PEB,dword ptr[esi+40]即為TlsBitmap,假設(shè)ecx為分配的索引則

            mov eax, dword ptr fs:[18]
            mov [eax+ecx*4+e10], data

            mov eax, dword ptr fs:[18]
            mov data, [eax+ecx*4+e10]

            結(jié)構(gòu)如下所示(windows XP professional SP2)

                kd> dt !_NT_TIB
                +0×000 ExceptionList : Ptr32 _EXCEPTION_REGISTRATION_RECORD
                +0×004 StackBase : Ptr32 Void
                +0×008 StackLimit : Ptr32 Void
                +0×00c SubSystemTib : Ptr32 Void
                +0×010 FiberData : Ptr32 Void
                +0×010 Version : Uint4B
                +0×014 ArbitraryUserPointer : Ptr32 Void
                +0×018 Self : Ptr32 _NT_TIB
                //SEH和棧信息

                kd> dt !_TEB
                +0×000 NtTib : _NT_TIB
                +0×01c EnvironmentPointer : Ptr32 Void
                +0×020 ClientId : _CLIENT_ID
                +0×028 ActiveRpcHandle : Ptr32 Void
                +0×02c ThreadLocalStoragePointer : Ptr32 Void
                +0×030 ProcessEnvironmentBlock : Ptr32 _PEB
                +0×034 LastErrorValue : Uint4B
                +0×038 CountOfOwnedCriticalSections : Uint4B
                +0×03c CsrClientThread : Ptr32 Void
                +0×040 Win32ThreadInfo : Ptr32 Void
                +0×044 User32Reserved : [26] Uint4B
                +0×0ac UserReserved : [5] Uint4B
                +0×0c0 WOW32Reserved : Ptr32 Void
                +0×0c4 CurrentLocale : Uint4B
                +0×0c8 FpSoftwareStatusRegister : Uint4B
                +0×0cc SystemReserved1 : [54] Ptr32 Void
                +0×1a4 ExceptionCode : Int4B
                +0×1a8 ActivationContextStack : _ACTIVATION_CONTEXT_STACK
                +0×1bc SpareBytes1 : [24] UChar
                +0×1d4 GdiTebBatch : _GDI_TEB_BATCH
                +0×6b4 RealClientId : _CLIENT_ID
                +0×6bc GdiCachedProcessHandle : Ptr32 Void
                +0×6c0 GdiClientPID : Uint4B
                +0×6c4 GdiClientTID : Uint4B
                +0×6c8 GdiThreadLocalInfo : Ptr32 Void
                +0×6cc Win32ClientInfo : [62] Uint4B
                +0×7c4 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] Uint2B
                +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 HardErrorsAreDisabled : Uint4B
                +0xf2c Instrumentation : [16] Ptr32 Void
                +0xf6c WinSockData : Ptr32 Void
                +0xf70 GdiBatchCount : Uint4B
                +0xf74 InDbgPrint : UChar
                +0xf75 FreeStackOnTermination : UChar
                +0xf76 HasFiberData : UChar
                +0xf77 IdealProcessor : UChar
                +0xf78 Spare3 : Uint4B
                +0xf7c ReservedForPerf : Ptr32 Void
                +0xf80 ReservedForOle : Ptr32 Void
                +0xf84 WaitingOnLoaderLock : Uint4B
                +0xf88 Wx86Thread : _Wx86ThreadState
                +0xf94 TlsExpansionSlots : Ptr32 Ptr32 Void
                +0xf98 ImpersonationLocale : Uint4B
                +0xf9c IsImpersonating : Uint4B
                +0xfa0 NlsCache : Ptr32 Void
                +0xfa4 pShimData : Ptr32 Void
                +0xfa8 HeapVirtualAffinity : Uint4B
                +0xfac CurrentTransactionHandle : Ptr32 Void
                +0xfb0 ActiveFrame : Ptr32 _TEB_ACTIVE_FRAME
                +0xfb4 SafeThunkCall : UChar
                +0xfb5 BooleanSpare : [3] UChar

                kd> dt !_PEB
                +0×000 InheritedAddressSpace : UChar
                +0×001 ReadImageFileExecOptions : UChar
                +0×002 BeingDebugged : UChar
                +0×003 SpareBool : UChar
                +0×004 Mutant : Ptr32 Void
                +0×008 ImageBaseAddress : Ptr32 Void
                +0×00c Ldr : Ptr32 _PEB_LDR_DATA
                +0×010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS
                +0×014 SubSystemData : Ptr32 Void
                +0×018 ProcessHeap : Ptr32 Void
                +0×01c FastPebLock : Ptr32 _RTL_CRITICAL_SECTION
                +0×020 FastPebLockRoutine : Ptr32 Void
                +0×024 FastPebUnlockRoutine : Ptr32 Void
                +0×028 EnvironmentUpdateCount : Uint4B
                +0×02c KernelCallbackTable : Ptr32 Void
                +0×030 SystemReserved : [1] Uint4B
                +0×034 AtlThunkSListPtr32 : Uint4B
                +0×038 FreeList : Ptr32 _PEB_FREE_BLOCK
                +0×03c TlsExpansionCounter : Uint4B
                +0×040 TlsBitmap : Ptr32 Void
                +0×044 TlsBitmapBits : [2] Uint4B
                +0×04c ReadOnlySharedMemoryBase : Ptr32 Void
                +0×050 ReadOnlySharedMemoryHeap : Ptr32 Void
                +0×054 ReadOnlyStaticServerData : Ptr32 Ptr32 Void
                +0×058 AnsiCodePageData : Ptr32 Void
                +0×05c OemCodePageData : Ptr32 Void
                +0×060 UnicodeCaseTableData : Ptr32 Void
                +0×064 NumberOfProcessors : Uint4B
                +0×068 NtGlobalFlag : Uint4B
                +0×070 CriticalSectionTimeout : _LARGE_INTEGER
                +0×078 HeapSegmentReserve : Uint4B
                +0×07c HeapSegmentCommit : Uint4B
                +0×080 HeapDeCommitTotalFreeThreshold : Uint4B
                +0×084 HeapDeCommitFreeBlockThreshold : Uint4B
                +0×088 NumberOfHeaps : Uint4B
                +0×08c MaximumNumberOfHeaps : Uint4B
                +0×090 ProcessHeaps : Ptr32 Ptr32 Void
                +0×094 GdiSharedHandleTable : Ptr32 Void
                +0×098 ProcessStarterHelper : Ptr32 Void
                +0×09c GdiDCAttributeList : Uint4B
                +0×0a0 LoaderLock : Ptr32 Void
                +0×0a4 OSMajorVersion : Uint4B
                +0×0a8 OSMinorVersion : Uint4B
                +0×0ac OSBuildNumber : Uint2B
                +0×0ae OSCSDVersion : Uint2B
                +0×0b0 OSPlatformId : Uint4B
                +0×0b4 ImageSubsystem : Uint4B
                +0×0b8 ImageSubsystemMajorVersion : Uint4B
                +0×0bc ImageSubsystemMinorVersion : Uint4B
                +0×0c0 ImageProcessAffinityMask : Uint4B
                +0×0c4 GdiHandleBuffer : [34] Uint4B
                +0×14c PostProcessInitRoutine : Ptr32
                +0×150 TlsExpansionBitmap : Ptr32 Void
                +0×154 TlsExpansionBitmapBits : [32] Uint4B
                +0×1d4 SessionId : Uint4B
                +0×1d8 AppCompatFlags : _ULARGE_INTEGER
                +0×1e0 AppCompatFlagsUser : _ULARGE_INTEGER
                +0×1e8 pShimData : Ptr32 Void
                +0×1ec AppCompatInfo : Ptr32 Void
                +0×1f0 CSDVersion : _UNICODE_STRING
                +0×1f8 ActivationContextData : Ptr32 Void
                +0×1fc ProcessAssemblyStorageMap : Ptr32 Void
                +0×200 SystemDefaultActivationContextData : Ptr32 Void
                +0×204 SystemAssemblyStorageMap : Ptr32 Void
                +0×208 MinimumStackCommit : Uint4B

            PE和編譯器支持:

                PE文件結(jié)構(gòu)的目錄表(directory table)中有一個(gè)是IMAGE_DIRECTORY_ENTRY_TLS (9)線程級(jí)局部存儲(chǔ)目錄,如果此處非零的話,PE將會(huì)有一個(gè)tls節(jié),tls節(jié)以結(jié)構(gòu)IMAGE_TLS_DIRECTORY(winnt.h)開(kāi)始
                typedef struct _IMAGE_TLS_DIRECTORY32 {
                DWORD StartAddressOfRawData;
                DWORD EndAddressOfRawData;
                PDWORD AddressOfIndex;
                PIMAGE_TLS_CALLBACK *AddressOfCallBacks;
                DWORD SizeOfZeroFill;
                DWORD Characteristics;
                } IMAGE_TLS_DIRECTORY32;
                其中PIMAGE_TLS_CALLBACK如下:
                typedef VOID
                (NTAPI *PIMAGE_TLS_CALLBACK) (
                PVOID DllHandle,
                DWORD Reason,
                PVOID Reserved
                );
                為了方便使用TLS,編譯器支持用__declspec(thread)來(lái)修飾全局或靜態(tài)變量,這樣的變量最終存儲(chǔ)在TLS中,對(duì)這些變量的訪問(wèn)與普通變量一樣,編譯器負(fù)責(zé)處理其中細(xì)節(jié)分配索引和初始化等。
                IMAGE_TLS_DIRECTORY32 中的StartAddressOfRawData和EndAddressOfRawData指向的區(qū)域保存__declspec(thread)變量的初始值,AddressOfIndex指向的區(qū)域保存動(dòng)態(tài)分配的Tls索引。AddressOfCallBacks指向一個(gè)回調(diào)函數(shù),此函數(shù)與 DllMain有同樣的形式,它會(huì)在線程創(chuàng)建前被調(diào)用,多用來(lái)完成__declspec(thread)變量的初始化等,也被用于anti- debugger(如blacklight)。
                Visual Studio C++中對(duì)此的支持請(qǐng)參考Thread Local Storage - The C++ Way。
                MASM中可以將tls節(jié)中的數(shù)據(jù)放到data節(jié)中,然后使用LordPE等工具改變PE中目錄表中的IMAGE_DIRECTORY_ENTRY_TLS為對(duì)應(yīng)的地址和大小即可,具體請(qǐng)見(jiàn)
                TLS-CallBack +IsDebuggerPresent() Debugger Detection。

            參考文獻(xiàn)
            MSDN
            Thread Local Storage: http://www.windowsitlibrary.com/Content/356/11/5.html
            Thread Local Storage - The C++ Way:http://www.codeproject.com/threads/tls.asp
            TLS-CallBack +IsDebuggerPresent() Debugger Detection:
            http://www.openrce.org/reference_library/anti_reversing_view/26/TLS-CallBack%20+IsDebuggerPresent()%20Debugger

             

            posted on 2012-06-27 17:20 Tim 閱讀(2441) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 逆向工程

            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            導(dǎo)航

            統(tǒng)計(jì)

            公告

            本博客原創(chuàng)文章,歡迎轉(zhuǎn)載和交流。不過(guò)請(qǐng)注明以下信息:
            作者:TimWu
            郵箱:timfly@yeah.net
            來(lái)源:www.shnenglu.com/Tim
            感謝您對(duì)我的支持!

            留言簿(9)

            隨筆分類(173)

            IT

            Life

            搜索

            積分與排名

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            女同久久| 九九久久99综合一区二区| 一本久久综合亚洲鲁鲁五月天| 久久成人精品| 99久久777色| 久久影院亚洲一区| 精品国产乱码久久久久久郑州公司| 国产福利电影一区二区三区久久老子无码午夜伦不 | 老司机午夜网站国内精品久久久久久久久 | 亚洲另类欧美综合久久图片区| 无码国内精品久久人妻蜜桃| 精品久久人人爽天天玩人人妻| 伊人久久大香线焦AV综合影院| 国产精品午夜久久| 精品国产一区二区三区久久久狼| 一级做a爰片久久毛片免费陪| 美女写真久久影院| 久久天堂AV综合合色蜜桃网| 久久亚洲AV永久无码精品| 四虎国产永久免费久久| 欧美丰满熟妇BBB久久久| 亚洲午夜精品久久久久久浪潮| 日本精品久久久久中文字幕8| 久久精品国产亚洲AV嫖农村妇女| 一级做a爰片久久毛片看看| 色偷偷88欧美精品久久久| 99国内精品久久久久久久| 久久伊人精品青青草原高清| 国产精品无码久久综合| 精品久久人妻av中文字幕| 亚洲av日韩精品久久久久久a | 思思久久99热只有频精品66| 香蕉久久永久视频| 久久久久国产| 免费一级做a爰片久久毛片潮| 伊人热热久久原色播放www | 久久亚洲国产精品一区二区| 欧美日韩中文字幕久久伊人| 一本久久a久久精品综合夜夜| 亚洲国产二区三区久久| 久久久久99精品成人片牛牛影视|