libpcap指南(原创外文翻译)1

本文是一篇libpcap指南的翻译,介绍了如何捕获和分析网络数据包。内容包括libpcap的基本概念、作用,以及如何编写简单的抓包引擎。适合对计算机网络、数据包有一定了解的读者,提供了相关资源链接和初步的代码示例。
原文地址http://yuba.stanford.edu/~casado/pcap/section1.html

版权归作者Martin Casado所有

The Sniffer's Guide to Raw Traffic
(一篇libpcap指导手册)


序: 这是一个在我以前的pcap指导手册基础上有轻微改动和增加的版本。五年后再次回到这个工作上, I am necessarily dumber (age and beer) yet hopefully somewhat more knowledgeable. 我的联系方式有所改变,请发送邮件到casado@cs.stanford.edu.


内容

为谁而写:这篇指南假定读者粗略地具有以下知识:计算机网络;数据包的概念;以太网知识及了解IP协议、TCP协议、UDP协议等。如果这些概念对你来说很陌生,我强烈建议你买一些网络技术方面的书籍,我的推荐是:

  • Computer Networking : A Top-Down Approach Featuring the Internet (3rd Edition) by James F. Kurose, Keith W. Ross
  • UNIX Network Programming by W. Richard Stevens
  • The Protocols (TCP/IP Illustrated, Volume 1) by W. Richard Stevens
这篇指南并不要求有任何网络编程的前序知识,只要对C语言有基本的熟悉即可。如果你已经是一个C/C++的高手,那么也许你最好直接试用 man 3 pcap命令来学习。你的机器上需要有一个能工作的C编译器并安装了libpcap。这一章节所有的代码都在Linux(内核2.2.14)上进行编写和测试,并且它们应该是最简便的(呵呵)。 我不能担保它们在其它的操作系统上也能很好的编译通过和运行。你将使用root权限来运行这些代码,所以请小心不要在运行时弄坏了你的操作系统。对了,虽然我对这里所有的代码进行了测试和运行,它们没有任何问题。但是如果它们这些烂东西在你的机器上出了问题,我不负任何责任。请自己承担风险......

介绍:不管怎么说,你从文章的开始读到了这里(无论以什么方式,精读、略读或者跳读)。我们将从最最最基础的地方开始,并在开始前做一些定义——但是,如果你迫不及待地想更进一步,翻到这页的最下方,复制,粘贴,编译,然后随你怎么玩。至于其他人,以下这两点说明将会在“我们正在做什么”和“使用什么工具”上给你们一些线索。 

  • 捕获数据包 粗略地讲,就是在操作系统处理数据包之前,从数据线上抓取一个数据包的备份。那么为什么要这么做呢?这就厉害了,在实践中它更多地被用于制作网络安全工具上,还有分析外网的原始数据,检测恶意行为(扫描或攻击),嗅探,指纹识别和别的(通常是比较生僻的)一些用处。
  • libpcap “由操作系统提供能够独立执行的,有权对底层数据包进行捕获的工具”(Stevens, UNP page. 第707页)。所以更接近的说法是,libpcap是一个函数库,通过它我们可以将网卡上的数据包按它们原来的样子抓取下来。

让我们开始 好了,前面有太多可怕的介绍...那么让我们开始熟悉一下libpcap。这篇指南上的所有代码范例都假设你正坐在一台接入互联网的计算机前。如果不是这种情况,基础的知识还是相关的,但是后面提供的关于解析以太网数据包头部信息的部分就不能运行了。:-( 对不起,别把你的手指头关节扳得“咯吧咯吧”响了,现在就开始我们第一个libpcap程序 :)。把下面的程序抄到你最喜欢的编辑器里(如果你是个有正常感官的人的话一定选VIM),:-)保存,并用以下的命令进行编译...
%>gcc ldev.c -lpcap


/* ldev.c
Martin Casado

To compile:
>gcc ldev.c -lpcap

查找网络设备接口,列出ip地址和这个接口试用的子网掩码*/
#include <stdio.h>
#include <stdlib.h>
#include <pcap.h> /* 请给我一个libpcap包! */
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char **argv)
{
char *dev; /* 用于设备名称 */
char *net; /* dot notation of the network address */
char *mask;/* dot notation of the network mask */
int ret; /* 返回值 */
char errbuf[PCAP_ERRBUF_SIZE];
bpf_u_int32 netp; /* ip */
bpf_u_int32 maskp;/* 子网掩码 */
struct in_addr addr;

/* 向pcap询问来寻找一个用来嗅探的可用设备 */
dev = pcap_lookupdev(errbuf);

/* error checking */
if(dev == NULL)
{
printf("%s/n",errbuf);
exit(1);
}

/* 打印出设备名称 */
printf("DEV: %s/n",dev);

/* 向pcap询问设备的网络地址和子网掩码 */
ret = pcap_lookupnet(dev,&netp,&maskp,errbuf);

if(ret == -1)
{
printf("%s/n",errbuf);
exit(1);
}

/* 以人类可读的形式显示网络地址 */
addr.s_addr = netp;
net = inet_ntoa(addr);

if(net == NULL)/* 感谢Scott :-P */
{
perror("inet_ntoa");
exit(1);
}

printf("NET: %s/n",net);

/* 对设备的子网掩码做如上的处理 */
addr.s_addr = maskp;
mask = inet_ntoa(addr);

if(mask == NULL)
{
perror("inet_ntoa");
exit(1);
}

printf("MASK: %s/n",mask);

return 0;
}

你运行这个程序了吗?如果没有的话,请运行它:-) 假设它编译通过,正常运行的话,你得到的输出应该是像下面显示的一样的一些东西......

DEV: eth0
NET: 192.168.12.0
MASK: 255.255.255.0
DEV的值是你机器上默认网络接口的名称(例如在Linux上是eth0,而在olaris上应该是eri0s)。而NET和MASK值应该是你主要网络接口的子网段和子网掩码。看不懂吗?也许你想先看一下这些.

“那么我们刚才都做了什么?”,你问道。这个嘛,我们只是请求libpcap给我们一些监听网络接口的规格。
“那么什么是网络接口呢?”
就把网络接口想象成你的电脑硬件,用来连接到你计算机连接的任何网络上。在Linux上,eth0表示你电脑上的第一个网卡。(顺便说一句,你可以用ifconfig命令来查看你所有的网络接口列表)。

好了,现在我们能够编译一个pcap程序了,尽管它没有做什么实质性的工作。接下来我们将捕获我们第一个数据包...



 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值