ARP 欺骗的过程中,首先是要得到目标计算机的MAC 地址,通过在局域网络中发布ARP 请求可以得到目标计算机的MAC 地址,同时也可以通过这个方法来得到局域网中的存活主机的情况。
程序代码如下:
// Vin1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <iphlpapi.h>
#include "winsock2.h"
#include <malloc.h>
#include <stdlib.h>
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"IpHlpApi.lib")
UINT bVbose= 0;
BOOL IsActive(char *pDestIp);
void Usage(char *pszProm);
UINT TranToLong(char *pDestIp);
UINT NN(int nBase ,int nPoint);
BOOL LongtoString(UINT nIp, char **pRet);
int __cdecl main(int argc,char *argv[])
{
ULONG uStartIp = 0,uEndIp = 0;
//0xbe68f0f3 0x0bddca0d
if(argc != 2 && argc != 3 && argc != 4)
{
Usage(argv[0]);
return 0;
}
if(argc == 2)
{
if(!strcmp(argv[1],"-v"))
{
Usage(argv[0]);
return 0;
}
uStartIp = TranToLong(argv[1]);
uEndIp = uStartIp;
}
else if(argc == 3)
{
if(!strcmp(argv[1],"-v"))
{
bVbose ++;
uStartIp = TranToLong(argv[2]);
uEndIp = uStartIp;
bVbose ++;
}
else
{
uStartIp = TranToLong(argv[1]);
uEndIp = TranToLong(argv[2]) ;
}
}
else if(argc == 4)
{
if(!strcmp(argv[1],"-v"))
{
bVbose ++;
}
else
{
Usage(argv[0]);
return 0;
}
uStartIp = TranToLong(argv[2]);
uEndIp = TranToLong(argv[3]);
}
if(uEndIp - uStartIp < 0)
{
uStartIp += uEndIp;
uEndIp = uStartIp - uEndIp;
uStartIp = uStartIp - uEndIp;
}
char szBuf[64];
char *pTemp = szBuf;
for(UINT i = uStartIp ; i <= uEndIp ;i ++)
{
LongtoString(i,&pTemp);
IsActive(szBuf);
}
return 0;
}
BOOL IsActive(char *pDestIp)
{
HRESULT hr;
IPAddr ipAddr ;
ULONG pulMac[2];
ULONG ulLen;
if(pDestIp == NULL || strlen(pDestIp ) == 0)
{
if(bVbose)
{
printf("Input Error, the Input Ip Address is [%s]\r\n",pDestIp);
}
return FALSE;
}
ipAddr = inet_addr (pDestIp);
if(ipAddr == INADDR_NONE)
{
if(bVbose)
{
printf("Input Error, the Input Ip Address is [%s]\r\n",pDestIp);
return FALSE;
}
}
memset (pulMac, 0xff, sizeof (pulMac));
ulLen = 6;
hr = SendARP (ipAddr, 0, pulMac, &ulLen);
if(hr != NO_ERROR)
{
if(bVbose)
{
printf("IP Address : %s <===> ",pDestIp);
LPVOID lpMsgBuf;
if (FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
hr,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL ))
{
printf("Error: %s", lpMsgBuf);
}
LocalFree( lpMsgBuf );
}
return 0;
}
//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]);
}
printf("IP Address : %s <===> ",pDestIp);
sprintf (szMac + j, "%02X", pbHexMac[i]);
printf ("MAC address %s\r\n", szMac);
delete [] szMac;
return TRUE;
}
void Usage(char *pszProm)
{
printf(" You can use the program to detect if the machine is active.\r\n");
printf(" and Get the machine mac address \r\n");
printf("%s Usage : \r\n%s DestionIP or\r\n%s StartIp EndIp\r\n",pszProm,pszProm,pszProm);
}
UINT TranToLong(char *pDestIp)
{
if(pDestIp == NULL || strlen(pDestIp) == 0)
{
return -1;
}
int nDot = 0;
int nTemp = 0;
UINT nRet = 0;
char *pTemp = pDestIp;
while (nDot < 3)
{
while(*pTemp != '.')
{
pTemp ++;
}
*pTemp = '\0';
nTemp = atoi(pDestIp);
nRet += nTemp * NN(255,3 - nDot);
nDot ++;
pDestIp = pTemp + 1;
nTemp = 0;
}
nTemp = atoi(pDestIp);
nRet += nTemp;
return nRet;
}
UINT NN(int nBase ,int nPoint)
{
UINT nTmep = 1;
for(int i = 0 ;i < nPoint ; i ++)
nTmep = nTmep * nBase;
return nTmep;
}
BOOL LongtoString(UINT nIp, char **pRet)
{
char *pTemp = *pRet;
long lTemp[4] = {0};
char szBuffer[32];
**pRet = '\0';
for(int i = 0 ; i < 4; i ++)
{
lTemp[i] = nIp / (NN(255,3 - i) );
nIp -= lTemp[i] * NN (255,3 - i);
}
for(i = 0; i < 4; i ++)
{
ltoa(lTemp[i],szBuffer,10);
strcat(*pRet,szBuffer);
if(i != 3)
{
strcat(*pRet,".");
}
}
return TRUE;
}