日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

PE文件和COFF文件格式分析——导出表的应用——一种摘掉Inline钩子(Unhook)的方法

發布時間:2023/11/27 生活经验 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PE文件和COFF文件格式分析——导出表的应用——一种摘掉Inline钩子(Unhook)的方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ? 在日常應用中,某些程序往往會被第三方程序下鉤子(hook)。如果被下鉤子的進程是我們的進程,并且第三方鉤子嚴重影響了我們的邏輯和流程,我們就需要把這些鉤子摘掉(Unhook)。本件講述一種在32位系統上,如何摘掉API鉤子的思路和方法。(轉載請指明來源于breaksoftware的CSDN博客)

? ? ? ? Hook的相應介紹已經很多了,如果對這個技術不是很了解的,可以先搜索下了解下。

? ? ? ? 一般來說,我們比較熟悉的函數的起始指令是:

push        ebp  
mov         ebp,esp 

? ? ? ? 這兩條指令是為了保存前一個函數的棧基址,并將本函數的棧頂指針保存到ebp寄存器中。這樣的設計是非常有意義的,在windows平臺上,棧的擴展方向是從大端到小端,即由高地址向低地址擴展以申請更大的棧空間。esp則指向棧頂,然而棧頂會根據棧申請和釋放而變化,所以如果以esp作為基址來計算變量的位置,將導致一會兒[esp-10]代表變量A,一會兒[esp-20]代表變量A。

? ? ? ?雖然這樣的結構有種種好處,但是這個肯定不是必須的。所以函數的起始地址指令是不確定的。這兒之所以說這么一大堆,是想說明,Hook庫對不同的API進行Hook的方式是不同的。有的是修改函數入口地址的代碼,比如上面的入口地址指令可以被Hook庫以jmp xxxx來代替。這樣就實現了API Hook。本文所討論和實驗的方法也是針對jmp型Hook。

? ? ? ? 我們以CreateProcessInternalW函數為例,我們看下其匯編代碼:

_CreateProcessInternalW@48:
77023BBB  push        654h  
77023BC0  push        77024968h  
77023BC5  call        __SEH_prolog4_GS (7701415Ch)  
? ? ? ? 我們使用Hook庫下鉤子,可以發現其代碼變成:
_CreateProcessInternalW@48:
77023BBB  jmp         HookApiByDectours::Mine_CreateProcessInternalW (0A927E0h)  
77023BC0  push        77024968h  
77023BC5  call        __SEH_prolog4_GS (7701415Ch)  

? ? ? ? 我們的思路很簡單,就是——以其人之道還治其人之身。

? ? ? ? 我將從被Hook函數的PE文件中,讀取原來的代碼,然后和現在內存中的代碼做對比。如果不同,則被hook,并將不同的地方改成PE文件中的函數代碼。其中涉及的PE知識可以參考《PE文件和COFF文件格式分析》。其中最需要關注的是《PE文件和COFF文件格式分析——導出表》,該文講述了如何從PE文件中獲取代碼地址的方法。

? ? ? ? 具體的替換代碼是:

BOOL CUnHookDllFunc::UnHook()
{BOOL bSuc = FALSE;do {LPBYTE lpFunStart = m_lpStart + m_dwRA;HMODULE hModule = GetModuleHandleA(m_strDllPath.c_str());if ( NULL == hModule ) {break;}LPBYTE lpOriFuncAddr = (LPBYTE)hModule + m_dwRVA;DWORD dwModifyCount = 0;for ( int n = 0; n < MAXCOMPCOUNT; n++ ) {if ( *(lpOriFuncAddr + n) != *(lpFunStart + n) ) {dwModifyCount++;}}if ( dwModifyCount == 0 ) {bSuc = TRUE;}else if ( dwModifyCount == MAXCOMPCOUNT ) {// 超過則認為不支持break;}else {DWORD dwOldPro = 0;if ( FALSE == VirtualProtect(lpOriFuncAddr, dwModifyCount, PAGE_EXECUTE_READWRITE, &dwOldPro )) {DWORD dwLastErr = GetLastError();break;}for ( DWORD dwIndex = 0; dwIndex < dwModifyCount; dwIndex++ ) {*(lpOriFuncAddr + dwIndex) = *(lpFunStart + dwIndex);}VirtualProtect(lpOriFuncAddr, dwModifyCount, dwOldPro, &dwOldPro);bSuc = TRUE;}} while (0);return bSuc;
}
? ? ? ? 最后附上測試工程。其Hook了和UnHook的狀態如下圖。



總結

以上是生活随笔為你收集整理的PE文件和COFF文件格式分析——导出表的应用——一种摘掉Inline钩子(Unhook)的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。