Detours 小試牛刀之攔截 API 函數(APIHook)

來源:互聯網
上載者:User

無意之中看到 Microsoft Research 裡面新出了好東西,Detours,開放原始碼,實現了攔截跨進程 API 函數等等功能,從它提供的常式來看,還支援 COM,DCOM 等等。。。以前 Hook API 非常麻煩,Win9X 下由於沒有公開的介面,各大廠商為了實現攔截API,使用了各種魔術代碼,對於外人來說,高深莫測。雖然 WinNT 平台相對容易一些,但是還是需要編寫大量的代碼,Detours 的出現,使得編寫一個最簡單的 Hook,只需要幾十行代碼。拿到 Detours,我最想知道它在
9X 下如何工作的,可惜最後發現,Detours 並不支援 9X。。。想來 9X 的時代已經遠去了,所以也不去計較了。
API Hook 有什麼用呢,比如字典軟體實現螢幕取詞,就是攔截 GDI 繪製文本的相關函數實現的,如果攔截註冊表,可以實現一個註冊表監視器。一些小說閱讀器加密了內容,使得複製文字出來非常困難,但是藉助於攔截 IE 核心的 HTML 解析函數,一切文本立刻現身,還可以動態調試第三方的庫,甚至偽造和欺騙程式調用。。。總之用途多多。。。

下面的圖顯示了 Detours 的調用關係:

粗略看了下原始碼,Detours 注入進程的基本原理是修改了目標進程的匯入表。

下面實際說說如何?,程式主要分為兩部分,一個做鉤子DLL,一個注入鉤子的主程式:
首先來看鉤子DLL:

程式碼#include "stdafx.h"
#include "DetourDll.h"

#include "detours.h"

#pragma comment(lib,"detours.lib")

int WINAPI CopyWriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);
DETOUR_TRAMPOLINE(int WINAPI CopyWriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped), WriteFile);
int WINAPI MyWriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped)
{
    CopyMessageBoxA(0, (LPCTSTR)lpBuffer, "hook", MB_OK);
    int nResult = CopyWriteFile(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped);    //調用原始函數
    return nResult;
}

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
            DetourFunctionWithTrampoline((PBYTE)CopyWriteFile, (PBYTE)MyWriteFile);
            break;
        case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
            break;
        case DLL_PROCESS_DETACH:
            DetourRemove((PBYTE)CopyWriteFile, (PBYTE)MyWriteFile);
            break;
    }
    return TRUE;
}

LRESULT WINAPI MsgProc(int code, WPARAM wParam, LPARAM lParam)
{
    //note :on windows 2k ,the 1st paramter to CallNextHookEx can be NULL
    //On win 98 ,it must be the hook handle
    return(CallNextHookEx(NULL,code,wParam,lParam));
}

在這裡,我們準備好要掛鈎的函數代碼,然後在DllMain裡面完成函數的替換就可以了。注意這個dll要匯出 MsgProc。
注入程式則非常簡單
使用 DetourCreateProcessWithDll() 代替 CreateProcess() 建立進程就可以了,當然也可以附加到進程,具體文檔中寫得很詳細,需要指出的是一些老的文章裡面提到的 DetourContinueProcessWithDll(),已經被 DetourCopyPayloadToProcess() 取代,不過這個我沒有試。
這個程式運行後,會攔截程式寫檔案的操作,並且告知寫入了什麼。比如記事本儲存檔案的時候就會觸發。

Detours 可以在
http://research.microsoft.com/en-us/projects/detours/ 下載。

最後還有個小問題沒有解決,Detours 如何攔截 stdcall 以外的函數調用,比如 fastcall 或者 nakedcall。。。期待高手解決了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.