程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 計算機二級輔導:如何實現API鉤子

計算機二級輔導:如何實現API鉤子

編輯:Delphi

一、
  序言對大多數的Windows開發者來說,如何在Win32系統中對API函數的調用進行攔截一直是項極富挑戰性的課題,因為這將是對你所掌握的計算機知識較為全面的考驗,尤其是一些在如今使用RAD進行軟件開發時並不常用的知識,這包括了操作系統原理、匯編語言甚至是關於機器指令代碼的(聽上去真是有點恐怖,不過這是事實)。
  當前廣泛使用的Windows操作系統中,像Win 9x和Win NT/2K,都提供了一種比較穩健的機制來使得各個進程的內存地址空間之間是相互獨立,也就是說一個進程中的某個有效的內存地址對另一個進程來說是無意義的,這種內存保護措施大大增加了系統的穩定性。不過,這也使得進行系統級的API攔截的工作的難度也大大加大了。
  當然,我這裡所指的是比較文雅的攔截方式,通過修改可執行文件在內存中的映像中有關代碼,實現對API調用的動態攔截;而不是采用比較暴力的方式,直接對可執行文件的磁盤存儲中機器代碼進行改寫。
  二、
  API鉤子系統一般框架通常,我們把攔截API的調用的這個過程稱為是安裝一個API鉤子(API Hook)。一個API鉤子至少有兩個模塊組成:一個是鉤子服務器(Hook Server)模塊,一般為EXE的形式;一個是鉤子驅動器(Hook Driver)模塊,一般為DLL的形式。
  服務器主要負責向目標進程注入驅動器,使得驅動器工作在目標進程的地址空間中,這是關鍵的第一步。驅動器則負責實際的API攔截工作,以便在我們所關心的API函數調用的前後能做一些我們需要的工作。
  一個大家比較常見的API鉤子的例子就是一些實時翻譯軟件(像金山詞霸)中必備的的功能:屏幕抓詞,它主要是對一些GDI 函數進行了攔截,獲取它們的輸入參數中的字符串,然後在自己的窗口中顯示出來。針對上述的兩個部分,有以下兩點需要我們重點考慮的: 選用何種DLL注入技術 采用何種API攔截機制
  三、
  注入技術的選用由於在Win32系統中各個進程的地址是互相獨立的,因此我們無法在一個進程中對另一個進程的代碼進行有效的修改。而你要完成API鉤子的工作就必須進行這種操作。因此,我們必須采取某種獨特的手段,使得API鉤子(准確的說是鉤子驅動器)能夠成為目標進程中的一部分,才有較大的可能來對目標進程數據和代碼進行有控制的修改。
  通常有以下幾種注入方式:
  1.利用注冊表如果我們准備攔截的進程連接了User32.dll,也就是使用了User32中的API(一般圖形界面的應用程序都符合這個條件),那麼就可以簡單把你的鉤子驅動器DLL的名字作為值添加在下面注冊表的鍵下: HKEY_LOCAL_MacHINE\\Software\\Microsoft\\WindowsNT\\CurrentVersion\\Windows\\AppInit_DLLs 值的形式可以為單個DLL的文件名,或者是一組DLL的文件名,相鄰的名稱之間用逗號或空格間隔。所有由該值標識的DLL將在符合條件的應用程序啟動的時候裝載。這是一個操作系統內建的機制,相對其他方式來說危險性較小,但它有一些比較明顯的缺點: 該方法僅適用於NT/2K操作系統。看看鍵的名稱你就應該明白 為了激活或停止鉤子的注入,必須重新啟動Windows。這個就似乎太不方便了 不能用此方法向沒有使用User32的應用程序注入DLL,例如控制台應用程序 不管需要與否,鉤子DLL將注入每一個GUI應用程序,這將導致整個系統性能的下降
  2.
  建立系統范圍的Windows鉤子要向某個進程注入DLL,一個十分普遍也是比較簡單的方法就是建立在標准的Windows鉤子的基礎上。Windows鉤子一般是在DLL中實現的,這是一個全局性的Windows鉤子的基本要求,這也符合我們的需要。當我們成功地調用SetWindows

[1] [2] [3] [4] [5] [6] 下一頁

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved