windows訊息鉤子一般都很熟悉了。它的用處很多,耳熟能詳的就有——利用鍵盤鉤子獲取目標程序的鍵盤輸入,從而獲得各類密碼以達到不可告人的目的。朋友想讓他的軟體不被別人的全域性鉤子監視,有沒有辦法實現呢?答案是肯定的,不過缺陷也是有的:)。
首先簡單看看全域性鉤子如何注入別的程序。
訊息鉤子是由win32子系統提供,其核心部分通過ntusersetwindowshookex為使用者提供了設定訊息鉤子的系統服務,使用者通過它註冊全域性鉤子。當系統獲取某些事件,比如使用者按鍵,鍵盤driver將掃瞄碼等傳入win32k的keyevent處理函式,處理函式判斷有無相應hook,有則callhook。此時,系統取得hook物件資訊,若目標程序沒有裝載對應的dll,則裝載之(利用keusermodecallback「呼叫」使用者例程,它與apc呼叫不同,它是仿製中斷返回環境,其呼叫是「立即」性質的)。
進入使用者態的kiusercallbackdispatcher後,kiusercallbackdispatcher根據傳遞的資料獲取所需呼叫的函式、引數等,隨後呼叫。針對上面的例子,為裝載hook dll,得到呼叫的是loadlibraryexw,隨後進入ldrloaddll,裝載完畢後返回,後面的步驟就不敘述了。
從上面的討論我們可以得出乙個最簡單的防侵入方案:hook api使得載入失敗,不過有乙個缺陷:系統並不會因為一次的失敗而放棄,每次有訊息產生欲call hook時系統都會試圖在你的程序載入dll,這對於效能有些微影響,不過應該感覺不到。剩下乙個問題就是不是所有的loadlibraryexw都應攔截,這個容易解決,比如判斷返回位址。下面給出乙個例子片斷,可以新增一些判斷使得某些允許載入的hook dll被載入。
這裡hook api使用了微軟的detours庫,隨需要修改。
typedef hmodule (__stdcall *loadlib)(
lpcwstr lpwlibfilename,
handle hfile,
dword dwflags
);extern "c"
ulong user32 = 0;
hmodule __stdcall mine_loadlibraryexw(
lpcwstr lpwlibfilename,
handle hfile,
dword dwflags)
hmodule res = (loadlib(real_loadlibraryexw)) (
lpwlibfilename,
hfile,
dwflags );
return res;
}bool processattach()
bool processdetach()
防止全域性鉤子的侵入
windows訊息鉤子一般都很熟悉了。它的用處很多,耳熟能詳的就有 利用鍵盤鉤子獲取目標程序的鍵盤輸入,從而獲得各類密碼以達到不可告人的目的。朋友想讓他的軟體不被別人的全域性鉤子監視,有沒有辦法實現呢?答案是肯定的,不過缺陷也是有的。首先簡單看看全域性鉤子如何注入別的程序。訊息鉤子是由win32子系...
防止全域性鉤子的侵入
防止全域性鉤子的侵入 windows訊息鉤子一般都很熟悉了。它的用處很多,耳熟能詳的就有 利用鍵盤鉤子獲取目標程序的鍵盤輸入,從而獲得各類密碼以達到不可告人的目的。朋友想讓他的軟體不被別人的全域性鉤子監視,有沒有辦法實現呢?答案是肯定的,不過缺陷也是有的。首先簡單看看全域性鉤子如何注入別的程序。訊息...
全域性鉤子的改名
全域性鉤子預設鍵名 是 all 可以改名,方便頁面渲染等dom操作 例如校驗量詞密碼是否一致 def clean self password self.cleaned data.get password r pwd self.cleaned data.get r pwd if password an...