亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Windows下的函數hook技術

2019-11-17 05:09:40
字體:
來源:轉載
供稿:網友

  都是很成熟的東西了,這幾天看了看,總結一下而已。
討論了Windows下hook函數的幾種方法。提供了一個hook TextOutA的完整例子。通過CreateRemoteThread的方法把hook dll注入到一個普通的應用程序中。Hooking Imported Functions by name調用imported functions'時的步驟/實現
在程序中調用從其它模塊引入的函數的方法和普通的函數調用有所不同。對于普通的函數調用,直接使用
call address來調用即可,但是對于
imported functions
,在編譯的時候
compiler/link
并不知道實際的函數實現會被加載到那個地址,函數實現在那個地址在運行的時候才會確定。對于
imported functions
,首先是
call
引入表中的一個函數,在運行時再初始化引入表,使用
jmp
跳轉到真實的函數實現。

引入表:
The PE file IMAGE_IMPORT_DESCRipTORstrUCture, which holds all the information about functions imported from a specific DLL, has pointers to two arrays in the executable. These arrays are called import address tables (IATs), or sometimes thunk data arrays. The first pointer references the real IAT, which the PRogram loader fixes up when the executable is loaded. The second pointer references the original IAT, which is untouched by the loader and lists the imported functions.

實現原理
  • 找到
    PE
    文件的
    Image_Import_Descriptor
    結構
  • 找到
    Original LAT

    Real LAT.
  • 通過要
    hook
    的函數的名字在
    Original LAT
    找到要
    hook

    imported function
    在數組中的
    index.
  • 保存并修改
    Real LAT
    在相應
    index

    function address
(refer to John Robbins, BugsLayerUtil.dll)

Hooking Imported Functions by ordinal

原理和
Hook Imported functions by name
一樣,只是是通過要
hook
的函數的
ordinal

original LAT
中找到
index.

Hooking a function in this dll

當一個
DLL
是通過
LoadLibrary
載入的時候,我們無法通過
hook imported function
的方法的
hook
它中的
function
。有兩種可能的辦法處理這種情況:
第一種方法,遍歷進程空間,發現
call
指定函數的地方替換為
call hookFunction.
太麻煩,而且不安全。


第二種方法,改寫要
hook
的函數
FuncA
。比較好的方法
  1. 實現
    HookFuncA
    ,最后的實現墊入
    n

    nop.
  2. 找到要
    hook
    的函數
    FuncA
    的絕對地址,改寫前
    5
    個字節為
    jmp hookFuncA(
    假定前
    5
    個字節為
    n
    個完整的指令
    )

  3. FuncA
    的前
    5
    個字節拷貝到
    hookFuncA
    的后面,在加上一條指令jmp funcA+5.
    ----Code of HookDLL.dll, 可以通過CreateRemoteThread的方法把hook dll注入到一個普通的應用程序中。
    // HookDLL.cpp : Defines the entry point for the DLL application.
    //
    #include "stdafx.h"
    #include "HookDLL.h"
    #include "Log.h"
    //forward declare.
    LRESULT WINAPI InstallTextoutHook();
    LRESULT WINAPI UninstallTextoutHook();
    BOOL APIENTRY DllMain( HANDLE hModule,
    DWord ul_reason_for_call,
    LPVOID lpReserved
    )
    {
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    if (InstallTextoutHook())
    {
    WriteLog("Install hook success./n");
    }else
    {
    WriteLog("Intall hook failed./n");
    }
    break;
    case DLL_THREAD_ATTACH:
    break;
    case DLL_THREAD_DETACH:
    break;
    case DLL_PROCESS_DETACH:
    if (UninstallTextoutHook())
    {
    WriteLog("Uninstall hook success./n");
    }else
    {
    WriteLog("Unintall hook failed./n");
    }
    break;
    }
    return TRUE;
    }
    #define DWORD_PTR DWORD*
    #define __LOCAL_SIZE 40h
    #define NAKED_PROLOG() /
    DWORD_PTR dwRet ; /
    DWORD_PTR dwESI ; /
    { /
    __asm PUSH EBP /* Set up the standard frame.*//
    __asm MOV EBP , ESP /
    __asm SUB ESP , __LOCAL_SIZE /* Save room for the local *//
    /* variables. *//
    __asm MOV EAX , EBP /* EBP has the stack coming *//
    /* into the fn. in it. *//
    __asm ADD EAX , 4 /* Account for PUSH EBP *//
    __asm MOV EAX , [EAX] /* Get return address. *//
    __asm MOV [dwRet] , EAX /* Save return address. *//
    __asm MOV [dwESI] , ESI /* Save ESI so chkesp in dbg *//
    /* builds works. *//
    }// The common epilog part that can be shared between the stdcall and
    // cdecl hook functions.
    #define EPILOG_COMMON() /
    { /
    __asm MOV ESI , [dwESI] /* Restore ESI. *//

    __asm ADD ESP , __LOCAL_SIZE /* Take away local var space *//
    __asm MOV ESP, EBP /* Restore standard frame. *//
    __asm POP EBP /
    }
    #define COPY_CODE_LENGTH 5
    BYTE g_abOriCode[COPY_CODE_LENGTH];
    BYTE g_abJmpCode[COPY_CODE_LENGTH];
    PROC g_oriTextout;
    BOOL g_blHooked = FALSE;
    LRESULT WINAPI InstallTextoutHook()
    {
    if (g_blHooked)
    return TRUE;
    //Get TextOutA's address.
    HMODULE hGdi32 = ::LoadLibrary(_T("Gdi32.dll"));
    g_oriTextout = GetProcAddress(hGdi32, _T("TextOutA"));
    if (NULL == g_oriTextout)
    return FALSE;
    //Get the hook'a address.
    HMODULE hModule = GetModuleHandle(_T("HookDLL.dll"));
    if (NULL == hModule)
    return FALSE;
    DWORD dwHookAddr = NULL;
    __asm
    {
    mov esi, offset HookLabel;
    mov edi, 0x10000000;//0x10000000 is the dll's base address.
    sub esi, edi;
    add esi, hModule;
    mov [dwHookAddr], esi;
    }
    //Get the NOP's address.
    DWORD dwNOPAddr = NULL;
    __asm
    {
    mov esi, offset NOPLabel;
    mov edi, 0x10000000;//0x10000000 is the dll's base address.
    sub esi, edi;
    add esi, hModule;
    mov [dwNOPAddr], esi;
    }
    //Save the first 5 byte of TextOutA to g_abOriCode
    __asm
    {
    mov esi, g_oriTextout;
    lea edi, g_abOriCode;
    cld;
    movsd;
    movsb;
    }
    //Generate the jmp Hook function.
    g_abJmpCode[0] = 0xe9;
    __asm
    {
    mov eax, dwHookAddr;
    mov ebx, g_oriTextout;
    add ebx, 5;
    sub eax, ebx;
    mov dword ptr[g_abJmpCode+1], eax;
    }
    //Write the jump instruction to the textoutA.
    DWORD dwProcessId = GetCurrentProcessId();
    HANDLE hProcess = OpenProcess (PROCESS_ALL_access,
    FALSE, dwProcessId);
    if (NULL == hProcess)
    return FALSE;
    DWORD dwOldFlag;
    VirtualProtectEx(hProcess, g_oriTextout, 5, PAGE_READWRITE, &dwOldFlag);
    WriteProcessMemory(hProcess, g_oriTextout, g_abJmpCode, sizeof(g_abJmpCode), NULL);
    VirtualProtectEx(hProcess, g_oriTextout, 5, dwOldFlag, NULL);
    //Write g_abOriTextout to the end of Hook function(NOP addr), then write the jmp instruction.
    VirtualProtectEx(hProcess, (LPVOID)dwNOPAddr, 10, PAGE_READWRITE, &dwOldFlag);
    WriteProcessMemory(hProcess, (LPVOID)dwNOPAddr, g_abOriCode, sizeof(g_abOriCode), NULL);
    //Generate the jmp TextoutA + 5
    __asm
    {
    mov eax, g_oriTextout;
    mov ebx, dwNOPAddr;
    add ebx, 5;
    sub eax, ebx;
    mov dword ptr[g_abJmpCode+1], eax;
    }
    WriteProcessMemory(hProcess, (LPVOID)(dwNOPAddr+5), g_abJmpCode, sizeof(g_abJmpCode), NULL);

    VirtualProtectEx(hProcess, (LPVOID)dwNOPAddr, 10, dwOldFlag, NULL);
    g_blHooked = TRUE;
    if(TRUE)
    return TRUE;
    HookLabel:
    NAKED_PROLOG ( ) ;
    int nx, ny;
    LPCSTR lp;
    lp = NULL;
    _asm
    {
    mov esi, ebp;
    add esi, 0Ch;
    lea edi, nx;
    movsd;
    lea edi, ny;
    movsd;

    lea edi, lp;
    movsd;
    }
    WriteLog_F("Try to ouput /"%s/" at (%d,%d)/n", lp, nx, ny);
    // Do the common epilog.
    EPILOG_COMMON ( ) ;
    NOPLabel:
    _asm NOP
    _asm NOP
    _asm NOP
    _asm NOP
    _asm NOP
    _asm NOP
    _asm NOP
    _asm NOP
    _asm NOP
    _asm NOP
    _asm NOP
    }
    LRESULT WINAPI UninstallTextoutHook()
    {
    if (!g_blHooked)
    return FALSE;
    //Restore the first 5 bytes code of TextOutA
    DWORD dwProcessId = GetCurrentProcessId();
    HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS,
    FALSE, dwProcessId);
    if (NULL == hProcess)
    return FALSE;
    DWORD dwOldFlag;
    VirtualProtectEx(hProcess, g_oriTextout, 5, PAGE_READWRITE, &dwOldFlag);
    WriteProcessMemory(hProcess, g_oriTextout, g_abOriCode, sizeof(g_abOriCode), NULL);
    VirtualProtectEx(hProcess, g_oriTextout, 5, dwOldFlag, NULL);
    g_blHooked = FALSE;
    return TRUE;
    }
更多文章 更多內容請看Windows操作系統安全集  Windows操作系統安裝  Windows頻道專題,或

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久99久久| 欧美日韩亚洲天堂| 国产拍精品一二三| 久久久久久国产精品美女| 成人性教育视频在线观看| 午夜精品久久久久久久99黑人| 国产999精品久久久| 亚洲精品456在线播放狼人| 国产亚洲美女精品久久久| 久久久久九九九九| 欧美裸体xxxx极品少妇软件| 亚洲精品视频免费在线观看| 国产精品美女av| 久久久久五月天| 国产精品自产拍高潮在线观看| 亚洲国产精品视频在线观看| 午夜精品久久久久久久99热| 日韩精品中文字幕在线观看| 国产精品xxxxx| 国产精品福利久久久| 亚洲护士老师的毛茸茸最新章节| 国产精欧美一区二区三区| 91色精品视频在线| 最近中文字幕日韩精品| 日韩成人在线视频观看| 日韩在线观看成人| 亚洲视频一区二区三区| 在线观看欧美日韩| 欧美性猛交xxxx乱大交| 欧美又大粗又爽又黄大片视频| 欧美日韩国产中文精品字幕自在自线| 奇米四色中文综合久久| 欧美亚洲成人网| 国产精品久久久久久av福利| 午夜精品一区二区三区在线视| 不卡av在线播放| 国产精品一区久久久| 亚洲福利精品在线| 亚洲福利影片在线| 日本午夜在线亚洲.国产| 这里只有视频精品| 最近的2019中文字幕免费一页| 亚洲欧美成人一区二区在线电影| 精品中文字幕乱| 91精品国产综合久久男男| 亚洲新声在线观看| 国产精品视频网站| 精品国产1区2区| 亚洲xxxx18| 精品视频久久久久久| 亚洲精品资源美女情侣酒店| 久久天天躁狠狠躁夜夜av| 日韩av成人在线观看| 亚洲国产精品久久久久久| 成人精品在线视频| 色偷偷噜噜噜亚洲男人的天堂| 日产精品99久久久久久| 国产一区二区欧美日韩| www.精品av.com| 久久色精品视频| 性欧美亚洲xxxx乳在线观看| 欧美精品在线播放| 亚洲色图50p| 中文字幕国产精品| 国产欧美韩国高清| 亚洲品质视频自拍网| 国产成人久久久精品一区| 97人人模人人爽人人喊中文字| 中文字幕在线国产精品| 亚洲欧美中文字幕在线一区| 亚洲视频在线免费观看| 国色天香2019中文字幕在线观看| 亚洲视频axxx| 久久精品视频在线观看| 亚洲第一精品夜夜躁人人爽| 久久91精品国产91久久跳| 日韩久久免费电影| 国内精品免费午夜毛片| 欧美性生交大片免费| 国产精品女主播| 欧美日韩国产激情| 另类色图亚洲色图| 亚洲sss综合天堂久久| 国产精品日韩在线一区| 亚洲国产日韩一区| 欧美中文字幕在线观看| 欧美另类交人妖| 黑人巨大精品欧美一区二区一视频| 亚洲美女免费精品视频在线观看| 中文字幕日韩在线播放| 亚洲资源在线看| 色yeye香蕉凹凸一区二区av| 亚洲人成人99网站| 91久久国产综合久久91精品网站| 国产精品直播网红| 亚洲欧美制服第一页| 国产免费观看久久黄| 欧美一性一乱一交一视频| 国产视频精品va久久久久久| 夜夜嗨av一区二区三区免费区| 色七七影院综合| 91免费视频网站| 国语自产精品视频在线看一大j8| 98精品国产高清在线xxxx天堂| 欧美激情奇米色| 成人精品一区二区三区电影黑人| 亚洲精品一区二区三区不| 精品视频久久久久久久| 国产精品一区二区三区在线播放| 亚洲欧美日本精品| 国产精品入口免费视| 欧美成人精品不卡视频在线观看| 国产视频欧美视频| 美日韩精品视频免费看| 久久成人综合视频| 尤物tv国产一区| 精品成人乱色一区二区| 精品久久在线播放| 成人高清视频观看www| 在线性视频日韩欧美| 久久视频中文字幕| 91夜夜未满十八勿入爽爽影院| 久久激情视频免费观看| 日韩毛片在线看| 欧美专区日韩视频| 久久精品青青大伊人av| 亚洲欧美另类国产| 国产香蕉97碰碰久久人人| 亚洲区bt下载| 日本成人精品在线| 精品视频在线观看日韩| 国产精品wwww| 欧美性20hd另类| 国产精品国产三级国产aⅴ9色| 亚洲精品久久久久久久久久久| 一区二区欧美亚洲| 精品人伦一区二区三区蜜桃网站| 色综合影院在线| 国产精品羞羞答答| 欧洲精品在线视频| 亚洲女成人图区| 亚洲在线观看视频网站| 欧美午夜视频一区二区| 成人午夜激情免费视频| 欧美亚洲另类在线| 96精品久久久久中文字幕| 亚洲国产欧美日韩精品| 国产精品一区二区三区在线播放| 欧美xxxx综合视频| 欧美日在线观看| 中文字幕亚洲情99在线| 亚洲女人天堂视频| 大桥未久av一区二区三区| 97视频在线观看播放| 亚洲精品国偷自产在线99热| 精品视频9999| 日韩免费在线观看视频| 国产精品91在线| 欧美在线观看视频| 亚洲丝袜av一区| 日韩免费在线电影| 欧美日韩在线第一页| 日产精品久久久一区二区福利| 性色av一区二区三区|