逆向工程核心原理 第四十五章

2022-07-15 15:00:12 字數 1708 閱讀 5210

若在程式設計中啟用了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...