2012-11-05 87 views
0

有沒有辦法(編程)檢測用戶模式掛鉤列表?我曾嘗試閱讀一些有關的文章,但無法完成。任何指針或想法或樣本都會有很大的幫助。直到現在我還沒有開始編寫代碼,所以請隨時用C或C++來幫助我。 TIA。檢測用戶模式掛鉤

編輯::我想用一種方法來枚舉當前正在運行的所有進程,然後再次枚舉每個進程使用的所有模塊。我真正想嘗試的(正如一些專家所解釋的),是比較當前加載到內存中的所有模塊的枚舉列表以及每個進程的磁盤上的模塊列表,以檢查是否掛鉤。有人請說明這一點嗎?我不知道我的問題是什麼,但如果你有我的困惑,請在這裏幫助我。

+0

這裏有幾個例子。例如,Jay Satiro寫了一個可以下載的用戶鉤子監視器。源代碼可以瀏覽https://github.com/jay/gethooks – Anthill

+0

@ Downvoter-請原因。我研究併發布了這個問題。並不是每個人都對谷歌很幸運。 – Abhineet

+0

這就像試圖說服自己,你並不瘋狂。如果有人篡改了您的流程,那麼也可以篡改您的代碼,以檢測您是否被篡改。 –

回答

0

有幾種方式可以實現usermode掛鉤。例如:

  1. 無條件分支指令可以在函數的開始處內聯插入。
  2. 修補導入地址表。
  3. 某些機制可用於在輸入函數時引發異常(更改頁面保護,int 3等),然後使用向量異常處理程序重定向執行。

檢測方法因您檢測到的用戶模式鉤子的方法而異。作爲一個例子,

  1. 用於檢測用戶模式鉤(在目標函數開始JMP指令)的最常用的方法的經典方法是拆卸功能,並檢查第一個指令。
  2. 使用GetProcAddress動態地解析IAT中預期的函數地址,並檢查該表是否與預期相符。
  3. 檢查頁面保護,擅自拆卸等

我不打算提供的掛鉤(和檢測)的所有可能方法的窮舉,而是解釋說,沒有產生任何單一泛型方法用戶模式掛鉤列表。

+0

謝謝你。它有幫助。 – Abhineet

+0

如何比較磁盤和內存中的進程模塊以識別是否存在掛鉤? – Abhineet

0

我建議先找幾個其他的東西。

  1. 檢查是否有Process Address Space RWX內存塊。這不是像內存中的每個函數與磁盤進行比較的強烈操作。
  2. 對於檢查IAT掛鉤,檢查Function Address是否不在外部加載的模塊範圍內。