青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

無我

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

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

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

 

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

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

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

選擇子fs所對應(yīng)的段用來存儲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]
此時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)中有一個是IMAGE_DIRECTORY_ENTRY_TLS (9)線程級局部存儲目錄,如果此處非零的話,PE將會有一個tls節(jié),tls節(jié)以結(jié)構(gòu)IMAGE_TLS_DIRECTORY(winnt.h)開始
    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)來修飾全局或靜態(tài)變量,這樣的變量最終存儲在TLS中,對這些變量的訪問與普通變量一樣,編譯器負責處理其中細節(jié)分配索引和初始化等。
    IMAGE_TLS_DIRECTORY32 中的StartAddressOfRawData和EndAddressOfRawData指向的區(qū)域保存__declspec(thread)變量的初始值,AddressOfIndex指向的區(qū)域保存動態(tài)分配的Tls索引。AddressOfCallBacks指向一個回調(diào)函數(shù),此函數(shù)與 DllMain有同樣的形式,它會在線程創(chuàng)建前被調(diào)用,多用來完成__declspec(thread)變量的初始化等,也被用于anti- debugger(如blacklight)。
    Visual Studio C++中對此的支持請參考Thread Local Storage - The C++ Way。
    MASM中可以將tls節(jié)中的數(shù)據(jù)放到data節(jié)中,然后使用LordPE等工具改變PE中目錄表中的IMAGE_DIRECTORY_ENTRY_TLS為對應(yīng)的地址和大小即可,具體請見
    TLS-CallBack +IsDebuggerPresent() Debugger Detection。

參考文獻
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 閱讀(2442) 評論(0)  編輯 收藏 引用 所屬分類: 逆向工程

<2013年7月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

導(dǎo)航

統(tǒng)計

公告

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

留言簿(9)

隨筆分類(173)

IT

Life

搜索

積分與排名

最新隨筆

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国内精品久久久久影院色| 亚洲国产99| 一区二区成人精品 | 亚洲伦伦在线| 欧美日韩国产首页| 亚洲一区二区在线播放| 夜夜爽夜夜爽精品视频| 国产精品入口尤物| 性做久久久久久免费观看欧美| 一区二区日韩| 国产网站欧美日韩免费精品在线观看 | 国产精品中文字幕在线观看| 久久激五月天综合精品| 久久亚洲国产成人| 亚洲日本中文字幕区| 亚洲国产精品久久久久秋霞蜜臀| 亚洲精品裸体| 一区二区三区四区五区精品| 国产免费观看久久黄| 美女日韩欧美| 欧美日韩国产经典色站一区二区三区| 亚洲一区二区三区在线视频| 久久国产天堂福利天堂| 日韩视频精品在线| 亚洲欧美综合| 9色porny自拍视频一区二区| 欧美亚洲日本国产| 亚洲美女在线看| 欧美伊人久久久久久午夜久久久久| 亚洲激情图片小说视频| 亚洲欧美国产三级| 日韩视频精品| 噜噜噜躁狠狠躁狠狠精品视频| 国产精品99久久久久久有的能看 | 久久久久久久久蜜桃| 欧美精品免费看| 久久久久久自在自线| 欧美三级第一页| 欧美激情一区二区在线| 国产一区二区电影在线观看 | 欧美自拍偷拍| 亚洲免费在线视频| 欧美精品激情| 欧美3dxxxxhd| 国内精品久久久久影院 日本资源| 亚洲视频专区在线| av不卡在线看| 欧美电影免费观看大全| 免费中文字幕日韩欧美| 国产在线欧美| 午夜性色一区二区三区免费视频| 亚洲一区二区久久| 欧美日本免费| 亚洲精品裸体| 亚洲理论电影网| 欧美88av| 亚洲国产精品久久精品怡红院| 在线观看日韩av先锋影音电影院| 午夜精品视频网站| 性8sex亚洲区入口| 国产精品青草综合久久久久99 | 欧美国产在线电影| 欧美激情一级片一区二区| 在线观看成人小视频| 久久久久久一区| 美女国产精品| 亚洲国产视频直播| 欧美国产日韩一区二区| 亚洲电影一级黄| 日韩视频在线播放| 欧美日韩免费观看中文| av72成人在线| 国产在线欧美| 亚洲色图自拍| 欧美日韩在线电影| 亚洲影院免费| 久久久水蜜桃av免费网站| 欲色影视综合吧| 欧美成人精品一区| 亚洲日本欧美日韩高观看| 中文日韩在线视频| 国产精品区一区二区三区| 欧美一区二区视频在线观看2020 | 久久久久国产精品厨房| 伊人狠狠色丁香综合尤物| 另类图片综合电影| 日韩天堂在线视频| 欧美一区二区三区四区高清| 韩国一区二区三区在线观看 | 欧美 亚欧 日韩视频在线| 亚洲精品乱码久久久久久蜜桃91| 亚洲欧美日韩国产| 一区二区视频免费在线观看| 欧美成人首页| 亚洲在线免费| 欧美高清在线一区| 亚洲在线视频观看| 尤物精品在线| 欧美三日本三级三级在线播放| 欧美一区二区三区在线看| 欧美福利在线观看| 午夜精彩视频在线观看不卡| 在线成人激情| 国产精品福利在线观看| 久久婷婷久久| 亚洲午夜av| 亚洲欧洲精品一区二区| 久久国产精品一区二区三区四区 | 国产精品亚洲а∨天堂免在线| 久久亚洲欧洲| 亚洲欧美日韩成人| 亚洲日本激情| 另类专区欧美制服同性| 亚洲一区影院| 亚洲免费av片| 亚洲成人在线视频网站| 国产精品毛片高清在线完整版 | 亚洲一区二区黄| 亚洲激情欧美激情| 久久免费黄色| 欧美在线观看一区二区三区| 99精品久久久| 亚洲区第一页| 在线观看亚洲精品| 国产午夜久久久久| 国产精品私拍pans大尺度在线 | 你懂的视频欧美| 久久精品视频在线| 亚洲男同1069视频| 一本色道久久综合亚洲精品婷婷| 亚洲国产精品久久精品怡红院| 老司机免费视频一区二区| 久久精品视频va| 欧美一级大片在线观看| 亚洲欧美日韩一区二区在线| 在线亚洲一区二区| 亚洲美女少妇无套啪啪呻吟| 亚洲精品网站在线播放gif| 小黄鸭精品aⅴ导航网站入口| 女主播福利一区| 久久久久一区二区三区四区| 久久成人免费网| 久久久av毛片精品| 久久国产综合精品| 久久久精品999| 老司机亚洲精品| 免播放器亚洲| 欧美黑人多人双交| 欧美日韩亚洲一区二区三区| 欧美日韩午夜视频在线观看| 欧美午夜精品理论片a级按摩| 国产精品狠色婷| 国产欧美一区二区三区视频| 国产一级一区二区| 亚洲第一页在线| 亚洲人屁股眼子交8| 亚洲网站视频福利| 亚洲欧美日韩爽爽影院| 久久精品一级爱片| 欧美成人一区在线| 亚洲激情视频在线观看| 一区二区三区.www| 亚洲综合色婷婷| 久久免费精品视频| 欧美好吊妞视频| 国产日韩精品视频一区二区三区| 好看的av在线不卡观看| 亚洲黄网站黄| 性xx色xx综合久久久xx| 欧美成人精品在线观看| 99视频精品| 久久国产精品久久久久久久久久| 美腿丝袜亚洲色图| 国产精品进线69影院| 一区在线播放| 亚洲一区二区成人在线观看| 久久亚洲综合| 在线视频欧美一区| 久久人人爽爽爽人久久久| 欧美日韩一区在线视频| 国产一区二区久久精品| 一本到高清视频免费精品| 久久久久久夜| 一本久道久久综合中文字幕| 久久天天综合| 国产日韩欧美综合在线| 亚洲作爱视频| 欧美激情1区2区3区| 午夜精品一区二区在线观看| 欧美激情精品久久久| 国内久久精品视频| 亚洲一区二区三区在线看| 亚洲电影免费| 久久国产免费| 国产亚洲一区在线| 午夜在线精品| 亚洲乱码国产乱码精品精| 噜噜噜91成人网| 在线观看亚洲a| 久久久久久电影|