青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉,開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

Windows下Hook API技術 inline hook

Posted on 2010-07-02 08:20 S.l.e!ep.¢% 閱讀(1570) 評論(0)  編輯 收藏 引用 所屬分類: RootKit

? Windows下Hook API技術 inline hook 收藏

? 什么叫Hook API?所謂Hook就是鉤子的意思,而API是指 Windows開放給程序員的編程接口,使得在用戶級別下可以對操作系統進行控制,也就是一般的應用程序都需要調用API來完成某些功能, Hook API的意思就是在這些應用程序調用真正的系統API前可以先被截獲,從而進行一些處理再調用真正的API來完成功能。在講Hook API之 前先來看一下如何Hook消息,例如Hook全局鍵盤消息,從而可以知道用戶按了哪些鍵,這種Hook消息的功能可以由以下函數來完成,該函數將一個新的 Hook加入到原來的Hook鏈中,當某一消息到達后會依次經過它的Hook鏈再交給應用程序。HHOOK SetWindowsHookEx(
???? int idHook,????????????????????? //Hook類型,例如WH_KEYBOARD,WH_MOUSE
???? HOOKPROC lpfn,????????????? //Hook處理過程函數的地址
???? HINSTANCE hMod,?????????? //包含Hook處理過程函數的dll句柄(若在本進程可以為NULL)
???? DWORD dwThreadId,????? //要Hook的線程ID,若為0,表示全局Hook所有
);???? 這里需要提一下的就是如果是Hook全局的而不是某個特定的進程則需要將Hook過程編寫為一個DLL,以便讓任何程序都可以加載它來獲取Hook過程函 數。???? 而對于Hook API微軟并沒有提供直接的接口函數,也許它并不想讓我們這樣做, 不過有2種方法可以完成該功能。第一種,修改可執行文件的IAT表(即輸入表),因為在該表中記錄了所有調用API的函數地址,則只需將這些地址改為自己 函數的地址即可,但是這樣有一個局限,因為有的程序會加殼,這樣會隱藏真實的IAT表,從而使該方法失效。第二種方法是直接跳轉,改變API函數的頭幾個 字節,使程序跳轉到自己的函數,然后恢復API開頭的幾個字節,在調用AP完成功能后再改回來又能繼續Hook了,但是這種方法也有一個問題就是同步的問 題,當然這是可以克服的,并且該方法不受程序加殼的限制。???? 下面將以一個Hook指定程序send函數的例子來詳細描述如何Hook API,以達到監視程序發送的每個封包的目的。采用的是第二種方法,編寫為一個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個字節
DWORD g_dwOldBytes[2][2] = { 0x0, 0x0, 0x0, 0x0 };
// 鉤子句柄
HHOOK??? g_hOldHook = NULL;
//API中send函數的地址
DWORD g_pSend = 0;
//事務,解決同步問題
HANDLE g_hSendEvent = NULL;//自己的send函數地址,參數必須與API的send函數地址相同int _stdcall hook_send( SOCKET s, const char *buf, int len, int flags );//要Hook的進程和主線程ID號DWORD g_dwProcessID = 0;
DWORD g_dwThreadID = 0;???? 從聲明可以看出,我們會把API函數的首8個字節改為 mov eax, 00400000;jmp eax ,使程序能夠跳轉,只需獲取我們自己的函數 地址填充掉00400000即可實現跳轉。而g_dwOldBytes是用來保存API開頭原始的8個字節,在真正執行API函數是需要寫回。還有一點, 在聲明新的函數時,該例中為hook_send,除了保正參數與API的一致外,還需要聲明為__stdcall類型,表示函數在退出前自己來清理堆棧, 因為這里是直接跳轉到新函數處,所以必須自己清理堆棧。下面看主函數,BOOL APIENTRY DllMain( HANDLE hModule,
??????????????????????????????????? DWORD?? ul_reason_for_call,
??????????????????????????????????? LPVOID lpReserved
????????????????????????????????? )
{
???? if(ul_reason_for_call == DLL_PROCESS_ATTACH)
??? {?????? //獲取本dll句柄
?????? g_hInstance = hModule;???????????? //創建事務
?????? g_hSendEvent = CreateEvent( NULL, FALSE, TRUE, NULL );
?????
?????? //重寫API開頭的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改寫為我們函數的地址
?????? *( 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函數,在被指定的程序加載的時候會自動運行dll的main函數來完成初始化,這里就是改寫API的首地址來完成跳轉。當然本程序 是對于指定程序進行Hook,如果要進行全局Hook,可以在main函數中用GetModuleFileName函數來獲取exe文件完整路徑,判斷當 前進程是否是想要Hook的進程。寫函數中使用INVALID_HANDLE_VALUE,表示寫本進程。int _stdcall hook_send( SOCKET s, const char *buf, int len, int flags )
{
??? int nRet;??? WaitForSingleObject( g_hSendEvent, INFINITE );????? //恢復API頭8個字節
??? WriteProcessMemory( INVALID_HANDLE_VALUE, ( void* )g_pSend,
?????? ( void* )g_dwOldBytes[0], sizeof( DWORD )*2, NULL );??? /*??? 這里可以添加想要進行的處理過程??? */??? //真正執行API函數
??? nRet = send( s, buf, len, flags );??? //寫入跳轉語句,繼續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)
{???? //通過傳入的窗口句柄獲取線程句柄
???? g_dwThreadID = GetWindowThreadProcessId( hWnd, &g_dwProcessID );???? //WH_CALLWNDPROC類型的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;??????? //改變頁面屬性為讀寫
??????? VirtualProtectEx( hProcess, ( void* )g_pSend, 8, PAGE_READWRITE, &dwOldProc );??????? //恢復API的首8個字節
??????? WriteProcessMemory( hProcess, ( void* )g_pSend,
???????????? ( void* )g_dwOldBytes[0], sizeof( DWORD )*2, NULL );??????? //恢復頁面文件的屬性
??????? VirtualProtectEx( hProcess, ( void* )g_pSend, 8, dwOldProc, &dwNewProc );
?
??????? CloseHandle(g_hSendEvent);
?
??????? UnhookWindowsHookEx( g_hOldHook );
???? }
}??? 可以看出,我們創建的Hook類型是WH_CALLWNDPROC類型,該類型的Hook在進程與系統一通信時就會被加載到進程空間,從而調用dll的 main函數完成真正的Hook,而在SetWindowsHookEx函數中指定的HookProc函數將不作任何處理,只是調用 CallNextHookEx將消息交給Hook鏈中下一個環節處理,因為這里SetWindowsHookEx的唯一作用就是讓進程加載我們的 dll。???? 以上就是一個最簡單的Hook API的例子,該種技術可以完成許多功能。例如網游外掛制作過程中截取發送的與收到的封包即可使用該方法,或者也可以在 Hook到API后加入木馬功能,反向連接指定的主機或者監聽某一端口,還有許多加殼也是用該原理來隱藏IAT表,填入自己的函數地址。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            99精品视频免费观看| 国产精品日本| 亚洲午夜精品国产| 亚洲综合色婷婷| 亚洲欧美日本国产有色| 亚洲欧美日韩另类| 久久精品青青大伊人av| 久久久另类综合| 欧美电影专区| 国产精品久久久久久久久借妻| 国产精品porn| 国产一区999| 亚洲国产精选| 夜夜嗨av一区二区三区四区| 亚洲一区二三| 久久精品视频在线| 亚洲福利专区| 亚洲日本aⅴ片在线观看香蕉| 99精品福利视频| 亚洲欧美一区二区激情| 久久久亚洲欧洲日产国码αv | 欧美成人免费视频| 99v久久综合狠狠综合久久| 一区二区三区免费观看| 亚洲在线视频一区| 你懂的国产精品永久在线| 国产精品国产精品| 亚洲国产你懂的| 午夜精品影院在线观看| 亚洲成色www8888| 亚洲欧美日韩在线一区| 欧美激情第9页| 国内精品伊人久久久久av一坑| 一本大道久久a久久综合婷婷| 久久不射网站| 99在线热播精品免费99热| 久久久久久久久久看片| 国产精品美女久久| 亚洲精品久久久久久一区二区| 欧美亚洲一区| 亚洲美女性视频| 欧美va亚洲va日韩∨a综合色| 国产精品爽黄69| 亚洲天堂激情| 亚洲东热激情| 久久天天躁夜夜躁狠狠躁2022| 国产精品免费久久久久久| 一本到12不卡视频在线dvd| 国精品一区二区| 欧美精品国产一区| 1204国产成人精品视频| 久久精品国产在热久久| 亚洲午夜一区| 国产精品久久久久999| 一区二区激情小说| 亚洲国产婷婷| 欧美成人在线免费视频| 亚洲欧洲在线观看| 欧美激情精品久久久| 久久综合五月天婷婷伊人| 一区福利视频| 欧美xx视频| 久久久久国产免费免费| 在线观看视频日韩| 欧美激情亚洲另类| 美女精品国产| 亚洲免费福利视频| 99精品欧美一区二区三区综合在线| 欧美日韩二区三区| 亚洲资源在线观看| 亚洲在线播放| 国产日韩欧美精品在线| 美女黄网久久| 欧美成人小视频| 一区二区三区免费网站| 亚洲午夜在线观看| 国产视频久久网| 免费久久精品视频| 欧美激情第8页| 午夜精品久久99蜜桃的功能介绍| 亚洲图片欧洲图片av| 国产亚洲美州欧州综合国| 久久综合中文字幕| 欧美欧美全黄| 欧美专区福利在线| 乱中年女人伦av一区二区| 夜夜嗨av色综合久久久综合网| 亚洲天堂网在线观看| 狠狠色噜噜狠狠色综合久| 欧美激情亚洲| 国产欧美日韩视频在线观看| 美女黄毛**国产精品啪啪| 欧美日韩国产在线播放| 久久成人免费| 欧美极品在线视频| 久久精彩免费视频| 欧美国产国产综合| 亚洲欧美日韩电影| 久热re这里精品视频在线6| 一区二区冒白浆视频| 欧美亚洲日本一区| 亚洲精品国产无天堂网2021| 亚洲一区二区三| 亚洲激情六月丁香| 性欧美videos另类喷潮| 亚洲免费久久| 欧美亚洲视频一区二区| 99视频+国产日韩欧美| 久久国内精品自在自线400部| 日韩亚洲欧美一区| 久久久蜜桃一区二区人| 国产精品久久一卡二卡| 亚洲人体大胆视频| 亚洲综合日韩| 日韩午夜高潮| 久久久一二三| 久久精品国产一区二区电影| 欧美日韩视频不卡| 亚洲福利av| 伊人伊人伊人久久| 欧美一区二区三区视频免费播放| 在线综合亚洲欧美在线视频| 猫咪成人在线观看| 狼人天天伊人久久| 国产麻豆精品视频| 亚洲视频福利| 亚洲一区二区在线免费观看视频 | 欧美视频网站| 亚洲国产一区二区三区青草影视| 国产亚洲a∨片在线观看| 亚洲一区二区三| 99精品国产福利在线观看免费 | 亚洲图中文字幕| 欧美日本在线视频| 亚洲精品孕妇| 亚洲美女诱惑| 欧美好骚综合网| 亚洲国产成人av好男人在线观看| 伊人夜夜躁av伊人久久| 久久综合久久综合九色| 蜜月aⅴ免费一区二区三区| 国内伊人久久久久久网站视频| 校园激情久久| 久久久欧美精品| 亚洲福利视频一区| 欧美jizz19性欧美| 亚洲裸体在线观看| 亚洲综合欧美日韩| 国产欧美亚洲精品| 久久激情五月激情| 欧美二区不卡| 日韩视频一区二区| 欧美体内she精视频在线观看| a4yy欧美一区二区三区| 欧美一级片在线播放| 国模吧视频一区| 免费中文字幕日韩欧美| 亚洲美女中文字幕| 久久国产精品久久久久久| 国产一区在线观看视频| 久热综合在线亚洲精品| 亚洲理论在线观看| 欧美在线视屏| 亚洲国产一区二区在线| 欧美日韩视频第一区| 欧美在线视频导航| 亚洲国产精品专区久久| 亚洲欧美一区二区精品久久久| 国产日韩在线一区二区三区| 开心色5月久久精品| 99精品福利视频| 乱码第一页成人| 亚洲一区二区免费| 精品不卡视频| 毛片基地黄久久久久久天堂| 久久久中精品2020中文| 亚洲精品乱码久久久久久| 亚洲欧美日本另类| 91久久精品视频| 国产精品影音先锋| 美日韩免费视频| 亚洲欧美日本在线| 亚洲欧洲综合另类| 欧美在线免费观看亚洲| 日韩亚洲综合在线| 在线观看欧美视频| 国产女主播一区| 欧美日韩在线视频一区| 久久久www成人免费无遮挡大片| 亚洲国产一区二区三区青草影视| 欧美中文字幕精品| 亚洲午夜免费视频| 日韩视频永久免费| 激情综合色综合久久| 国产精品羞羞答答| 欧美日韩国产小视频| 玖玖综合伊人| 久久精品国产v日韩v亚洲| 亚洲综合精品自拍| 正在播放日韩|