明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

使用ARP探測以太網(wǎng)中的活動主機

[摘要]網(wǎng)上存在很多關(guān)于ARP的文章, 大多都是關(guān)于ARP欺騙, 這里介紹ARP的另類用法:探測目標(biāo)主機是否處于活動狀態(tài)。   傳統(tǒng)探測遠(yuǎn)程主機是否存活的方法是通過ICMP協(xié)議中的回顯應(yīng)答報文來探測(pi...

網(wǎng)上存在很多關(guān)于ARP的文章, 大多都是關(guān)于ARP欺騙, 這里介紹ARP的另類用法:探測目標(biāo)主機是否處于活動狀態(tài)。

  傳統(tǒng)探測遠(yuǎn)程主機是否存活的方法是通過ICMP協(xié)議中的回顯應(yīng)答報文來探測(ping)。 隨著對安全的越來越多的了解和重視, 很多主機為了避免被掃描器探測, 通過防火墻將ICMP包屏蔽, 從而達(dá)到在網(wǎng)絡(luò)中隱藏的目的。

  這里我們介紹一下利用ARP協(xié)議探測網(wǎng)絡(luò)中的活動主機的思路, 這種方法的缺點只能探測以太網(wǎng)內(nèi)的活動主機。

  先大概了解一下ARP協(xié)議。 ARP協(xié)議是“Address Resolution Protocol”(地址解析協(xié)議)的縮寫, 它的作用是將IP地址轉(zhuǎn)換成物理地址(就是常說的MAC地址), 其詳細(xì)過程參考《TCP/IP詳解 卷一》。 協(xié)議ARP的分組格式如下:

  ------------------------------------------

  以太網(wǎng)目的地址(6個字節(jié))

  以太網(wǎng)源地址(6個字節(jié))

  幀類型(ARP = 0806)(2個字節(jié))

  ------------------------------------------

  硬件類型(Ethernet=01)(2個字節(jié))

  協(xié)議類型(IPv4=0800)(2個字節(jié))

  硬件地址長度(1個字節(jié))

  協(xié)議地址長度(1個字節(jié))

  OP操作選項(ARP request=01,ARP reply=02)(2個字節(jié))

  發(fā)送端以太網(wǎng)地址(6個字節(jié))

  發(fā)送端IP地址(4個字節(jié))

  目的以太網(wǎng)地址(6個字節(jié))

  目的IP地址(4個字節(jié))

  --------------------------------------------

  我們向目標(biāo)主機發(fā)送一個ARP請求, 如果目標(biāo)主機處于活動狀態(tài)則會返回其MAC地址, 如果對方返回MAC地址, 則表明對方處于活動狀態(tài), 這樣達(dá)到探測目的。 ARP請求包內(nèi)容如下:

  ------------------------------------------

  以太網(wǎng)目的地址  FFFFFFFFFFFF(廣播地址)

  以太網(wǎng)源地址   本地MAC地址

  幀類型       0806

  ------------------------------------------

  硬件類型     01

  協(xié)議類型     0800

  硬件地址長度   06

  協(xié)議地址長度   04

  OP操作選項    01

  發(fā)送端以太網(wǎng)地址 本地MAC地址

  發(fā)送端IP地址   目標(biāo)主機IP地址

  目的以太網(wǎng)地址  000000000000

  目的IP地址    目標(biāo)主機IP地址

  --------------------------------------------

  注意:這里以太網(wǎng)目的地址為FFFFFFFFFFFF, 這是廣播地址, 以太網(wǎng)上所有主機都能收到這個包, 在收到這個數(shù)據(jù)包后, 操作系統(tǒng)判斷目的IP地址是不是這臺主機, 如果不是則丟棄(不作處理), 否則發(fā)送回一個ARP應(yīng)答包, 包的內(nèi)容如下:

  ------------------------------------------

  以太網(wǎng)目的地址  探測主機的MAC地址

  以太網(wǎng)源地址   本地MAC地址  (這里本地指被探測主機)

  幀類型       0806

  ------------------------------------------

  硬件類型     01

  協(xié)議類型     0800

  硬件地址長度   06

  協(xié)議地址長度   04

  OP操作選項    02

  發(fā)送端以太網(wǎng)地址 本地MAC地址  (這里本地指被探測主機)

  發(fā)送端IP地址   本機IP地址  (這里本地指被探測主機)

  目的以太網(wǎng)地址  探測主機的MAC地址

  目的IP地址    探測主機的IP地址

  --------------------------------------------

  我們可以使用Pcap自己來構(gòu)造這個數(shù)據(jù)包(具體過程參考Pcap的相關(guān)文檔, 這里我們使用SendARP()來實現(xiàn)),SendARP()是Microsoft Platform SDK中提供用來獲得目標(biāo)主機的MAC地址的函數(shù), SendARPSendARP的函數(shù)原型如下:

  DWORD SendARP(

  IPAddr DestIP,   // 目標(biāo)IP地址

  IPAddr SrcIP,   // 源IP地址

  PULONG pMacAddr,  // 返回MAC地址指針

  PULONG PhyAddrLen // 返回MAC地址長度

  );

  下面這個例子摘至MSND, 稍做改動可以成為一個以太網(wǎng)內(nèi)活動主機探測工具

  //

  // Link with ws2_32.lib and iphlpapi.lib

  //

  #include

  #include

  #include

  #include

  int __cdecl main()

  {

  HRESULT hr;

  IPAddr ipAddr;

  ULONG  pulMac[2];

  ULONG  ulLen;

  ipAddr = inet_addr ("192.168.0.1");

  memset (pulMac, 0xff, sizeof (pulMac));

  ulLen = 6;

  hr = SendARP (ipAddr, 0, pulMac, &ulLen);

  printf ("Return %08x, length %8d\n", hr, ulLen);

  size_t i, j;

  char * szMac = new char[ulLen*3];

  PBYTE pbHexMac = (PBYTE) pulMac;

  //

  // Convert the binary MAC address into human-readable

  //

  for (i = 0, j = 0; i < ulLen - 1; ++i) {

  j += sprintf (szMac + j, "%02X:", pbHexMac[i]);

  }

  sprintf (szMac + j, "%02X", pbHexMac[i]);

  printf ("MAC address %s\n", szMac);

  delete [] szMac;

  return 0;


上面是電腦上網(wǎng)安全的一些基礎(chǔ)常識,學(xué)習(xí)了安全知識,幾乎可以讓你免費電腦中毒的煩擾。