1. 程式人生 > >HOOK鉤子技術3 IATHook

HOOK鉤子技術3 IATHook

原理

如果程式中使用了靜態連結庫檔案,那麼PE檔案中就會有關於這些函式的匯入表的存在,程式通過呼叫IAT表來定位函式地址從而實現呼叫。如果將這些已經確定好的函式地址給替換成為惡意函式地址,那麼就會欺騙 程式執行惡意函式。

編碼測試

  • IDE: VS 2008
  • APP:DLL TYPE
  • OS: WINDOWS XP SP3
// dllmain.cpp : 定義 DLL 應用程式的入口點。
#include "stdafx.h"
#include <windows.h>

//定義函式指標,和CreateFileW一致
typedef HANDLE ( WINAPI *CRETEFILEW)
(
 LPCTSTR,              
 DWORD,                
 DWORD ,               
 LPSECURITY_ATTRIBUTES,
 DWORD                ,
 DWORD                ,
 HANDLE               
 );

CRETEFILEW dwCreateFileWAddr = 0
; //msdn的搬運工T_T // HANDLE WINAPI CreateFile( // _In_ LPCTSTR lpFileName, // _In_ DWORD dwDesiredAccess, // _In_ DWORD dwShareMode, // _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
// _In_ DWORD dwCreationDisposition, // _In_ DWORD dwFlagsAndAttributes, // _In_opt_ HANDLE hTemplateFile // ); //fake func replace the one above HANDLE WINAPI myCreateFile( _In_ LPCTSTR lpFileName, _In_ DWORD dwDesiredAccess, _In_ DWORD dwShareMode, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _In_ DWORD dwCreationDisposition, _In_ DWORD dwFlagsAndAttributes, _In_opt_ HANDLE hTemplateFile ) { WCHAR wFileName[MAX_PATH] ={0
}; wcscpy(wFileName,lpFileName); if (wcscmp(wcslwr(wFileName),L"c:\\test.txt")==0) { if (MessageBoxW(NULL,L"OPEN FILE?",L"NOTICE",MB_YESNO)==IDYES) { return dwCreateFileWAddr( //為什麼沒有用createFileW,而使用的是dwCreateFile呢,因為iat已經被劫持了,否則就成了遞迴,永遠到不了真正的實現了。 lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile ); } else { return INVALID_HANDLE_VALUE; } } else { return dwCreateFileWAddr( lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile ); } } VOID HookNotePadIAT() { //get iid_addr HMODULE notepad_module = GetModuleHandleA(NULL); PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)notepad_module; PIMAGE_NT_HEADERS pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)notepad_module+pDosHeader->e_lfanew); DWORD RVA_FirstIID = pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; PIMAGE_IMPORT_DESCRIPTOR pIID=(PIMAGE_IMPORT_DESCRIPTOR)((DWORD)notepad_module+RVA_FirstIID); //PIMAGE_IMPORT_DESCRIPTOR pIIDtemp =pIID; //real addr of "CreateFileW" HMODULE handle=LoadLibraryA("kernel32.dll"); DWORD dwFuncAddr = (DWORD)GetProcAddress(handle,"CreateFileW"); //find the IID remains 'kernel32.dll' BOOL isExist = FALSE; while (pIID->Name) { char* dllname=(char*)(pIID->Name+(DWORD)notepad_module); char szName[MAXBYTE]={0}; strcpy(szName,dllname); if (strcmp(strlwr(szName),"kernel32.dll")==0) //wrong here KERNEL32.dll { isExist = TRUE; break; } pIID++; } //check the iat addr is right ? if (isExist==TRUE) { isExist= FALSE; PIMAGE_THUNK_DATA pIAT=(PIMAGE_THUNK_DATA)(pIID->FirstThunk+(DWORD)notepad_module); //forget the baseimage... while (pIAT->u1.Function) { DWORD* pAddr=(DWORD*)(&pIAT->u1.Function); //get IAT addr if (*pAddr == dwFuncAddr) //check contents of iat if right. { printf("isExist\n"); isExist=TRUE; dwCreateFileWAddr = (CRETEFILEW)*pAddr; //real addr. DWORD dwMyHookAddr = (DWORD) myCreateFile; WriteProcessMemory(GetCurrentProcess(),(LPVOID)pAddr,&dwMyHookAddr,sizeof(DWORD),NULL); //replace the iat content break; } pIAT++; } } } BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: HookNotePadIAT(); break; } return TRUE; }

編碼說明

上述程式碼原理:
1. 首先找到第一個IID的地址,用pIID 來儲存。
2. 遍歷IID,通過查詢name欄位 ,來確定程式中目標函式所在的DLL在匯入表中,找到的IID指標用pIID來表示。
3. 用動態呼叫的方式得到目標函式的地址,儲存為dwFuncAddr
4. 讀取PIID 指向的IAT表,檢查IAT表中的內容和動態獲取的地址是否一致。
5. 記憶體中替換,寫入偽造的函式地址。

注意

  • 在惡意函式中,有時候必須要實現被掛鉤函式的功能。在inlineHook 中,通過unhook操作來恢復記憶體。而在IAT掛鉤中,首先儲存了原來的函式入口地址。不管使用什麼方式掛鉤,原來的內容一定要通過一個變數儲存下來。

  • 編譯與執行過程出現的問題:

    1. 在查詢IID的時候, if (strcmp(strlwr(szName),"kernel32.dll")==0) //wrong here KERNEL32.dll 之前沒有轉小寫,除錯後發現kernel32.dll為KERNEL32.dll
    2. while (pIAT->u1.Function) 測試錯誤,除錯之後發現問題是pIAT 忘了沒有加基址,FirstThunk 是個RVA
    3. 不同型別的指標在使用時一定需要轉化,一般而言,函式指標在賦值的時候必須轉化。
    4. DLL主函式中:case不一定要全寫,本例中就寫了一個目標訊息DLL_PROCESS_ATTACH 這也是可以的。

證明

開啟notepad.exe後用dlljector.exe注入此程序

C:\Documents and Settings\Administrator\桌面>DLLInjector.exe C:\VC6\MyProjects\i
atHook_dll\Debug\iatHook_dll.dll 456

有意思的是選中檔案的時候也會呼叫CreateFileW.
選中檔案的時候也有
彈窗選擇否之後,返回INVALID_HANDLE_VALUE ,也即開啟失敗。
選擇否的時候不能正確開啟

相關推薦

HOOK鉤子技術3 IATHook

原理 如果程式中使用了靜態連結庫檔案,那麼PE檔案中就會有關於這些函式的匯入表的存在,程式通過呼叫IAT表來定位函式地址從而實現呼叫。如果將這些已經確定好的函式地址給替換成為惡意函式地址,那麼就會欺騙 程式執行惡意函式。 編碼測試 IDE:

HOOK鉤子技術2 內聯鉤子Inline HOOK 通過DLL注入

dll注入很有意思,它最大的優勢在於一旦這個dll被注入,就可以訪問宿主程式整個記憶體空間。因此直接的操作dll是可以達到間接操作目標宿主程式的作用。 這次繼續使用CILHook類,不過這次是在目標程式內使用,而不是像1一樣自己跟自己玩。建立一個windows

gitlab根據hook鉤子自動化部署

id_rsa brush pub nbsp 地址 指定 服務 是否 添加 原理是: 在gitlab中項目設置,hook->提交觸發指定地址,服務器收到請求,通過驗證後,在項目中執行git pull更新服務器中代碼 註意事項: 1.gitlab中要設置s

callback回撥函式和hook鉤子函式的簡單理解

回撥函式callback:所呼叫函式執行完,之後呼叫的函式 鉤子函式hook:訊息到達目的地之前,進行攔截,處理訊息 簡單理解: Scrapy中就有使用: 回撥函式,Request執行完下載流程之後,呼叫parse函式來解析頁面 Request(url, callback=s

HOOK鉤子 - 鉤子函式說明

    通過SetWindowsHookEx方法安裝鉤子,該函式指定處理攔截訊息的鉤子函式(回撥函式),可在鉤子函式中自定義訊息的處理,可修改訊息或遮蔽訊息。鉤子函式的格式是固定為: LRESULT CALLBACK CallBackProc(   

4.3 併發技術3:管道通訊

channel 介紹 channel 提供了一種通訊機制,通過它,一個 goroutine 可以想另一 goroutine 傳送訊息。channel 本身還需關聯了一個型別,也就是 channel 可以傳送資料的型別。例如: 傳送 int 型別訊息的 chan

java加密解密技術(3)對稱加密AES

import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; imp

原 4.3-2 併發技術3:定時器

定時器概述 Go為我們提供了兩種不同方式的計時器: 定時執行任務的計時器 週期性執行任務的計時器 固定時間定時器 下面的例子演示瞭如何使用定時器延時2秒執行一項任務 func main() { /

Web技術3:Cookie與Session

Session與Cookie Session與Cookie的作用都是為了保持訪問使用者與後端伺服器的互動狀態。各有優點也各有缺點。 Cokkie 當一個使用者通過HTTP訪問一個伺服器時,這個伺服器會講一些key/value鍵值對返回給客戶端瀏覽器,並給這些資料

併發技術3:定時器

定時器概述 Go為我們提供了兩種不同方式的計時器: 定時執行任務的計時器 週期性執行任務的計時器 固定時間定時器 下面的例子演示瞭如何使用定時器延時2秒執行一項任務 func main() { /

併發技術3:管道通訊

#channel 介紹 channel 提供了一種通訊機制,通過它,一個 goroutine 可以想另一 goroutine 傳送訊息。channel 本身還需關聯了一個型別,也就是 channel 可以傳送資料的型別。例如: 傳送 int 型別訊息的 chan

WordPress 插件機制的簡單用法和原理(Hook 鉤子

原理 pre 事情 回調函數 subject http 參與 quest 的人 WordPress 的插件機制實際上只的就是這個 Hook 了,它中文被翻譯成鉤子,允許你參與 WordPress 核心的運行,是一個非常棒的東西,下面我們來詳細了解一下它。 PS:本文只是簡單

WordPress 外掛機制的簡單用法和原理(Hook 鉤子

WordPress 的外掛機制實際上只的就是這個 Hook 了,它中文被翻譯成鉤子,允許你參與 WordPress 核心的執行,是一個非常棒的東西,下面我們來詳細瞭解一下它。 PS:本文只是簡單的總結一下,更多用法還是要參考文中給出的函式。 鉤子分類鉤子分為兩種,一種叫做動作(action),還有一種叫做

爬蟲的一些知識點 目錄 1. 網路爬蟲 1 2. 產生背景 垂直領域搜尋引擎 2 3. 1 聚焦爬蟲工作原理以及關鍵技術概述 3 4. 涉及技術 3 4.1. 下載網頁 一般是通過net api

爬蟲的一些知識點   目錄 1. 網路爬蟲 1 2. 產生背景 垂直領域搜尋引擎 2 3. 1 聚焦爬蟲工作原理以及關鍵技術概述 3 4. 涉及技術 3 4.1. 下載網頁  一般是通過net api 3 4.2. 分析網頁(html分析

C++鉤子技術,攔截帶有某些關鍵字的窗體

這次想寫一篇,自己曾經做過的一個Hook程式,溫故而知新。 作為一個C++程式設計師,肯定對鉤子(Hook)技術有所瞭解:訊息鉤子,API鉤子。 基本概念:     鉤子(Hook),是Windows訊息處理機制的一個平臺,應用程式可以在上面設定子程以監視指定視窗的某種

C++ Hook(鉤子)程式設計,通過內聯彙編,使類成員函式代替全域性函式(靜態函式)

程式語言:C/C++ 編譯環境:Visual Studio 2008 核心方法::通過內聯彙編,構造類物件獨享的函式(委託),完成了類成員函式到普通全域性函式的轉化,並在Windows Hook(鉤子)程式設計中得到成功的實踐。 關鍵字:C++,委託,內聯彙編,Hook,成

HOOK鉤子機制

最近在看一些程式設計相關的書籍和資料,知識碰見了,就想把它記下來,以便日後能用的上,也可能只是淺顯的概念!可能有錯,但是有值得參考的地方,慢慢充電吧!        一、理解:鉤子,顧名思義就是鉤東西的,來一個比喻吧。當我們在釣魚的時候,只要你扔出有誘餌的魚鉤(設定執行緒鉤

Delphi中通過鉤子技術實現鍵盤監控

鉤子概述:      鉤子是Windows中訊息處理機制的一個要點,通過安裝各種鉤子,應用程式能夠設定相應的例程來監視系統裡的訊息傳遞以及在這些訊息到達目標視窗應用程式之間處理它們。鉤子的分類:           鉤子可以分為執行緒鉤子和全域性鉤子,執行緒專用鉤子只是監視指

Delphi2010中DataSnap高階技術(3)—DataSnap伺服器如何得到客戶端的IP和埠

作為一個伺服器軟體,必須做到對客戶端強有力的控制,想要控制,就必須得到客戶端的網路基本資訊,比如客戶端IP和埠。有了客戶端IP就能隨心所欲操控客戶端,比如終止某些客戶端的連線、限制功能等等。 在delphi2010中的datasnap伺服器如何獲得客戶端ip,的確花了我點時

git碼雲配置web hook鉤子實現自動部署,git許可權等問題,LAMP

由於部落格搬家,我的部落格將在: 懶惰的夜貓子  上釋出 點選下方連結即檢視: __________________________________________________________________ 這幾天用git的時候就看到git有一個非