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

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

TLS 處理

轉載自:http://bbs.pediy.com/showthread.php?threadid=17839

標 題: 翻譯 TLS 處理
作 者: forgot
時 間: 2005-10-23,12:19
鏈 接: http://bbs.pediy.com/showthread.php?t=17839

英語又退步了唉,不準就不準吧湊或看。

支持 TLS

原文:Writing Your Own Packer - by BigBoote

TLS(Thread Local Storage,線程局部存儲)是一種便利的編程機制。我們通常不使用,因此并不太關心。但是要壓縮的原程序可能會用到它。事實上,Delphi 總是使用它,如果我們打算支持 Delphi 程序,最好兼容它。

TLS 基本上是通過 API 實現。大致過程是,你分配一個“ Index(索引)”并存儲在一個全局變量中。通過這個 Index 獲得針對每個線程的一個雙字值。通常使用這個值保存一個為每個線程分配好的內存塊的指針。人們認為這樣很乏味,一個特殊機制的出現使得實現它更容易些。因此,你可以這樣寫代碼:

__declspec ( thread ) int tls_int_value = 0;


每個線程可以通過名稱訪問它獨特的實例,就像訪問其他變量一樣。我不知道這種 TLS 形式是否有官方名稱,所以我叫它“簡化 TLS”。這種機制與操作系統兼容,并且 PE 文件中有對應的結構。這些結構包含在數據目錄的一個塊中:

origdirinfo[IMAGE_DIRECTORY_ENTRY_TLS].VirtualAddress

問題是, 處理這信息發生在由 OS 在每個線程的創建時刻,在執行到線程開始地址之前。(這句翻譯的拗口,原文 The problem is that the processing of this information happens by the OS on the creation of every thread prior to execution being passed to the thread start address. )這通常不牽涉到我們,除了至少一個線程在我們解壓數據之前被執行:我們的線程!我們必須設置一個偽 TLS 處理區段捕獲 OS 在我們開始之前做的事情,然后在最后一步把這個信息傳遞給原程序。

為此,我在外部加殼器外部全局結構添加了2個項目:
GlobalExternVars
{
//(other stuff we previously described)
IMAGE_TLS_DIRECTORY tls_original;
IMAGE_TLS_DIRECTORY tls_proxy;
}
;

加殼器將會在運行期復制原始數據到 tls_orginal 為我們所用。tls_proxy 幾乎是一個精確的副本,除了2個項目將會被修改:
tls_proxy.AddressOfIndex
tls_proxy.AddressOfCallBacks

在這個塊中我們將要初始化 AddressOfIndex 指向一個正常的全局雙字變量,并且我們將初始化 AddressOfCallBacks 指向一個函數指針數組。它是一個線程創建時將會被調用的函數指針列表。用戶使用它定義 TLS 對象的初始化。唉,我沒見過一個編譯器使用它。此外,在 9x 下,這些函數不會被調用。盡管如此,我們還是要支持它以防萬一哪天它會被使用。我們令 AddressOfCallbacks 指向一個2個成員的數組,一個試我們將要執行的函數指針,另一個是 NULL 作為列表結束符。

設置一個全局雙字存儲 TLS slot(槽?)
DWORD TLS_slot_index;

TLS 回調函數必須是這種原型:
extern "C" void NTAPI TLS_callback ( PVOID DllHandle, DWORD Reason, PVOID Reserved );

當然還要添加兩個邏輯標志表示是否可以安全地調用原來的回調函數,和是否延期調用。這樣初始化它們:
bool safe_to_callback_tls = false;
bool delayed_tls_callback = false;

再提供一些變量保存延遲調用的數據:
PVOID TLS_dll_handle = NULL;
DWORD TLS_reason 
= 0;
PVOID TLS_reserved 
= NULL;

編寫回調函數:
extern "C" void NTAPI TLS_callback ( PVOID DllHandle, DWORD Reason, PVOID Reserved )
{
        
if ( safe_to_callback_tls )
        
{
                PIMAGE_TLS_CALLBACK
* ppfn = g_pkrdat.m_tlsdirOrig.AddressOfCallBacks;
                
if ( ppfn )
                
{
                        
while ( *ppfn )
                        
{
                        (
*ppfn) ( DllHandle, Reason, Reserved );
                        
++ppfn;
                        }

                }


        }

        
else
        
{
                delayed_tls_callback 
= true;
                TLS_dll_handle 
= DllHandle;
                TLS_reason 
= Reason;
                TLS_reserved 
= Reserved;
        }

}


這樣會為 OS 提供一個存儲 slot 信息的地方,我們稍候恢復它,并且如果調用了我們的回調函數我們將捕獲參數,在解壓縮之后調用原來的回調函數。否則會出錯因為 0S 會在我們有機會解壓縮之前做這件事情。解壓縮之后,我們把參數傳遞給原來的回調函數。

最后一步是這樣的:
void FinalizeTLSStuff()
{
        
if ( origdirinfo[IMAGE_DIRECTORY_ENTRY_TLS].VirtualAddress != 0 )
        
{
                
*gev.tls_original.AddressOfIndex = TLS_slot_index;
                
void* TLS_data;

                __asm
                
{
                mov ecx, DWORD PTR TLS_slot_index;
                mov edx, DWORD PTR fs:[02ch]
                mov ecx, DWORD PTR [edx
+ecx*4]
                mov pvTLSData, ecx
                }


                
int size = gev.tls_original.EndAddressOfRawData - gev.tls_original.StartAddressOfRawData;

                memcpy ( pvTLSData, (
void*) gev.tls_original.StartAddressOfRawData, size );
                memset ( (
void*) gev.tls_original.EndAddressOfRawData, 0,
                gev.tls_original.SizeOfZeroFill );
        }


        safe_to_callback_tls 
= true;
        
if ( delayed_tls_callback )
        
{
                TLSCallbackThunk ( TLS_dll_handle TLS_reason TLS_reserved );
        }

}

posted on 2008-04-29 14:46 楊粼波 閱讀(504) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲一区黄色| 91久久精品久久国产性色也91| 欧美中在线观看| 欧美午夜片欧美片在线观看| 在线一区观看| 久久精品国产一区二区三区免费看| 国一区二区在线观看| 久久综合国产精品台湾中文娱乐网| 亚洲男女自偷自拍| 国内精品伊人久久久久av影院 | 欧美sm重口味系列视频在线观看| 欧美国产激情二区三区| 国产日韩欧美综合一区| 免费成人网www| 亚洲素人一区二区| 亚洲福利小视频| 久久久亚洲精品一区二区三区| 99精品视频免费全部在线| 激情综合色丁香一区二区| 欧美日韩福利在线观看| 美国成人直播| 最新日韩中文字幕| 午夜精品久久久久久久99水蜜桃| 国产一区二区精品久久99| 久久精品99| 欧美大片在线观看| 99re6这里只有精品视频在线观看| 久久综合中文| 亚洲人成在线观看网站高清| 午夜在线观看免费一区| 在线观看国产日韩| 欧美激情一区二区三区在线| 狼人社综合社区| 亚洲国产高清在线| 欧美一级片一区| 亚洲第一视频网站| 性一交一乱一区二区洋洋av| 亚洲激情精品| 国产日韩精品一区观看| 国产精品你懂的在线| 欧美涩涩网站| 国产日韩一区在线| 国产一区二区久久精品| 激情国产一区二区| 欧美一区二区| 在线不卡中文字幕| 欧美日韩中文另类| 欧美日韩在线三区| 国产精品久久久久久妇女6080| 国产精品白丝av嫩草影院| 国产精品欧美日韩一区二区| 国产精品色婷婷| 国产欧美 在线欧美| 国产午夜精品美女视频明星a级 | 麻豆亚洲精品| 久久婷婷国产综合精品青草 | 亚洲一区二区视频| 午夜精品一区二区三区四区| 久久国产精品电影| 欧美www在线| 一区二区电影免费观看| 亚洲欧美日韩国产综合精品二区| 久久狠狠一本精品综合网| 欧美成人免费在线| 国产精品久久久久aaaa| 国内精品久久久久久 | 中文精品视频一区二区在线观看| 亚洲一级影院| 在线一区亚洲| 久久www成人_看片免费不卡| 欧美成人免费va影院高清| 国产精品福利久久久| 国产午夜亚洲精品不卡| 一本色道久久综合狠狠躁篇怎么玩| 校园激情久久| 猛男gaygay欧美视频| 亚洲一区二区三区成人在线视频精品| 亚洲私人黄色宅男| 久热爱精品视频线路一| 国产精品久久久久久久久免费| 极品尤物一区二区三区| 亚洲一本视频| 欧美激情亚洲激情| 欧美一区二区私人影院日本 | 激情成人综合网| 亚洲在线视频| 亚洲欧洲视频| 久久久久久久久一区二区| 国产精品成人在线| 亚洲缚视频在线观看| 欧美中日韩免费视频| 一本色道**综合亚洲精品蜜桃冫 | 亚洲国产成人久久综合| 香蕉久久精品日日躁夜夜躁| 欧美日韩另类国产亚洲欧美一级| 精品电影在线观看| 欧美呦呦网站| 亚洲靠逼com| 欧美激情免费观看| 亚洲国产第一| 久久婷婷影院| 久久国产日韩| 黄色亚洲在线| 久久久成人网| 久久国产婷婷国产香蕉| 国产一区二区三区在线观看精品| 亚洲影院在线观看| 亚洲图片欧美午夜| 国产精品日日做人人爱| 国产一区二区三区日韩| 狠狠噜噜久久| 中文国产成人精品久久一| 午夜精品理论片| 久久精品久久综合| 亚洲高清自拍| 亚洲视频电影在线| 欧美一区亚洲二区| 久久综合久久综合久久综合| 欧美精品尤物在线| 国产日韩欧美黄色| 香蕉成人伊视频在线观看| 午夜精品电影| 亚洲国产成人av在线| 欧美激情在线观看| 欧美激情一区三区| 亚洲精品在线一区二区| 一区二区三区精品| 亚洲精品国产精品乱码不99| 一区二区三区欧美日韩| 免费观看国产成人| 国产日韩在线看| 一本色道久久精品| 欧美电影在线观看完整版| 久久国产免费| 国产精品九九| 久久伊人免费视频| 欧美日韩综合精品| 久久影院亚洲| 欧美精品在线极品| 性做久久久久久久免费看| 99视频精品全部免费在线| 午夜精品久久久久久久男人的天堂 | 美国成人直播| 欧美午夜精品久久久久免费视| 午夜精品视频在线| 久久久av毛片精品| 欧美日本一区| 99视频超级精品| 午夜老司机精品| 亚洲国产一区在线观看| 亚洲天堂黄色| 在线播放中文一区| 一区二区三区日韩| 黑人操亚洲美女惩罚| 一区二区av在线| 亚洲电影免费在线| 亚洲欧美美女| 亚洲午夜精品久久| 久久永久免费| 久久精品亚洲| 国产精品婷婷午夜在线观看| 亚洲国产精品第一区二区三区| 国产精品你懂的在线| 亚洲精品中文字幕在线观看| 狠狠综合久久av一区二区老牛| 在线视频欧美日韩| 亚洲人人精品| 久久久久久一区二区| 欧美一区二区啪啪| 欧美日韩国产小视频| 欧美激情aⅴ一区二区三区| 国产午夜精品全部视频播放| 亚洲专区一区二区三区| 亚洲视频香蕉人妖| 欧美日韩成人网| 亚洲电影视频在线| 在线看片日韩| 久久久www免费人成黑人精品| 欧美在线高清| 国产亚洲欧美日韩一区二区| 亚洲在线免费视频| 欧美亚洲免费高清在线观看| 国产精品久久久久久户外露出 | 欧美亚洲一区三区| 国产精品日日摸夜夜添夜夜av| 亚洲日本激情| 99热在线精品观看| 欧美日韩久久久久久| 99热精品在线| 亚洲一区二区精品| 久久久久久久久久久成人| 日韩视频免费在线| 一区二区三区国产精华| 一区二区三区精品| 亚洲国产成人精品视频 | 亚洲国产精品va| 国产又爽又黄的激情精品视频| 亚洲综合视频一区| 欧美日韩亚洲一区二区| 欧美综合77777色婷婷|