用libpcap抓包并进行底层网络欺骗 --part 1

用libpcap抓包并进行底层网络欺骗 --part 1

用libpcap抓包并进行底层网络欺骗

 作者:Martin Casado

 翻译:Yada

  • Download libpcap Unix source from Tcpdump.org
  • Search for other neat-o libpcap stuff from google

------------------------------------------------------------------------------------
本文档包含
 1。介绍(你已经在这里了)
 2。抓第一个包
 3。写一个基本的抓包引擎
 4。分析包。。。。(正在写作中)

------------------------------------------------------------------------------------

该文档的读者: 该指南假定你对网络有大概的了解。如:什么是包,包是如何送出的,物理层与数据链路层还有网络层等等。但是,我未假定你以前有网络编程的经验,仅仅对C有基本的知识即可。如果你已经是一个C/C++大师,那么你一定对 man 3 pcap 很熟悉,因此可以跳过我这种令人厌烦的写作风格。在你的系统上应该有已能运行的C编译器并且libpcap已经安装。该文档只涉及以太网的数据链路层。。。因此如果你使用的是其他一些令人厌恶的网络如令牌环网。。。那你得靠你自己去找到数据链路的头文件。最后,该节出现的所有的源程序在linux、内核2。2。14上编写并测试通过,虽然它应该是可移植的(呵呵)但是我不能保证它能在其他操作系统上编译通过。你将用root运行这些程序,要小心别误操作弄坏你的系统。哦,还有虽然我已经测试并运行了所有指南列出的代码,而且没有问题,但是我没有这个责任完成你的这些屁东西,而且还不得不被卫生部门隔离,你自己冒这个险吧,我不奉陪了 (恐怖的鬼叫声)。


简介:这儿就是用libpcap进行抓包指南的开始。不可避免地有问题出现了。。。“该死的抓包是什么?”或“谁是libpcap?”。。。我想我首先得回答这些问题。

  • 抓包:简单地说就是“把包抢过来”
    “哎呀,谢谢你马丁 :-P”你脱口而出。
    不,实际上,我们在这里所做的一其都是通过操作系统底层提供的设备因此可以抓到原始状态的包。例如:假定你的以太网卡从网络获得一个数据包,一旦它将这个包交给操作系统,操作系统必须确定该包是何种类型,因此它剥掉数据包的以太网头并查看下一层,也许它是一个IP包。。。现在操作系统必须剥掉IP头并确定它是哪一类型的IP包,最后, 假定它被确定为UDP包,于是UDP头被剥掉并且其负载(数据部分)被交给包所发向的应用程序(注意:这里是真实情况的极度简单版本,但是我尽量阐明重点)。我们可以通过抓报截取网卡看到的任何包,将它从头到尾全部抢过来!忽略它发往哪个断口,甚至哪个主机!!
  • libpcap “提供与实现无关的访问操作系统所提供的底层捕获机制的分组捕获函数库”(Stivens,Unix network Programming, 707 页)。libpcap就是我们将用来直接从网卡那里抢包的函数库。顺便也提一下抓包的其他方法吧,有BPF(Berkeley Packet Filter), DLPI(Data Link Prvider Interface)和SOCKET_PACKET类型套接字(仅仅在linux上)

正式开讲:有太多的东西需要讲解。。。因此让我们先熟悉libpcap吧。如我前面提及的,这节出现的所有代码假定你工作在以太网上,如果不是,这篇指南的基础部分仍然贴题,但是等会出现的代码以及对以太网头的分析显然不适合::-( *很抱歉*。 摩拳擦掌准备写我们的第一个 libpcap 程序吧!!!将下面这个例子复制到你最喜欢的编辑器里 (可能是 VIM 如果你对其感兴趣)、保存、编译它。。。
%>gcc ldev.c -lpcap


------------------------------------------------------------------------------------

/* ldev.c
   Martin Casado
   
   To compile:
   >gcc ldev.c -lpcap

   Looks for an interface, and lists the network ip
   and mask associated with that interface.
*/
#include <stdio.h>
#include <stdlib.h>
#include <pcap.h>  /* GIMME a libpcap plz! */
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char **argv)
{
  char *dev; /* name of the device to use */ 
  char *net; /* dot notation of the network address */
  char *mask;/* dot notation of the network mask    */
  int ret;   /* return code */
  char errbuf[PCAP_ERRBUF_SIZE];
  bpf_u_int32 netp; /* ip          */
  bpf_u_int32 maskp;/* subnet mask */
  struct in_addr addr;

  /* ask pcap to find a valid device for use to sniff on */
  dev = pcap_lookupdev(errbuf);

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

  /* print out device name */
  printf("DEV: %s\n",dev);

  /* ask pcap for the network address and mask of the device */
  ret = pcap_lookupnet(dev,&netp,&maskp,errbuf);

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

  /* get the network address in a human readable form */
  addr.s_addr = netp;
  net = inet_ntoa(addr);

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

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

  /* do the same as above for the device's mask */
  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

现在如果你的设备不是eth0、eth1或eth后面跟着某个数字之类的,那就会有麻烦了,因为该文档所描述的基本上都是监听以太网数据包。显然,你的IP地址和子网掩码可能与我所写的不一样,但是真实的值并不是讨论的重点。

“那我们刚才做了什么?”你问道。很好,我们刚才向 libpcap 问了要监听的接口的信息。
“什么是接口?”
把接口想象成一个将你的电脑连接到某个网络的硬件,在Linix上,eth0 表示你电脑上的第一块以太网卡,它就是我将用来示范libpcap的网络接口。现在你真正要关注的是我们获得的设备名字“eth0”, 我们将其名字传递给libpcap告诉它从哪儿抓包。NET和MASK 就是和网卡关联的IP地址和子网掩码。我希望哪天会写一个比用libpcap来列出系统信息的更好的方法 :-)

好了,现在你应该知道如何写,编译和运行一个libpcap程序,获得我们抓包的网络设备,并且对我们所做的有了基本的了解。下面,来抓我们的第一个包。。哇呜~!!

你可能感兴趣的:(用libpcap抓包并进行底层网络欺骗 --part 1)