嗅探原理和工具编写及使用(1)
首先,我今天来是做广告的哦:)
很久没有更新专栏了,关键是写不出什么好东西,也怕大家见笑!
虽然我还没被人骂过,但我见过别人被人骂,哎。不是说,这在csdn好像很正常哈!
今天把这个贴子整理一下,这本是专题开发版的一个专题讨论贴:http://expert.csdn.net/Expert/topic/2333/2333459.xml?temp=.3382532,其实这个贴子也没有挖出更深入的东西,关键是专题版目前人气不太好吧。我发这个贴是希望更多的人能到专题版,参与和组织讨论,但结果并不是太理想。kingzai:
sniffer中文翻译过来就是嗅探器,在当前网络技术中使用得非常得广泛。sniffer既可以做为网络故障的诊断工具,也可以作为黑客嗅探和监听的工具。最近两年,网络监听(sniffer)技术出现了新的
重要特征。传统的sniffer技术是被动地监听网络通信、用户名和口令。而新的sniffer技术出现了主
动地控制通信数据的特点,把sniffer技术扩展到了一个新的领域。Sniffer 技术除了目前在传统的
网络侦测管理外,也开始被应用在资讯保全的领域。可以这样说,sniffer技术是一把双刃剑,如何
更好的利用它,了解它的一些特性,将能使这项技术更好的为我们带来便利。
sniffer的编程方法比较通用的有以下几种,1.winpcap 这是一个比较通用的库,相信做过抓包的工具大多数人都不会太陌生 2.raw socket 在2000以后的版本都支持此项功能,2000 server有
个网络监视器就是基于raw socket 3.tdi,ndis,spi,hook socket技术,这种技术比较大的不同是
,可以将包截取而不是仅仅获得包的一份拷贝
。总的说来,一般以前两者居多。
我这里提的都还比较片面,更多的需要大家来补充。我办这个专题的目的是希望大家共同来了解,讨论sniffer技术,让更多的人参与进来,让大家知道,这个板块能够给大家带来真正想要的东西
。
warton:
libpcap是个好东西,linux,windows下都能用,很多入侵检测之类的安全系统都是以这为核心。不过我一直没用过它,不知道它的跨平台性如何?
要用spi的话,看看xfilter的代码和书,特别是那本书上讲得不错,可惜一直没用它做出什么东西来。
raw socket写的sniffer比较多,网上代码也很多!
昨天见csdn首页有几篇关于sniffer的文章,保存了,还没来得及看...
俺明天来说说目前常用的sniffer类工具和它们的技术实现!csdn首页的两篇文章,大家可以看看,里面好像还有几篇,暂时找不到了
http://www.csdn.net/develop/article/21/21363.shtm
http://www.csdn.net/develop/article/21/21352.shtm
http://www.csdn.net/develop/article/15/15919.shtmnetsys2:
一)winpcap驱动简介
winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。它提供了以下的各项
功能:
1> 捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据报;
2> 在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;
3> 在网络上发送原始的数据报;
4> 收集网络通信过程中的统计信息。
winpcap的主要功能在于独立于主机协议(如TCP-IP)而发送和接收原始数据报。也就是说,winp
cap不能阻塞,过滤或控制其他应用程序数据报的发收,它仅仅只是监听共享网络上传送的数据报
。因此,它不能用于QoS调度程序或个人防火墙。
目前,winpcap开发的主要对象是windows NT/2000/XP,这主要是因为在使用winpcap的
用户中只有一小部分是仅使用windows 95/98/Me,并且M$也已经放弃了对win9x的开发。因
此本文相关的程序T-ARP也是面向NT/2000/XP用户的。其实winpcap中的面向9x系统的概念和
NT系统的非常相似,只是在某些实现上有点差异,比如说9x只支持ANSI编码,而NT系统则提倡使
用Unicode编码。
zzhong2:
有个软件叫sniffer pro.可以作网管软件用,有很多功能,可监视网络运行情况,每台网内机器的数据流量,实时反映每台机器所访问IP以及它们之间的数据流通情况,可以抓包,可对过滤器进行设置,以便
只抓取想要的包,比如POP3包,smtp包,ftp包等,并可从中找到邮箱用户名和密码,还有ftp用户名和
密码.它还可以在使用交换机的网络上监听,不过要在交换机上装它的一个软件.
还有一个简单的监听软件叫 Passwordsniffer,可截获邮箱用户名和密码,还有ftp用户名和密码,它只能用在用HUB网络上
以上两个软件都可在小凤居上下载到:http://www.chinesehack.org/
warton:
libpcap的最新版本是0.7.2,下载很多(基于linux/unix)
winpcap的最新版本是3.0
这里有winpcap的源代码:http://download.pchome.net/php/dl.php?sid=11474
著名软件tcpdump及ids snort都是基于libpcap编写的,此外Nmap扫描器也是基于libpcap来捕获目标主机返回的数据包的。
winpcap提供给用户两个不同级别的编程接口:一个基于libpcap的wpcap.dl,另一个是较底层的packet.dll。对于一般的要与unix平台上libpcap兼容的开发来说,使用pacap.dll是当然的选择
。
下面几个库是与lipcap相关的:
libnet1.0.2:数据包的发送个构造过程
libnids:实现了ids的一些 框架
libicmp:icmp数据包处理
一些著名的嗅探器:
tcpdump/windump:支持多种unix,后者支持windows。基于libpcap
Sniffit:unix,windows,libpcap
Ngrep:libpcap,unixwindows.可以用规则表达式,识别PPP,SLIP及FDDI数据包
Sniffer pro/NetXray:专业的协议分析工具,是NAI提供的网络分析方案中的一部分
其它:
Iris
LanExplorer
NetMOnitor
CommView单一用途的噢探器
口令嗅:winsniffer,典型的黑客工具,嗅探并解析ftp,pop3,http,icq,smtp,telnet,IMAP,NNTP等口令
password sniffer for NetHackerIII专用 嗅探器:
SMB嗅探器:L0phtcrack,SMPRelay
TCP连接会话嗅探器:CommView ,Iris,Juggernaut
SSL嗅探器:SSLDump--sslv3/tls网络协议分析工具
RIDIUS嗅控器:一个基于udp的论证记账协议,Radiusniff是其代表
PPTP嗅 控器:Anger,PPTP-sniff(solaris)
SNMP嗅探器:Snmpsniff交换网络嗅探器:Ettercap
综合:Dsniff
其它交换网络嗅探器:
snarp,parasite嗅探对策.........
netsys2:
网络上流传的GUNIFFER是个基本的原型:
asp.6to23.com/nowcan/code/guniffer.zip">http://asp.6to23.com/nowcan/code/guniffer.zip
void main(int argc, char ** argv)
{
int iErrorCode;
char RecvBuf[MAX_PACK_LEN] = {0};
usage();
if(GetCmdLine(argc, argv)==CMD_PARAM_HELP) exit(0);
//初始化SOCKET
WSADATA wsaData;
iErrorCode = WSAStartup(MAKEWORD(2,1),&wsaData);
CheckSockError(iErrorCode, "WSAStartup");
SockRaw = socket(AF_INET , SOCK_RAW , IPPROTO_IP);
CheckSockError(SockRaw, "socket");
//获取本机IP地址
char FAR name[MAX_HOSTNAME_LAN];
iErrorCode = gethostname(name, MAX_HOSTNAME_LAN);
CheckSockError(iErrorCode, "gethostname");
struct hostent FAR * pHostent; //注意下面这三句,这里先对pHostent分配了一块
pHostent = (struct hostent * )malloc(sizeof(struct hostent));
//内存,然后有让它等于gethostbyname函数的返回
pHostent = gethostbyname(name); //值,但gethostbyname函数是自己在函数内部分配内
存的,因此上一句根本就是多余,把上一句删除后一切正常。但此程序用VC6编译运行都没有问题
,不知为何?也许是VC6的编译器优化在起作用。
SOCKADDR_IN sa;
sa.sin_family = AF_INET;
sa.sin_port = htons(6000);
memcpy(&sa.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length);
free(pHostent); //由于前面分配内存的语句已经删除,所以这一句也要去掉,否则出错。感谢网
友 He易做图 发现这个问题。
iErrorCode = bind(SockRaw, (PSOCKADDR)&sa, sizeof(sa));
CheckSockError(iErrorCode, "bind");
//设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包
DWORD dwBufferLen[10] ;
DWORD dwBufferInLen = 1 ;
DWORD dwBytesReturned = 0 ;
iErrorCode=WSAIoctl(SockRaw, SIO_RCVALL,&dwBufferInLen,
sizeof(dwBufferInLen),
&dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL );
CheckSockError(iErrorCode, "Ioctl");
//侦听IP报
补充:综合编程 , 安全编程 ,