寫段代碼教會你什么是HOOK技術?HOOK技術能干什么?
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
上述內容是個人對HOOK的定義。接下來,我們將通過一個軟件實例進一步了解HOOK技術。 VC編程-開發自己的加密視頻專用播放器3保護你的播放器和視頻不被逆向「鏈接」? 上篇中調用了三方SDK進行文件保護操作,里面也有HOOK框架。為了方便學習,我們同樣采用三方SDK學習下對系統API的一個HOOK。一起了解下HOOK的一個過程。 我使用VS2017新建個MFC程序。添加如下按鈕
正常按鈕的代碼如下: void ChookDlg::OnBnClickedButton1() { MessageBoxW(L"這是正常的提示框"); } 在當今的軟件技術領域,HOOK 技術作為一種強大且實用的工具,有著廣泛的應用。在本篇內容中,我們就以 HOOK 消息提示函數為例,深入探究其在實際軟件場景中的運用。 HOOK 技術,即鉤子技術,它能夠對系統或軟件的正常執行流程進行干預和控制,通過在關鍵節點插入自定義的邏輯,實現諸如截獲輸入、修改程序行為等功能。消息提示函數在軟件中是極為常見的一個功能,它用于向用戶展示各種信息,如操作結果、警告提示等。 當我們聚焦于一個具體的軟件時,會發現其存在一些特定的交互流程。假設這個軟件有一個特定的按鈕,當用戶按下這個按鈕后,按照正常的程序邏輯,軟件會調用消息提示函數,彈出一個提示框,向用戶顯示“這是正常的提示框”這樣的消息。這是軟件原本預設的交互方式,用戶在點擊按鈕后,就會看到這個固定的提示信息,它是軟件與用戶進行信息溝通的一種常規手段。 然而,借助 HOOK 技術,我們可以對這個消息提示函數進行干預。通過編寫相應的 HOOK 代碼,我們可以在消息提示函數被調用之前或之后插入額外的邏輯。例如,我們可以修改提示框中顯示的內容,將“這是正常的提示框”替換為其他更具個性化或特定含義的消息;或者在提示框彈出之前進行一些額外的檢查,只有在滿足特定條件時才讓提示框正常彈出,否則給出不同的提示信息。這樣一來,我們就能夠改變軟件原本的消息提示行為,實現更加靈活和定制化的交互體驗。 通過這個以 HOOK 消息提示函數為例的場景,我們可以看到 HOOK 技術在軟件領域的巨大潛力和應用價值,它為軟件開發者提供了一種強大的手段來對軟件的行為進行調整和優化。
現在編寫HOOK函數的代碼 1.添加三方SDK 1.1.把SDK復制到項目內,把.H和.LIB文件添加到項目里
#include "..\\BoxedAppSDK\\include\\BoxedAppSDK.h" #pragma comment(lib, "..\\BoxedAppSDK\\lib\\bxsdk32.lib") 2.編寫HOOK按鈕代碼 2.1.獲取原API的地址 BoxedAppSDK_Init(); //初始化SDK PVOID pMeaasgeboxW = (PVOID)GetProcAddress( GetModuleHandleW(L"user32.dll"), "MessageBoxW"); 2.2。用三方SDK進行HOOK g_HOOKMessageBox = BoxedAppSDK_HookFunction(pMeaasgeboxW, &MY_MessageBox, FALSE); 定制個全局句柄接收 HANDLE g_HOOKMessageBox = NULL; 這里我們寫個和系統函數一樣參數的新函數進行替換達到一個HOOK。三方的API可以參考文檔看說明。 2.3.首先獲取系統原API的原形及參數。并自己構造一個新函數 int MessageBoxW( [in, optional] HWND hWnd, [in, optional] LPCWSTR lpText, [in, optional] LPCWSTR lpCaption, [in] UINT uType ); 我們自己的消息函數 int WINAPI MY_MessageBox (HWND hWnd, LPCWSTR lpszText, LPCWSTR lpszCaption, UINT nType) { typedef int (WINAPI *PMessageBox) (HWND hWnd, LPCWSTR lpszText, LPCWSTR lpszCaption, UINT nType); PMessageBox pMessageBox= (PMessageBox)BoxedAppSDK_GetOriginalFunction(g_HOOKMessageBox); lpszText = L"這是被污染的框框"; return pMessageBox(hWnd,lpszText,lpszCaption, nType); } 如此一來,我們便成功構造出了新的函數。借助第三方的軟件開發工具包(SDK)來實施 HOOK 操作,當程序調用 MessageBoxW 函數時,就會轉而進入我們自行編寫的函數。 從上述代碼中能夠看出,在我們自定義的函數里,僅僅對提示內容進行了修改,隨后直接調用原函數并返回結果。 完成代碼編寫之后,我們對程序進行編譯,接著開展測試工作。 我們點擊 HOOK 按鈕,隨后再次點擊“正常”按鈕,此時會發現消息內容已然發生了改變。
這表明程序已被順利 HOOK。HOOK 技術,本質上就是對程序原有的內容進行變更,或是增添全新的內容。在此,為了便于直觀地演示 HOOK 技術,我們直接在同一個程序中編寫代碼。倘若針對的是其他進程,我們可以編寫一個動態鏈接庫(DLL),待注入操作成功之后,同樣能夠達成這般效果。 最后,添加上“卸載”按鈕的代碼,以恢復 HOOK 前的狀態。 BoxedAppSDK_EnableHook(g_HOOKMessageBox, FALSE); 至此,我們的程序已恢復至初始狀態。 所謂的 HOOK 技術,若想洞悉其原理,我們借助反匯編技術,利用調試器一探究竟便可明白。 我們運用反匯編調試器來啟動所編寫的程序,啟動之后,按下“CTRL + G”組合鍵,即可定位到系統函數 MessageBoxW 的地址。
74CEFECF > 8BFF mov edi,edi 74CEFED1 55 push ebp 74CEFED2 8BEC mov ebp,esp 74CEFED4 6A 00 push 0x0 74CEFED6 FF75 14 push dword ptr ss:[ebp+0x14] 74CEFED9 FF75 10 push dword ptr ss:[ebp+0x10] 74CEFEDC FF75 0C push dword ptr ss:[ebp+0xC] 74CEFEDF FF75 08 push dword ptr ss:[ebp+0x8] 74CEFEE2 E8 A3FFFFFF call user32.MessageBoxExW 74CEFEE7 5D pop ebp 74CEFEE8 C2 1000 retn 0x10 此乃正常函數的起始部分。當我們點擊軟件界面上的“HOOK”選項之后,不妨再次進行查看。
此時會發現,代碼已然發生了改變。至此,諸位是否能更為直觀地理解 HOOK 技術的內涵了呢?簡而言之,HOOK 技術就是讓原函數的執行流程在起始處便跳轉至我們自行編寫的函數,進而執行自定義的邏輯。 轉自?https://www.cnblogs.com/simont/p/19794156 該文章在 2026/4/1 11:49:31 編輯過 |
關鍵字查詢
相關文章
正在查詢... |