有没有人知道delphi嗅探器怎么写? 请求大家帮帮我,急用 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 就是sniffer,用以截取通过本机所有网络封包的工具,我有c++的代码,我想弄一个delphi的,大家帮帮我,无需驱动程序的Sniffer-IPMon 2001-06-13· ·zhangbo··yesky 在Windows平台上实现的Sniffer一般都需要自己写驱动程序,例如在Win9x 下面是通过写一个驱动程序用Hook_Device_Service( )来挂接ndis.vxd提供 的服务,在WinNT/2K下面则一般是需要写一个中间驱动程序(请参考白云黄鹤站的相关文章以及ttp://www.pcausa.com的论述)。Arkady Frankel([email protected]) 在CodeGuru上给出了一个无需自 己编写驱动程序的Sniffer-IPMon。该程序利用了WinSock 2的特性,只能 运行在Win2K平台上。inSock 2允许程序使用WSAIoctl( )给一个SOCK_RAW类型的socket设置SIO_RCVALL属性,这样该socket就可以收到所有经过本机的数据。 下面简单分析一下其实现方法。首先打开一个socket,参数必须是 AF_INET、SOCK_RAW和IPPROTO_IP,否则不能设置SIO_RCVALL属性:m_s = socket( AF_INET , SOCK_RAW , IPPROTO_IP ) ;if( INVALID_SOCKET == m_s ){dwErr = WSAGetLastError() ;sprintf( szErr , "Error socket() = %ld " , dwErr ) ;AfxMessageBox( szErr ) ;return ;}然后可以设置一下该socket的超时参数等选项:int rcvtimeo = 5000 ;if( setsockopt( m_s , SOL_SOCKET , SO_RCVTIMEO , (const char *)&rcvtimeo , sizeof(rcvtimeo) ) == SOCKET_ERROR){dwErr = WSAGetLastError() ;sprintf( szErr , "Error WSAIoctl = %ld " , dwErr ) ;AfxMessageBox( szErr ) ;closesocket( m_s ) ;return ;}再将该socket与本机的某个网络接口绑定(注意绑定的IP地址不能是INADDR_ANY):sa.sin_family = AF_INET;sa.sin_port = htons(7000);sa.sin_addr.s_addr= m_iphostsource;if (bind(m_s,(PSOCKADDR)&sa, sizeof(sa)) == SOCKET_ERROR){dwErr = WSAGetLastError() ;sprintf( szErr , "Error bind() = %ld " , dwErr ) ;AfxMessageBox( szErr ) ;closesocket( m_s ) ;return ;} 接下来就可以设置SIO_RCVALL属性。此后就可以利用这个socket来读取经过本机的数据包了。IPMon创建了一个新线程专门来读取该socket,以防止处理用户输入的主线程被阻塞。if( SOCKET_ERROR != WSAIoctl( m_s, SIO_RCVALL , &dwBufferInLen, sizeof(dwBufferInLen),&dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned , NULL , NULL ) )AfxBeginThread( threadFunc , (LPVOID)this );else{dwErr = WSAGetLastError() ;sprintf( szErr , "Error WSAIoctl = %ld " , dwErr ) ;AfxMessageBox( szErr ) ;closesocket( m_s ) ;return ;}新线程中读取socket的代码也非常简单,只需要反复调用recv( )即可:memset( buf , 0 , sizeof(buf) ) ;iRet = recv( pDlg->m_s , buf , sizeof( buf ) , 0 ) ;if( iRet == SOCKET_ERROR ){dwErr = WSAGetLastError() ;sprintf( szErr , "Error recv() = %ld " , dwErr ) ;continue ;}elseif( *buf ){bufwork = buf ;pIpHeader = (IPHEADER *)bufwork ;WORD iLen = ntohs(pIpHeader->total_len) ;......}此时pIpHeader就指向buf中的RAW IP数据包,如何处理就看自己的需要了。总之这个实现是非常方便的,不用自己编写复杂的抓包代码,所有重要的工作都由WinSock自己封装了。WSAIoctl( )还有其它一些比较有用的参数,如SIO_RCVALL_MCAST参数使socket可以接收所有的多播数据,SIO_RCVALL_IGMPMCAST参数则可以接收IGMP多播数据。实际测试的时候发现IPMon经常无法看到本机发出去的数据包(偶尔能收到),不知是什么原因。 http://sourceforge.net/在上面有見過, 你自已上去找找! 请问一下这个问题循环能做到么。 组件开发一个小问题。 API HOOK如何防止多线程访问? 请问Delphi7里用什么做报表 如何在Delphi中控制在Word中插入新文档时另起一页? ljmanage(过客)进来接粉儿!凉粉儿~ 各位高手请问有没有学习Delphi的经验?绝对给分!!! 老问题没有人来帮助我,你来保证我回答,好吗? mylove_dlp回话 在哪里可以下载CSDN论坛的问题—解答集? ole组件问题 请教DBGrid的问题,急!!!50分(不够再加)
无需驱动程序的Sniffer-IPMon
2001-06-13· ·zhangbo··yesky
在Windows平台上实现的Sniffer一般都需要自己写驱动程序,例如在Win9x 下面是通过写一个驱动程序用Hook_Device_Service( )来挂接ndis.vxd提供 的服务,在WinNT/2K下面则一般是需要写一个中间驱动程序(请参考白云黄鹤站的相关文章以及ttp://www.pcausa.com的论述)。
Arkady Frankel([email protected]) 在CodeGuru上给出了一个无需自 己编写驱动程序的Sniffer-IPMon。该程序利用了WinSock 2的特性,只能 运行在Win2K平台上。inSock 2允许程序使用WSAIoctl( )给一个SOCK_RAW类型的socket设置SIO_RCVALL属性,这样该socket就可以收到所有经过本机的数据。 下面简单分析一下其实现方法。首先打开一个socket,参数必须是 AF_INET、SOCK_RAW和IPPROTO_IP,否则不能设置SIO_RCVALL属性:m_s = socket( AF_INET , SOCK_RAW , IPPROTO_IP ) ;
if( INVALID_SOCKET == m_s )
{
dwErr = WSAGetLastError() ;
sprintf( szErr , "Error socket() = %ld " , dwErr ) ;
AfxMessageBox( szErr ) ;
return ;
}然后可以设置一下该socket的超时参数等选项:int rcvtimeo = 5000 ;
if( setsockopt( m_s , SOL_SOCKET , SO_RCVTIMEO ,
(const char *)&rcvtimeo , sizeof(rcvtimeo) ) == SOCKET_ERROR)
{
dwErr = WSAGetLastError() ;
sprintf( szErr , "Error WSAIoctl = %ld " , dwErr ) ;
AfxMessageBox( szErr ) ;
closesocket( m_s ) ;
return ;
}再将该socket与本机的某个网络接口绑定(注意绑定的IP地址不能是INADDR_ANY):sa.sin_family = AF_INET;
sa.sin_port = htons(7000);
sa.sin_addr.s_addr= m_iphostsource;
if (bind(m_s,(PSOCKADDR)&sa, sizeof(sa)) == SOCKET_ERROR)
{
dwErr = WSAGetLastError() ;
sprintf( szErr , "Error bind() = %ld " , dwErr ) ;
AfxMessageBox( szErr ) ;
closesocket( m_s ) ;
return ;
} 接下来就可以设置SIO_RCVALL属性。此后就可以利用这个socket来读取经过本机的数据包了。IPMon创建了一个新线程专门来读取该socket,以防止处理用户输入的主线程被阻塞。if( SOCKET_ERROR != WSAIoctl( m_s, SIO_RCVALL , &dwBufferInLen,
sizeof(dwBufferInLen),&dwBufferLen, sizeof(dwBufferLen),
&dwBytesReturned , NULL , NULL ) )
AfxBeginThread( threadFunc , (LPVOID)this );
else
{
dwErr = WSAGetLastError() ;
sprintf( szErr , "Error WSAIoctl = %ld " , dwErr ) ;
AfxMessageBox( szErr ) ;
closesocket( m_s ) ;
return ;
}新线程中读取socket的代码也非常简单,只需要反复调用recv( )即可:memset( buf , 0 , sizeof(buf) ) ;
iRet = recv( pDlg->m_s , buf , sizeof( buf ) , 0 ) ;
if( iRet == SOCKET_ERROR )
{
dwErr = WSAGetLastError() ;
sprintf( szErr , "Error recv() = %ld " , dwErr ) ;
continue ;
}
else
if( *buf )
{
bufwork = buf ;
pIpHeader = (IPHEADER *)bufwork ;
WORD iLen = ntohs(pIpHeader->total_len) ;
......
}此时pIpHeader就指向buf中的RAW IP数据包,如何处理就看自己的需要了。总之这个实现是非常方便的,不用自己编写复杂的抓包代码,所有重要的工作都由WinSock自己封装了。WSAIoctl( )还有其它一些比较有用的参数,如SIO_RCVALL_MCAST参数使socket可以接收所有的多播数据,SIO_RCVALL_IGMPMCAST参数则可以接收IGMP多播数据。实际测试的时候发现IPMon经常无法看到本机发出去的数据包(偶尔能收到),不知是什
么原因。
在上面有見過, 你自已上去找找!