若在程式設計中啟用了tls功能,pe標頭檔案中就會設定乙個tls表(tls table)。
我們可以看到tls**函式的定義:
啟動引數dllhandle為控制代碼,引數reason為呼叫函式的原因。
我們通過乙個實驗,來準確理解這四種狀態。
#include #include//告知聯結器使用tls
#pragma comment(linker, "/include:__tls_used")
void print_console(char* szmsg)
void ntapi tls_callback1(pvoid dllhandle, dword reason, pvoid reserved)
; wsprintfa(szmsg, "tls_callback1() : dllhandle = %x, reason = %d\n", dllhandle, reason);
print_console(szmsg);
}void ntapi tls_callback2(pvoid dllhandle, dword reason, pvoid reserved)
; wsprintfa(szmsg, "tls_callback2() : dllhandle = %x, reason = %d\n", dllhandle, reason);
print_console(szmsg);}/*
註冊tls函式
.crt$xlx的作用
crt表示使用c runtime 機制
x表示表示名隨機
l表示tls callback section
x也可以換成b~y任意乙個字元
*/#pragma data_seg(".crt$xlx")
//儲存**函式位址
pimage_tls_callback ptls_callbacks = ;
#pragma data_seg()
dword winapi threadproc(lpvoid lparam)
int main(void)
執行結果為:
*注:編譯時請選擇debug版本,否則程式只會執行main函式中的內容。
通過上面實驗我們可以發現:
1.當程序的主程式呼叫main()前,已註冊的tls**函式會被呼叫執行,此時reason的值為1.
2.當所有tls**函式完成呼叫後,main()函式開始呼叫執行,建立使用者程序前,tls會再次被呼叫,此時reason為2.
3.等threadproc()執行緒函式執行結束後,tls會被再次執行,reason為3。
4.當main()函式結束時,tls回再次呼叫,此時reason為0.
販妖記 第四十五章,怨氣法寶
孩子的哭鬧聲戛然而止,我轉過頭,看見那張稚嫩的臉上表情定格,粉嫩嫩的面容沒有驚恐和害怕,它是個不該出生在這世界上的孩子,半人半鬼,獨一無二,其實我很難想象它將來長大後會不會和慧智那樣的孩子一樣學習,結婚生子。然而,現在卻不用去想象了,因為這條生命已經落幕。沒有半條命這樣的說法,不會因為它是半人半鬼就...
逆向工程核心原理 第十五章
第十五章的15.3介紹了upx殼的四個迴圈及其作用,接下來我們乙個乙個的看一下 迴圈1 通過 我們能知道,ecx為迴圈次數,迴圈的內容是從edx中讀取乙個位元組放入edi中,這個位元組就是節區 upx0 0042d6fd 8a02 mov al,byte ptr ds edx 將edx放入al 00...
NeHe OpenGL第四十五課 頂點快取
nehe opengl第四十五課 頂點快取 頂點快取 你想更快地繪製麼?直接操作顯示卡吧,這可是當前的圖形技術,不要猶豫,我帶你入門。接下來,你自己向前走吧。速度是3d程式中最重要的指標,你必須限制繪製的多邊形的個數,或者提高顯示卡繪製多邊形的效率。顯示卡最近增加了乙個新的擴充套件,叫做頂點快取vs...