說一個掛鉤給定的DLL函數。 是否所有使用該鉤子特定DLL的特定函數的進程都受該鉤子影響?API鉤子是否會影響所有進程?
例如,如果一個是從user32.dll
掛鉤MessageBoxA
,這樣,而不是彈出一個消息,將起到披頭士黃色潛水艇作爲一個系統的聲音。所有調用MessageBoxA
的進程都會遇到這種相當奇怪的行爲嗎?
-JoãoSilva
說一個掛鉤給定的DLL函數。 是否所有使用該鉤子特定DLL的特定函數的進程都受該鉤子影響?API鉤子是否會影響所有進程?
例如,如果一個是從user32.dll
掛鉤MessageBoxA
,這樣,而不是彈出一個消息,將起到披頭士黃色潛水艇作爲一個系統的聲音。所有調用MessageBoxA
的進程都會遇到這種相當奇怪的行爲嗎?
-JoãoSilva
一般來說,它會處理特定的。
當你加載DLL窗口加載DLL到你的內存空間。如果dll已經加載到內存中(並映射到某個進程的空間),那麼Windows將只將內存映射到進程空間。
但是,當您應用掛鉤時,內存會發生變化,因此windows會爲您的進程創建所述內存的副本。
讀取內存映射文件(此技術是用於加載代碼的窗口)
呃...不一定。通常情況下,文本段是'FILE_MAP_COPY',所以你是對的,但是這並不需要這樣。 – Damon
@Damon - 真的,總會有例外。我只是說明了常見的做法。請詳細瞭解我想閱讀的更多答案。 –
@Preet我問了這個問題,因爲我認爲我知道DLL的代碼在進程間共享。你是說如果一個鉤子被應用到user32.dll的函數中,系統實際上會將整個DLL複製到進程內存空間中,以便可以安全地更改其內存? –
謝天謝地,沒有。很難保證操作系統能夠正常運行。 –
@HansPassant,我知道這是一個老問題,但我有一個問題。我正在開發一個項目,我們需要監視所有對某個函數「recv」的系統調用,而不管實例化它的過程如何。可能嗎 ? –