深入解析鉤子和動態鏈結庫

2021-04-01 00:57:13 字數 538 閱讀 6096

對於如何使用和建立鉤子有許多的爭議,這篇文章試圖澄清這些問題。

注意:如果你只是在自己的程序內使用鉤子則不會有下面的問題, 這只發生在你使用系統鉤子的時候。

關鍵問題在於 位址空間,dll函式中的**所建立的任何物件(包括變數)都歸呼叫它的執行緒或程序所有。當程序在載入dll時,作業系統自動把dll位址對映到該程序的私有空間,也就是程序的虛擬位址空間,而且也複製該dll的全域性資料的乙份拷貝到該程序空間。也就是說每個程序所擁有的相同的dll的全域性資料,是私有的,dll成為程序的一部分,以這個程序的身份執行,使用這個程序的堆疊。這意味著資料會被重新初始化。典型地,它們將是零。

有人建議在dll上存放資料的位址。 這是不可能的。有人反對? 那好,這不是不可能的,但這是不可能有什麼 用途 的。既使你建立的是對dll 的所有例項可見的共享記憶體變數,這一變數只有在儲存它的程序中才有實際的意義。 對於所有其它的程序,這僅僅是一串位元位,並且如果你設法使用它作為位址,對於事件被攔截的程序而言,這個位址是完全無用甚至導致程式崩潰。

這個分開的位址空間的概念是乙個難以掌握的概念。 讓我使用說明它。

靜態鏈結庫和動態鏈結庫

其實再vc中,我們所用得所有api函式都封裝再下列三個dll檔案中 kernel32.dll 用於管理記憶體,程序和執行緒得各個函式 user32.dll 用於執行使用者介面任務,如視窗的建立和訊息的傳遞的各個函式 gdi32.dll 用於顯示文字和畫圖的各個函式 動態鏈結庫 我們再使用動態庫的時候...

靜態鏈結庫和動態鏈結庫

靜態鏈結庫 win32 static library 呼叫libtest.lib 動態dll win32 dynamic link library 跟librest的生成是一樣的 動態呼叫 成的.lib 和.dll 檔案拷入dllcall 工程所在的路徑,dllcall 執行下列 dll 中匯出函式...

靜態鏈結庫和動態鏈結庫

以前的時候寫過這方面的部落格,當時寫的時候都覺得已經懂了。今天閒著沒事幹,和咚哥他們去大華校招筆試遇到了這個問題。我突然間發現sdk沒寫三個月,把dll都忘記了。回來看了下,複習下。以前寫過程式的裝載和鏈結的部落格,那是os上面比較理論的。實際用函式庫的時候主要分為,靜態庫和動態庫,這裡就簡簡單單地...