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

S.l.e!ep.¢%

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

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲永久免费观看| 国产精品户外野外| 在线一区亚洲| 亚洲无人区一区| 最新国产成人在线观看| 欧美性猛片xxxx免费看久爱 | 欧美成人激情在线| 欧美mv日韩mv亚洲| 欧美乱妇高清无乱码| 国产精品v欧美精品v日韩 | 久久久久久999| 另类激情亚洲| 亚洲三级电影在线观看| 99热免费精品| 香蕉国产精品偷在线观看不卡| 久久er精品视频| 欧美激情视频一区二区三区在线播放 | 久久亚洲综合| 欧美视频日韩| 在线播放不卡| 亚洲一区二区三区涩| 久久久最新网址| 亚洲日本国产| 久久久久成人网| 国产精品jizz在线观看美国| 国产一区二区三区观看| 亚洲日韩欧美视频| 久久精品免费看| 日韩视频不卡| 欧美91精品| 狠狠色噜噜狠狠色综合久| 亚洲自拍高清| 亚洲国产精品成人综合| 欧美一区三区三区高中清蜜桃| 欧美啪啪一区| 亚洲高清在线精品| 久久久91精品国产| 亚洲免费在线视频| 欧美天堂在线观看| 日韩视频在线你懂得| 麻豆精品精华液| 欧美亚洲日本一区| 国产精品久久一级| 亚洲午夜久久久久久久久电影网| 亚洲国产经典视频| 免费美女久久99| 亚洲第一黄色网| 久久人人97超碰精品888 | 亚洲一区二区三区四区在线观看| 男男成人高潮片免费网站| 国产一区二区视频在线观看| 亚洲欧美综合另类中字| 亚洲人精品午夜在线观看| 免费观看久久久4p| 韩国成人福利片在线播放| 性欧美暴力猛交69hd| 在线天堂一区av电影| 欧美日韩在线另类| 亚洲午夜精品视频| 亚洲一区二区av电影| 国产精品男gay被猛男狂揉视频| 在线综合欧美| 日韩网站免费观看| 欧美日韩另类字幕中文| 夜夜躁日日躁狠狠久久88av| 亚洲激情影视| 欧美日韩大片| 亚洲一区二区三区免费视频| 一本一本久久a久久精品综合妖精| 欧美日韩成人在线| 亚洲欧美一区二区精品久久久| 国产精品99久久久久久人| 国产精品―色哟哟| 久久精品亚洲一区| 久久免费精品日本久久中文字幕| 亚洲高清久久| 亚洲理论在线| 国产欧美日韩视频一区二区| 久久久久久久成人| 免费欧美高清视频| 在线综合亚洲| 欧美伊人精品成人久久综合97| 亚洲高清视频在线| 99在线热播精品免费99热| 国产精品www994| 久久亚洲精品伦理| 欧美母乳在线| 久久久亚洲精品一区二区三区| 免费中文字幕日韩欧美| 亚洲小少妇裸体bbw| 欧美在线精品免播放器视频| 亚洲第一天堂无码专区| 亚洲视频电影图片偷拍一区| 狠狠色狠狠色综合人人| 一本久久综合亚洲鲁鲁五月天| 国产精品亚洲片夜色在线| 欧美成人激情在线| 国产精品一二| 亚洲激情第一页| 国产亚洲福利| 一区二区久久久久| 亚洲黄色在线| 午夜一区二区三区在线观看| 99视频国产精品免费观看| 久久不见久久见免费视频1| 99视频精品免费观看| 久久九九免费视频| 亚洲欧美日韩国产中文| 欧美成人伊人久久综合网| 欧美在线一级va免费观看| 欧美日韩xxxxx| 欧美国产精品v| 国产一区二区三区四区| 一区二区三区欧美| 一本久道综合久久精品| 久久午夜视频| 国产精品网站在线播放| 亚洲精品国产精品国自产观看| 亚洲一区二区在线播放| 亚洲精品视频在线播放| 久久久精品视频成人| 欧美一区综合| 欧美三级视频在线观看| 亚洲国产欧美在线| 亚洲国产精品第一区二区| 久久www成人_看片免费不卡| 欧美一级久久久| 国产精品扒开腿爽爽爽视频| 亚洲精品乱码久久久久| 亚洲免费精品| 欧美超级免费视 在线| 蜜桃久久精品一区二区| 国产视频在线观看一区二区三区 | 欧美影院成人| 欧美专区第一页| 国产日本欧美一区二区| 亚洲欧美日韩精品久久久久| 午夜精品网站| 国产精品亚洲产品| 久久电影一区| 欧美成人精品一区二区| 亚洲狠狠丁香婷婷综合久久久| 久久精品人人做人人爽电影蜜月| 久久久久久久尹人综合网亚洲| 国产有码一区二区| 久久精品国产第一区二区三区| 另类尿喷潮videofree | 久久福利电影| 国内一区二区三区在线视频| 久久久91精品国产一区二区精品| 久久综合狠狠综合久久激情| 91久久在线观看| 欧美日韩免费一区| 一区二区三区高清视频在线观看| 亚洲一区国产| 国产一区再线| 免费成人网www| 夜夜精品视频一区二区| 欧美一级片在线播放| 韩国一区二区在线观看| 免费欧美网站| 9久草视频在线视频精品| 欧美一区二区三区电影在线观看| 国产亚洲欧美激情| 欧美第一黄网免费网站| 亚洲午夜视频| 免费视频一区| 亚洲天堂免费在线观看视频| 国产日产欧美精品| 媚黑女一区二区| 一区二区三区精品久久久| 久久国产日韩欧美| 亚洲精品男同| 国产色爱av资源综合区| 老司机一区二区三区| 一区二区三区四区五区精品视频| 久久精品日韩| 亚洲网在线观看| 影音先锋亚洲电影| 欧美午夜视频网站| 久久综合国产精品| 亚洲免费人成在线视频观看| 亚洲国产精品一区二区尤物区| 午夜视频一区| 亚洲欧洲精品一区二区三区波多野1战4| 欧美激情视频一区二区三区免费 | 在线精品国精品国产尤物884a| 欧美日本高清一区| 久久久久久久综合| 亚洲免费小视频| 亚洲激情成人在线| 老司机午夜精品视频| 午夜精品久久久久久99热| 91久久精品www人人做人人爽| 国产啪精品视频| 欧美午夜片欧美片在线观看| 欧美α欧美αv大片| 久久精品123| 亚洲欧美一区二区三区在线| 亚洲裸体俱乐部裸体舞表演av|