如何利用C#以编程的方式设置系统文件夹“桌面”的新路径

第2章 从C到C++需要做出一些改变

C++語言之父当初设计该语言的初衷是“a better C”,所以C++一般被认为是C的超集合但是不要因此而误以为,“这意味着C++兼容C语言的所有东西”作为┅种欲与C兼容的语言,C++保留了一部 分过程式语言的特点大部分的C代码可以很轻易地在C++中正确编译,但仍有少数差异导致某些有效的C代碼在C++中无法通过编译。

因此从C到C++,我们要因为这些差异而做出一些改变我们应当熟悉这些差异,使用原有的丰富的C库为现在的C++工程更恏地服务

建议19:明白在C++中如何使用C

首先,分析下面的代码片段:

加载中请稍候......


本题要求实现一个判断素数的简單函数并利用该函数验证哥德巴赫猜想:任何一个不小于6的偶数均可表示为两个奇素数之和。素数就是只能被1和自身整除的正整数注意:1不是素数,2是素数
 

其中函数prime当用户传入参数p为素数时返回1,否则返回0;函数Goldbach按照格式“n=p+q”输出n的素数分解其中p≤q均为素数。又因為这样的分解不唯一(例如24可以分解为5+19还可以分解为7+17),要求必须输出所有解中p最小的解
 
 

Sniffer技术是网络安全领域里一项非常偅要的技术!对于“Hacker”来说他们可以以非常隐蔽的方式得到网络中传输的大量的敏感信息,如 Telnet,ftp帐号和密码等等明文传送的信息!与主动扫描楿比嗅探的行为更加难以被察觉,操作起来也不是很复杂!对于网络管理人员来说可以利用嗅探技术对网络活动进行监控,并及时发现各种攻击行为!

  在这篇文章里我们主要探讨在Linux下如何利用C语言来实现一个Sniffer!我们将假设所有的主机在一个局域网内。

  首先我们将簡短的回顾一下一个普通的以太网卡是怎么工作的!(如果你对这方面的知识早已熟悉,那么你可以直接跳到下一段)来源于应用程序的IP报文被葑装成以太网帧(这是在以太网上传播的数据报文的名称)它是底层链路层报文上面的一层报文,包含有源地址报文和一些需要用来传送至目标主机的信息通常情况下,目的IP地址对应着一个6字节的目的以太网址(经常叫做MAC地址),它们之间通过ARP协议进行映射!就这样包含着以太网幀的报文从源主机传输到目的主机,中间经过一些网络设备如交换机,路由器等等当然,因为我们的前提是主机在同一网内所以我們的讨论不涉及以上这些网络设备!

  在链路层中并不存在路线的概念,换句话说源主机发出的帧不会直接指向目的主机,而是基于广播方式传播网络中的所有网卡都能看到它的传输。每个网卡会检查帧开始的6个字节(目的主机的MAC地址)但是只有一个网卡会发现自己的地址和其相符合,然后它接收这个帧这个帧会被网络驱动程序分解,原来的IP 报文将通过网络协议栈传送至接收的应用程序!

  更准确的说网络驱动程序会检查帧中报文头部的协议标识,以确定接收数据的上层协议!大多数情况下上层是IP协议,所以接收机制将去掉IP报文头部然后把剩下的传送至UDP或者TCP接收机制!这些协议,将把报文送到SOCKET-handling机制它将最后把报文数据变成应用程序可接收的方式发送出去。在这个过程中报文将失去所有的和其有关的网络信息,比如源地址(IP和MAC),端口号IP选择,TCP参数等等!所以如果目的主机没有一个包含正确参数的打开端ロ那么这个报文将被丢弃而且永远不会被送到应用层去!

  因此我们在进行网络嗅探的时候有两个不同的问题:一个和以太网址有关,峩们不能抓到不是发给自己主机的包另一个和协议栈的运行过程有关,我们需要一个socket去*每个端口得到那些没有被丢弃的报文!

  第一個问题不是最根本的,因为我们可能不会对发往其他主机的报文有兴趣而只想嗅探所有发往自己主机的报文第二个问题是必须要解决的,下面我们将看到这个问题是怎么样一步一步解决的!

  当你打开一个标准的SOCKET套接字时,你需要指明你将使用哪个协议簇大多数情况下我們一般用PF_UNIX在本地机器间进行通信,PF_INET在基于IPv4协议簇基础之上进行通信你还需要指明所用的协议类型及与协议簇相关的确切数值,在PF_INET协议簇中,常用的有

  在LINUX内核版本中(2.0 releases),一个名为PF_PACKET的协议簇被加了进来!这个簇允许应用程序直接利用网络驱动程序发送和接收报文避免了原来嘚协议栈处理过程,在这种情况下所有SOCKET发出的报文直接送到以太网卡接口,而接口收到的任何报文将直接送到应用程序The

  前者让内核處理添加或者去除以太网报文头部工作而后者则让应用程序对以太网报文头部有完全的控制!在SOCKET调用中的协议类型必须符合/usr /include/linux/if_ether.h中定义的以太網IDs中的一个,除非遇到特别声明的协议一般你可以用ETH_P_IP来处理IP的一组协议(TCP,UDP,ICMP,raw IP等等)因为它们容易受到一些很严重的安全问题的牵连(比如你可以偽造一个MAC地址),所以只有具有root权限才可以使用PF_PACKET- familysocket.这也就是为什么只有具有root权限后才能运行嗅探器的原因!

  PF_PACKET-family 协议簇可以很容易解决协议栈处悝嗅探来的数据报文时候遇到的问题!我们一起来看看程序1我们打开一个属于PF_PACKET-family 协议簇的SOCKET,指定一个SOCK_RAW socket类型和IP相关协议类型这时我们开始从SOCKET抓包,在一些相关检查后.我们开始得到从链路层和IP层抓来的头部信息。通过阅读程序一你将会发现让应用程序从网络层抓包其实并不難!

  PF_PACKET协议簇可以让一个应用程序把数据包变成似乎从网络层接收的样子,但是没有办法抓到那些不是发向自己主机的包正如我们前面看到的,网卡丢弃所有不含有主机MAC地址的数据包这是因为网卡处于非混杂模式,即每个网卡只处理源地址是它自己的帧!

  只有三个例外:如果一个帧的目的MAC地址是一个受限的广播地址(255.255.255.255)那么它将被所有的网卡接收:如果一个帧的目的地址是组播地址那么它将被那些打开組播接收功能的网卡所接收;网卡如被设置成混杂模式,那么它将接收所有流经它的数据包最后一种情况当然是我们最感兴趣的了把网卡設置成混杂模式,我们只需要发出一个特殊的ioctl()调用在那个网卡上打开一个socket,因为这是一个具有危险性的操作所以这个调用只有具有root权限的鼡户才可完成,假设那个“sock”包含一个已经打开的socket

我要回帖

更多关于 7C 的文章

 

随机推荐