📄 利用hook拦截封包原理—编程爱好者网站http--www_programfan_com.htm
字号:
src="利用HOOK拦截封包原理—编程爱好者网站http--www_programfan_com.files/small.gif"
width=18><A
href="http://www.programfan.net/article.asp?classid=12">汇编语言文章</A><BR><IMG
height=13
src="利用HOOK拦截封包原理—编程爱好者网站http--www_programfan_com.files/small.gif"
width=18><A
href="http://www.programfan.net/article.asp?classid=13">游戏开发文章</A><BR><IMG
height=13
src="利用HOOK拦截封包原理—编程爱好者网站http--www_programfan_com.files/small.gif"
width=18><A
href="http://www.programfan.net/article.asp?classid=14">数据库开发文章</A><BR><IMG
height=13
src="利用HOOK拦截封包原理—编程爱好者网站http--www_programfan_com.files/small.gif"
width=18><A
href="http://www.programfan.net/article.asp?classid=15">Visual
C#文章</A><BR><IMG height=13
src="利用HOOK拦截封包原理—编程爱好者网站http--www_programfan_com.files/small.gif"
width=18><A
href="http://www.programfan.net/article.asp?classid=16">VB.net文章</A><BR><IMG
height=13
src="利用HOOK拦截封包原理—编程爱好者网站http--www_programfan_com.files/small.gif"
width=18><A
href="http://www.programfan.net/article.asp?classid=17">XML文章</A><BR><IMG
height=13
src="利用HOOK拦截封包原理—编程爱好者网站http--www_programfan_com.files/small.gif"
width=18><A
href="http://www.programfan.net/article.asp?classid=18">ASP.net文章</A><BR><IMG
height=13
src="利用HOOK拦截封包原理—编程爱好者网站http--www_programfan_com.files/small.gif"
width=18><A
href="http://www.programfan.net/article.asp?classid=19">算法文章</A><BR><IMG
height=13
src="利用HOOK拦截封包原理—编程爱好者网站http--www_programfan_com.files/small.gif"
width=18><A href="http://www.programfan.net/tougao.asp"
style="COLOR: #ff0000"><B>欢迎上传文章<BR></B></A><IMG height=13
src="利用HOOK拦截封包原理—编程爱好者网站http--www_programfan_com.files/small.gif"
width=18><A href="http://www.programfan.net/sample.asp"
style="COLOR: #ff0000"><B>免费更新代码</B></A>
<P> </P></TD></TR>
<TR>
<TD bgColor=#ff6600 height=19 width="100%">
<P align=center><STRONG><FONT color=#ffffff>文 章 搜
索</FONT></STRONG></P></TD></TR>
<TR>
<TD bgColor=#ffffcc height=83 width="100%">
<FORM action=searcharticle.asp?classid=10 method=post target=_blank>
<DIV align=center>
<P><BR><FONT color=#ff0000>请输入关键字</FONT></P></DIV>
<DIV align=center>
<P><INPUT name=keyword size=10
style="BORDER-BOTTOM: rgb(255,0,0) 1px solid; BORDER-LEFT: rgb(255,0,0) 1px solid; BORDER-RIGHT: rgb(255,0,0) 1px solid; BORDER-TOP: rgb(255,0,0) 1px solid; COLOR: rgb(0,0,255); FONT-FAMILY: 宋体; FONT-SIZE: 9pt">
<INPUT name=B1 style="BACKGROUND-COLOR: rgb(0,255,255); BORDER-BOTTOM: rgb(0,0,255) 1px solid; BORDER-LEFT: rgb(0,0,255) 1px solid; BORDER-RIGHT: rgb(0,0,255) 1px solid; BORDER-TOP: rgb(0,0,255) 1px solid" type=submit value=搜索></P></DIV>
<DIV align=center>
<P><SELECT name=fw size=1> <OPTION selected
value=1>搜索本栏文章</OPTION> <OPTION
value=2>搜索全部文章</OPTION></SELECT><BR></P></DIV></FORM></TD></TR>
<TR>
<TD bgColor=#ff6600 height=20 width="100%">
<P align=center><STRONG><FONT color=#ffffff>栏 目 说
明</FONT></STRONG></P></TD></TR>
<TR>
<TD bgColor=#ffffcc width="100%">
本栏目大部分文章均来自于互联网,版权归原作者和各发布网站所有。本站收集这些文章仅供学习参考之用。任何人都不能将这些文章用于商业目的。否则后果自负。<BR>
如果您对本栏目有什么意见和建议,欢迎<A
href="mailto:yaoz@163.com">和我联系</A>。</TD></TR></TBODY></TABLE></CENTER></DIV></TD>
<TD height=234 vAlign=top width="80%">
<DIV align=center>
<CENTER>
<TABLE border=0 cellPadding=0 cellSpacing=1 height=509 width="98%">
<TBODY>
<TR>
<TD bgColor=#99ccff height=18
style="BORDER-BOTTOM: rgb(0,0,0) 1px solid"
width="100%"><STRONG>您所在的位置:<A
href="http://www.programfan.com/">编程爱好者网站</A> -<A
href="http://www.programfan.net/article.asp">文档中心</A> - <A
href="http://www.programfan.net/article.asp?classid=10"
style="COLOR: rgb(255,0,0)">WINDOWS编程文章 </STRONG></A></TD></TR>
<TR>
<TD align=middle bgColor=#fafafa height=248
style="FONT-FAMILY: 宋体; FONT-SIZE: 11pt">
<DIV align=center>
<TABLE border=0 cellPadding=0 cellSpacing=0 height=217
width="90%"><TBODY>
<TR>
<TD align=middle bgColor=#fafafa height=24
style="FONT-FAMILY: 宋体; FONT-SIZE: 11pt"><FONT
color=#ff0000><B>利用HOOK拦截封包原理</B></FONT></TD></TR>
<TR>
<TD align=middle bgColor=#fafafa height=70><FONT
color=#c0c0c0>(加入日期:2003-10-23 点击数:1134)</FONT><BR><B>【<A
href="http://www.programfan.net/comment.asp?id=2402">对此文发表评论</A>】 【<A
href="http://www.programfan.net/club">编程爱好者论坛</A>】 【<A
href="http://www.programfan.net/showarticle.asp?id=2402#"
onclick=javascript:WebBrowser.ExecWB(4,1)>保存文章至硬盘</A>】
<OBJECT classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2
height=0 id=WebBrowser width=0></OBJECT> 【<A
href="http://www.programfan.net/showarticle.asp?id=2402#"
onclick=javascript:window.print()>打印文章</A>】</B></TD></TR>
<CENTER></CENTER>
<CENTER></CENTER>
<TR>
<TD align=middle bgColor=#fafafa>
<P align=center><FONT color=#0000ff><A
href="http://www.programfan.net/club/listbbs.asp?rootclassid=8"
style="COLOR: #ff0000"><B>Borland开发讨论区</B></A><B> </B><A
href="http://www.programfan.net/club/listbbs.asp?rootclassid=9"
style="COLOR: #ff0000"><B>微软开发讨论区</B></A> <B><A
href="http://www.programfan.net/club/listbbs.asp?rootclassid=10"
style="COLOR: #ff0000">C/C++讨论区</A> <A
href="http://www.programfan.net/club/listbbs.asp?rootclassid=2"
style="COLOR: #ff0000">新手入门专区</A></B></FONT></P></TD></TR>
<CENTER>
<CENTER>
<TR>
<TD bgColor=#fafafa
height=123><BR>截获API是个很有用的东西,比如你想分析一下别人的程序是怎样工作的。这里我介绍一下一种我自己试验通过的方法。
<BR>首先,我们必须设法把自己的代码放到目标程序的进程空间里去。Windows
Hook可以帮我们实现这一点。SetWindowsHookEx的声明如下: <BR>HHOOK
SetWindowsHookEx( <BR>int idHook, // hook type <BR>HOOKPROC
lpfn, // hook procedure <BR>HINSTANCE hMod, // handle to
application instance <BR>DWORD dwThreadId // thread identifier
<BR>); <BR>具体的参数含义可以翻阅msdn,没有msdn可谓寸步难行。
<BR>这里Hook本身的功能并不重要,我们使用它的目的仅仅只是为了能够让Windows把我们的代码植入别的进程里去。hook
Type我们任选一种即可,只要保证是目标程序肯定会调用到就行,这里我用的是WH_CALLWNDPROC。lpfn和hMod分别指向我们的钩子代码及其所在的dll,dwThreadId设为0,表示对所有系统内的线程都挂上这样一个hook,这样我们才能把代码放到别的进程里去。
<BR><BR>之后,我们的代码就已经进入了系统内的所有进程空间了。必须注意的是,我们只需要截获我们所关心的目标程序的调用,因此还必须区分一下进程号。我们自己的钩子函数中,第一次运行将进行最重要的API重定向的工作。也就是通过将所需要截获的API的开头几个字节改为一个跳转指令,使其跳转到我们的API中来。这是最关键的部分。这里我想截三个调用,ws2_32.dll中的send和recv、user32.dll中的GetMessageA。
<BR><BR>DWORD dwCurrentPID = 0; <BR>HHOOK hOldHook = NULL;
<BR>DWORD pSend = 0; <BR>DWORD pRecv = 0; <BR>GETMESSAGE
pGetMessage = NULL; <BR><BR>BYTE btNewBytes[8] = { 0x0B8, 0x0,
0x0, 0x40, 0x0, 0x0FF, 0x0E0, 0 }; <BR>DWORD dwOldBytes[3][2];
<BR><BR>HANDLE hDebug = INVALID_HANDLE_value; <BR><BR>LRESULT
CALLBACK CallWndProc( int nCode, WPARAM wParam, LPARAM lParam
) <BR>{ <BR>DWORD dwSize; <BR>DWORD dwPIDWatched; <BR>HMODULE
hLib; <BR><BR>if( dwCurrentPID == 0 ) <BR>{ <BR>dwCurrentPID =
GetCurrentProcessId(); <BR>HWND hwndMainHook; <BR>hwndMainHook
= ::FindWindow( 0, "MainHook" ); <BR>dwPIDWatched =
::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 );
<BR>hOldHook = (HHOOK)::SendMessage( hwndMainHook,
(WM_USER+101), 0, 0 ); <BR><BR>if( dwCurrentPID ==
dwPIDWatched ) <BR>{ <BR>hLib = LoadLibrary( "ws2_32.dll" );
<BR>pSend = (DWORD)GetProcAddress( hLib, "send" ); <BR>pRecv =
(DWORD)GetProcAddress( hLib, "recv" );
<BR><BR>::ReadProcessMemory( INVALID_HANDLE_value, (void
*)pSend, (void *)dwOldBytes[0], sizeof(DWORD)*2, &dwSize
); <BR>*(DWORD *)( btNewBytes + 1 ) = (DWORD)new_send;
<BR>::WriteProcessMemory( INVALID_HANDLE_value, (void *)pSend,
(void *)btNewBytes, sizeof(DWORD)*2, &dwSize );
<BR><BR>::ReadProcessMemory( INVALID_HANDLE_value, (void
*)pRecv, (void *)dwOldBytes[1], sizeof(DWORD)*2, &dwSize
); <BR>*(DWORD *)( btNewBytes + 1 ) = (DWORD)new_recv;
<BR>::WriteProcessMemory( INVALID_HANDLE_value, (void *)pRecv,
(void *)btNewBytes, sizeof(DWORD)*2, &dwSize );
<BR><BR>hLib = LoadLibrary( "user32.dll" ); <BR>pGetMessage =
(GETMESSAGE)GetProcAddress( hLib, "GetMessageA" );
<BR>::ReadProcessMemory( INVALID_HANDLE_value, (void
*)pGetMessage, (void *)dwOldBytes[2], sizeof(DWORD)*2,
&dwSize ); <BR>*(DWORD *)( btNewBytes + 1 ) =
(DWORD)new_GetMessage; <BR>::WriteProcessMemory(
INVALID_HANDLE_value, (void *)pGetMessage, (void *)btNewBytes,
sizeof(DWORD)*2, &dwSize ); <BR><BR>hDebug = ::CreateFile(
"C:\\Trace.log", GENERIC_WRITE, 0, 0, CREATE_ALWAYS,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -