當前位置:編程學習大全網 - 編程語言 - Hook編程書籍

Hook編程書籍

不好意思,API鉤子和消息鉤子不壹樣。雖然都叫鉤子,但本質上是不壹樣的,所以不存在全局和局部之分。消息鉤子是Windows提供給應用程序的普通應用,而API“利用”Windows的特性來達到目的。

只有兩種方法可以為目標進程掛接壹個API:利用PE文件的結構,修改目標進程各個可執行模塊(包括exe和dll)中的導入表,將目標API的地址修改為自己編寫的函數。這個方法是Windows核心編程第22章介紹的最經典的掛鉤API的方法。

上面的方法有壹個很大的缺點,就是如果在妳的程序運行之前,目標進程已經運行了,並且已經通過使用GetProcAddress獲得了目標API的地址,那麽這個方法就沒用了,因為目標進程很有可能以後也不會通過導入表的方式獲得API的地址。前段時間做了壹個IE的socket的鉤子,我用了另外壹種方法:

這個方法的前身是把目標API的前五個字節改成壹個jmp跳轉指令,直接跳轉到妳的API,然後妳把這五個字節寫回去,然後再用同樣的參數調用目標API,目標API返回後再返回那五個字節(有點像缺頁中斷的過程)。所以現在您可以攔截對目標API的所有調用。但是,這種方法最大的缺點是對多線程無效。於是我引入了另壹種方法:當對目標API的調用跳轉到我的代碼中時,不要把那五個字節寫回去,而是在妳的API中,用匯編實現那五個字節的原函數,然後直接跳轉到目標API的第六個字節運行,這樣妳的API就永遠不會被遺漏,而且只要妳註意寄存器的保存和回收以及堆棧的平衡,這種方法就會非常穩定。當然,這種方法會受到API版本的限制。不同版本的前五個字節可能不同,所以應該分別對待。

說了這麽多廢話,最核心的壹點是,把自己的代碼註入目標進程最簡單的方法就是使用Dll。當然,沒有Dll也有辦法,比如駱昀斌的《Windows環境下32位匯編語言編程》中提到的,用匯編寫比Dll更麻煩。

以上言論版權為《從真心到永遠》。

  • 上一篇:微電腦控制是什麽意思
  • 下一篇:openGL 是什麽軟件
  • copyright 2024編程學習大全網