c語言hook
❶ 誰能用c語言寫一個鉤子函數的例子
例子:
HWND hWnd = NULL; //定義成全局變數
HHOOK hKeyboard;
HHOOK hMouse;
LRESULT CALLBACK MouseProc( int nCode, WPARAM wParam, LPARAM lparam ) // 滑鼠鉤子函數
{
return 1; // 返回非零值表示已經對當前消息進行了處理,這樣系統就不會再將這個消息傳遞給目標窗口過程
}
LRESULT CALLBACK KeyboardProc( int nCode, WPARAM wParam, LPARAM lparam )
if( VK_F4 == wParam && (1 == (lparam>>29&1)) ) // 系統後門:Alt+F4鍵退出程序
{
::SendMessageA( hWnd, WM_CLOSE, 0, 0 );
定義鉤子函數
鉤子函數是一種特殊的回調函數。鉤子監視的特定事件發生後,系統會調用鉤子函數進行處理。不同事件的鉤子函數的形式是各不相同的。下面以滑鼠鉤子函數舉例說明鉤子函數的原型:
LRESULT CALLBACK HookProc(int nCode ,WPARAM wParam,LPARAM lParam)
參數wParam和 lParam包含所鉤消息的信息,比如滑鼠位置、狀態,鍵盤按鍵等。nCode包含有關消息本身的信息,比如是否從消息隊列中移出。 我們先在鉤子函數中實現自定義的功能,然後調用函數 CallNextHookEx.把鉤子信息傳遞給鉤子鏈的下一個鉤子函數。CallNextHookEx.的原型如下:
LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam ) 參數 hhk是鉤子句柄。nCode、wParam和lParam 是鉤子函數。
當然也可以通過直接返回TRUE來丟棄該消息,就阻止了該消息的傳遞。
❷ 什麼是HOOK技術
HOOK技術是Windows消息處理機制的一個平台,應用程序可以在上面設置子程序以監視指定窗口的某種消息,而且所監視的窗口可以是其他進程所創建的。當消息到達後,在目標窗口處理函數之前處理它。鉤子機制允許應用程序截獲處理window消息或特定事件。
鉤子實際上是一個處理消息的程序段,通過系統調用,把它掛入系統。每當特定的消息發出,在沒有到達目的窗口前,鉤子程序就先捕獲該消息,亦即鉤子函數先得到控制權。這時鉤子函數即可以加工處理(改變)該消息,也可以不作處理而繼續傳遞該消息,還可以強制結束消息的傳遞。
/iknow-pic.cdn.bcebos.com/6f061d950a7b0208cd8255a36fd9f2d3572cc82d"target="_blank"title="點擊查看大圖"class="illustration_alink">/iknow-pic.cdn.bcebos.com/6f061d950a7b0208cd8255a36fd9f2d3572cc82d?x-bce-process=image%2Fresize%2Cm_lfit%2Cw_600%2Ch_800%2Climit_1%2Fquality%2Cq_85%2Fformat%2Cf_auto"esrc="https://iknow-pic.cdn.bcebos.com/6f061d950a7b0208cd8255a36fd9f2d3572cc82d"/>
(2)c語言hook擴展閱讀:
Hook原理
Hook技術無論對安全軟體還是惡意軟體都是十分關鍵的一項技術,其本質就是劫持函數調用。但是由於處於Linux用戶態,每個進程都有自己獨立的進程空間,所以必須先注入到所要Hook的進程空間,修改其內存中的進程代碼,替換其過程表的符號地址。在Android中一般是通過ptrace函數附加進程,然後向遠程進程注入so庫,從而達到監控以及遠程進程關鍵函數掛鉤。
Hook技術的難點,並不在於Hook技術,初學者藉助於資料「照葫蘆畫瓢」能夠很容易就掌握Hook的基本使用方法。如何找到函數的入口點、替換函數,這就涉及了理解函數的連接與載入機制。
從Android的開發來說,Android系統本身就提供給了我們兩種開發模式,基於AndroidSDK的Java語言開發,基於AndroidNDK的NativeC/C++語言開發。所以,我們在討論Hook的時候就必須在兩個層面上來討論。
對於Native層來說Hook的難點其實是在理解ELF文件與學習ELF文件上,特別是對ELF文件不太了解的讀者來說;對於Java層來說,Hook就需要了解虛擬機的特性與Java上反射的使用。