利用hook拦截封包原理

利用HOOK拦截封包原理利用HOOK拦截封包原理截获API是个很有用的东西,比如你想分析一下别人的程序是怎样工作的。这里我介绍一下一种我自己试验通过的方法。首先,我们必须设法把自己的代码放到目标程序的进程空间里去。WindowsHook可以帮我们实现这一点。SetWindowsHookEx的声明如下:HHOOKSetWindowsHookEx(intidHook,//hooktypeHOOKPROClpfn,//hookprocedureHINSTANCEhMod,//handletoapplicationinstanceDWORDdwThreadId//threadidentifier);具体的参数含义可以翻阅msdn,没有msdn可谓寸步难行。这里Hook本身的功能并不重要,我们使用它的目的仅仅只是为了能够让Windows把我们的代码植入别的进程里去。hookType我们任选一种即可,只要保证是目标程序肯定会调用到就行,这里我用的是WH_CALLWNDPROC。lpfn和hMod分别指向我们的钩子代码及其所在的dll,dwThreadId设为0,表示对所有系统内的线程都挂上这样一个hook,这样我们才能把代码放到别的进程里去。之后,我们的代码就已经进入了系统内的所有进程空间了。必须注意的是,我们只需要截获我们所关心的目标程序的调用,因此还必须区分一下进程号。我们自己的钩子函数中,第一次运行将进行最重要的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};DWORDdwOldBytes[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(hwndMainHook,(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*)dwOldBytes[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)=(DWORD)new_recv;::WriteProcessMemory(INVALID_HANDLE_value,(void*)pRecv,(void*)btNewBytes,sizeof(DWORD)*2,dwSize);hLib=LoadLibrary("user32.dll");pGetMessage=(GETMESSAGE)GetProcAddress(hLib,"GetMessageA");::ReadProcessMemory(INVALID_HANDLE_value,(void*)pGetMessage,(void*)dwOldBytes[2],sizeof(DWORD)*2,dwSize);*(DWORD*)(btNewBytes+1)=(DWORD)new_GetMessage;::WriteProcessMemory(INVALID_HANDLE_value,(void*)pGetMessage,(void*)btNewBytes,sizeof(DWORD)*2,dwSize);hDebug=::CreateFile("C:\\Trace.log",GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);}}if(hOldHook!=NULL){returnCallNextHookEx(hOldHook,nCode,wParam,lParam);}return0;}上面的钩子函数,只有第一次运行时有用,就是把三个函数的首8字节修改一下(实际上只需要7个)。btNewBytes中的指令实际就是moveax,0x400000jmpeax这里的0x400000就是新的函数的地址,比如new_recv/new_send/new_GetMessage,此时,偷梁换柱已经完成。再看看我们的函数中都干了些什么。以GetMessageA为例:BOOL_stdcallnew_GetMessage(LPMSGlpMsg,HWNDhWnd,UINTwMsgFilterMin,UINTwMsgFilterMax){DWORDdwSize;chars主题emp[256];BOOLr=false;//Watchherebeforeit'sexecuted.sprintf(s主题emp,"BeforeGetMessage:HWND0x%8.8X,...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

文秘专家
机构认证
内容提供者

1

确认删除?