欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Windows下HookAPI技術(shù)
Windows下Hook API技術(shù)
    什么叫Hook API?所謂Hook就是鉤子的意思,而API是指Windows開(kāi)放給程序員的編程接口,使得在用戶(hù)級別下可以對操作系統進(jìn)行控制,也就是一般的應用程 序都需要調用API來(lái)完成某些功能,Hook API的意思就是在這些應用程序調用真正的系統API前可以先被截獲,從而進(jìn)行一些處理再調用真正的API來(lái)完成功能。在講Hook API之前先來(lái)看一下如何Hook消息,例如Hook全局鍵盤(pán)消息,從而可以知道用戶(hù)按了哪些鍵,這種Hook消息的功能可以由以下函數來(lái)完成,該函數將 一個(gè)新的Hook加入到原來(lái)的Hook鏈中,當某一消息到達后會(huì )依次經(jīng)過(guò)它的Hook鏈再交給應用程序。
 
HHOOK SetWindowsHookEx(
    int idHook,                     //Hook類(lèi)型,例如WH_KEYBOARD,WH_MOUSE
    HOOKPROC lpfn,             //Hook處理過(guò)程函數的地址
    HINSTANCE hMod,          //包含Hook處理過(guò)程函數的dll句柄(若在本進(jìn)程可以為NULL)
    DWORD dwThreadId     //要Hook的線(xiàn)程ID,若為0,表示全局Hook所有
);
 
    這里需要提一下的就是如果是Hook全局的而不是某個(gè)特定的進(jìn)程則需要將Hook過(guò)程編寫(xiě)為一個(gè)DLL,以便讓任何程序都可以加載它來(lái)獲取Hook過(guò)程函數。
    而對于Hook API微軟并沒(méi)有提供直接的接口函數,也許它并不想讓我們這樣做
, 不過(guò)有2種方法可以完成該功能。第一種,修改可執行文件的IAT表(即輸入表),因為在該表中記錄了所有調用API的函數地址,則只需將這些地址改為自己 函數的地址即可,但是這樣有一個(gè)局限,因為有的程序會(huì )加殼,這樣會(huì )隱藏真實(shí)的IAT表,從而使該方法失效。第二種方法是直接跳轉,改變API函數的頭幾個(gè) 字節,使程序跳轉到自己的函數,然后恢復API開(kāi)頭的幾個(gè)字節,在調用AP完成功能后再改回來(lái)又能繼續Hook了,但是這種方法也有一個(gè)問(wèn)題就是同步的問(wèn) 題,當然這是可以克服的,并且該方法不受程序加殼的限制。
    下面將以一個(gè)Hook指定程序send函數的例子來(lái)詳細描述如何Hook API,以達到監視程序發(fā)送的每個(gè)封包的目的。采用的是第二種方法,編寫(xiě)為一個(gè)dll。首先是一些全局聲明,
 
//本dll的handle
HANDLE g_hInstance = NULL;
//修改API入口為 mov eax, 00400000;jmp eax是程序能跳轉到自己的函數
BYTE g_btNewBytes[8] = { 0xB8, 0x0, 0x0, 0x40, 0x0, 0xFF, 0xE0, 0x0 };
//保存原API入口的8個(gè)字節
DWORD g_dwOldBytes[2][2] = { 0x0, 0x0, 0x0, 0x0 };
//鉤子句柄
HHOOK   g_hOldHook = NULL;
//API中send函數的地址
DWORD g_pSend = 0;
//事務(wù),解決同步問(wèn)題
HANDLE g_hSendEvent = NULL;
//自己的send函數地址,參數必須與API的send函數地址相同
int _stdcall hook_send( SOCKET s, const char *buf, int len, int flags );
//要Hook的進(jìn)程和主線(xiàn)程ID號
DWORD g_dwProcessID = 0;
DWORD g_dwThreadID = 0;
 
    從聲明可以看出,我們會(huì )把API函數的首8個(gè)字節改為 mov eax, 00400000;jmp eax ,使程序能夠跳轉,只需獲取我們自己的函數地址填充掉00400000即可實(shí)現跳轉。而g_dwOldBytes是用來(lái)保存API開(kāi)頭原始的8個(gè)字節,在 真正執行API函數是需要寫(xiě)回。還有一點(diǎn),在聲明新的函數時(shí),該例中為hook_send,除了保正參數與API的一致外,還需要聲明為 __stdcall類(lèi)型,表示函數在退出前自己來(lái)清理堆棧,因為這里是直接跳轉到新函數處,所以必須自己清理堆棧。下面看主函數,
 
BOOL APIENTRY DllMain( HANDLE hModule,
                                   DWORD  ul_reason_for_call, 
                                   LPVOID lpReserved
                                 )
{
    if(ul_reason_for_call == DLL_PROCESS_ATTACH)
   {
      //獲取本dll句柄
      g_hInstance = hModule;
     
      //創(chuàng )建事務(wù)
      g_hSendEvent = CreateEvent( NULL, FALSE, TRUE, NULL );
     
      //重寫(xiě)API開(kāi)頭的8字節
      HMODULE hWsock = LoadLibrary( "wsock32.dll" );
      g_pSend = ( DWORD )GetProcAddress( hWsock, "send" );
 
      //保存原始字節
      ReadProcessMemory( INVALID_HANDLE_VALUE, ( void * )g_pSend,
          ( void * )g_dwOldBytes[0], sizeof( DWORD )*2, NULL );
      //將00400000改寫(xiě)為我們函數的地址
      *( DWORD* )( g_btNewBytes + 1 ) = ( DWORD )hook_send;
      WriteProcessMemory( INVALID_HANDLE_VALUE, ( void * )g_pSend,
          ( void * )g_btNewBytes, sizeof( DWORD )*2, NULL );
    }
    return TRUE;
}
 
    以上是dll的main函數,在被指定的程序加載的時(shí)候會(huì )自動(dòng)運行dll的main函數來(lái)完成初始化,這里就是改寫(xiě)API的首地址來(lái)完成跳轉。當然本程序 是對于指定程序進(jìn)行Hook,如果要進(jìn)行全局Hook,可以在main函數中用GetModuleFileName函數來(lái)獲取exe文件完整路徑,判斷當 前進(jìn)程是否是想要Hook的進(jìn)程。寫(xiě)函數中使用INVALID_HANDLE_VALUE,表示寫(xiě)本進(jìn)程。
 
int _stdcall hook_send( SOCKET s, const char *buf, int len, int flags )
{
   int nRet;
   WaitForSingleObject( g_hSendEvent, INFINITE );
 
   //恢復API頭8個(gè)字節
   WriteProcessMemory( INVALID_HANDLE_VALUE, ( void* )g_pSend,
      ( void* )g_dwOldBytes[0], sizeof( DWORD )*2, NULL );
 
   /*
   這里可以添加想要進(jìn)行的處理過(guò)程
   */
 
   //真正執行API函數
   nRet = send( s, buf, len, flags );
 
   //寫(xiě)入跳轉語(yǔ)句,繼續Hook
   WriteProcessMemory( INVALID_HANDLE_VALUE, ( void* )g_pSend,
      ( void* )g_btNewBytes, sizeof( DWORD )*2, NULL );
 
   SetEvent( g_hSendEvent );
 
   return nRet;
}
 
HOOK_API BOOL StartHook(HWND hWnd)
{
    //通過(guò)傳入的窗口句柄獲取線(xiàn)程句柄
    g_dwThreadID = GetWindowThreadProcessId( hWnd, &g_dwProcessID );
 
    //WH_CALLWNDPROC類(lèi)型的Hook
    g_hOldHook = SetWindowsHookEx( WH_CALLWNDPROC,  HookProc,  
        ( HINSTANCE ) g_hInstance, g_dwThreadID );

    if( g_hOldHook == NULL )
        return FALSE;

    return TRUE;
}
 
static LRESULT WINAPI HookProc( int nCode, WPARAM wParam, LPARAM lParam )
{

 return CallNextHookEx( g_hOldHook, nCode, wParam, lParam );
}
 
HOOK_API void StopHook(void)
{
   if(g_hOldHook != NULL)
   {
       WaitForSingleObject( g_hSendEvent, INFINITE );

       HANDLE hProcess = NULL;
       hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, g_dwProcessID);

       DWORD dwOldProc;
       DWORD dwNewProc;
 
       //改變頁(yè)面屬性為讀寫(xiě)
       VirtualProtectEx( hProcess, ( void* )g_pSend, 8, PAGE_READWRITE, &dwOldProc );
 
       //恢復API的首8個(gè)字節
       WriteProcessMemory( hProcess, ( void* )g_pSend,
            ( void* )g_dwOldBytes[0], sizeof( DWORD )*2, NULL );
 
       //恢復頁(yè)面文件的屬性
       VirtualProtectEx( hProcess, ( void* )g_pSend, 8, dwOldProc, &dwNewProc );
  
       CloseHandle(g_hSendEvent);
  
       UnhookWindowsHookEx( g_hOldHook );
    }
}
 
   可以看出,我們創(chuàng )建的Hook類(lèi)型是WH_CALLWNDPROC類(lèi)型,該類(lèi)型的Hook在進(jìn)程與系統一通信時(shí)就會(huì )被加載到進(jìn)程空間,從而調用dll的 main函數完成真正的Hook,而在SetWindowsHookEx函數中指定的HookProc函數將不作任何處理,只是調用 CallNextHookEx將消息交給Hook鏈中下一個(gè)環(huán)節處理,因為這里SetWindowsHookEx的唯一作用就是讓進(jìn)程加載我們的dll。
    以上就是一個(gè)最簡(jiǎn)單的Hook API的例子,該種技術(shù)可以完成許多功能。例如網(wǎng)游外掛制作過(guò)程中截取發(fā)送的與收到的封包即可使用該方法,或者也可以在Hook到API后加入木馬功能, 反向連接指定的主機或者監聽(tīng)某一端口,還有許多加殼也是用該原理來(lái)隱藏IAT表,填入自己的函數地址。
 
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
教大家恢復應用層鉤子(恢復HOOK API)(附代碼)
API HOOK完全手冊
window HOOK技術(shù)NowCode
HOOK API——Windows核心編程 第22章 插入DLL和掛接API學(xué)習筆記
Ring3下Hook API實(shí)現分析
DLL依賴(lài)查看神奇CFF Explorer
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久