资源描述:
《利用hook拦截封包原理》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、利用HOOK拦截封包原理利用HOOK拦截封包原理截获API是个很有用的东西,比如你想分析一下别人的程序是怎样工作的。这里我介绍一下一种我自己试验通过的方法。首先,我们必须设法把自己的代码放到目标程序的进程空间里去。WindowsHook可以帮我们实现这一点。SetWindowsHookEx的声明如下:HHOOKSetWindowsHookEx(intidHook,//hooktypeHOOKPROClpfn,//hookprocedureHINSTANCEhMod,//handletoapplicationinstanceDWORDdwThreadId//threadidentifier
2、);具体的参数含义可以翻阅msdn,没有msdn可谓寸步难行。这里Hook本身的功能并不重要,我们使用它的目的仅仅只是为了能够让Windows把我们的代码植入别的进程里去。hookType我们任选一种即可,只要保证是目标程序肯定会调用到就行,这里我用的是WH_CALLWNDPROC。lpfn和hMod分别指向我们的钩子代码及其所在的dll,dwThreadId设为0,表示对所有系统内的线程都挂上这样一个hook,这样我们才能把代码放到别的进程里去。之后,我们的代码就已经进入了系统内的所有进程空间了。必须注意的是,我们只需要截获我们所关心的目标程序的调用,因此还必须区分一下进程号。我们自己
3、的钩子函数中,第一次运行将进行最重要的API重定向的工作。也就是通过将所需要截获的API的开头几个字节改为一个跳转指令,使其跳转到我们的API中来。这是最关键的部分。这里我想截三个调用,ws2_32.dll中的send和recv、user32.dll中的GetMessageA。DWORDdwCurrentPID=0;HHOOKhOldHook=NULL;DWORDpSend=0;DWORDpRecv=0;GETMESSAGEpGetMessage=NULL;BYTEbtNewBytes[8]={0x0B8,0x0,0x0,0x40,0x0,0x0FF,0x0E0,0};DWORDdwOl
4、dBytes[3][2];HANDLEhDebug=INVALID_HANDLE_value;LRESULTCALLBACKCallWndProc(intnCode,WPARAMwParam,LPARAMlParam){DWORDdwSize;DWORDdwPIDWatched;HMODULEhLib;if(dwCurrentPID==0){dwCurrentPID=GetCurrentProcessId();HWNDhwndMainHook;hwndMainHook=::FindWindow(0,"MainHook");dwPIDWatched=::SendMessage(hwndMa
5、inHook,(WM_USER+100),0,0);hOldHook=(HHOOK)::SendMessage(hwndMainHook,(WM_USER+101),0,0);if(dwCurrentPID==dwPIDWatched){hLib=LoadLibrary("ws2_32.dll");pSend=(DWORD)GetProcAddress(hLib,"send");pRecv=(DWORD)GetProcAddress(hLib,"recv");::ReadProcessMemory(INVALID_HANDLE_value,(void*)pSend,(void*)dwOl
6、dBytes[0],sizeof(DWORD)*2,&dwSize);*(DWORD*)(btNewBytes+1)=(DWORD)new_send;::WriteProcessMemory(INVALID_HANDLE_value,(void*)pSend,(void*)btNewBytes,sizeof(DWORD)*2,&dwSize);::ReadProcessMemory(INVALID_HANDLE_value,(void*)pRecv,(void*)dwOldBytes[1],sizeof(DWORD)*2,&dwSize);*(DWORD*)(btNewBytes+1)=
7、(DWORD)new_recv;::WriteProcessMemory(INVALID_HANDLE_value,(void*)pRecv,(void*)btNewBytes,sizeof(DWORD)*2,&dwSize);hLib=LoadLibrary("user32.dll");pGetMessage=(GETMESSAGE)GetProcAddress(hLib,"GetMessageA");::ReadProcessM