利用Ip Helper Api 来得到局域网中计算机MAC 地址的一个程序

原创 2004年09月20日 13:31:00

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;
}

查看局域网内某个ip地址对应的mac地址以及开启的网络端口服务命令

nmap -sS 192.168.1.101 Starting Nmap 5.00 ( http://nmap.org ) at 2012-04-25 09:16 CST Interest...
  • lihui130135
  • lihui130135
  • 2012年04月25日 09:13
  • 4775

Dos命令行下,如何通过IP地址获取局域网内机器的MAC地址?

操作说明:开始 运行 cmd 进入Dos命令行。一、ipconfig /all 可以查看本机的IP地址和Mac地址(Physical Address )。二、nbtstat  -A 192.168.0...
  • wangzh2008
  • wangzh2008
  • 2005年08月08日 16:09
  • 8779

获取局域网内在线主机名及IP地址源码

使用的核心命令是“net view”,全循环变量模式! 源码如下: @echo off&title 获取局域网内在线主机名及IP地址 for /f "skip=3 delims=\" %%a in...
  • wengek
  • wengek
  • 2017年09月11日 09:08
  • 378

为什么局域网要用mac地址而不直接使用IP地址

以太网发明出来的时候,IP还没有垄断网络层协议,那时还有Novell网的IPX/SPX协议、DEC公司开发的CLNP网络协议,以及Apple公司开发的Apple Talk协议,以太网需要支持这所有的网...
  • farmwang
  • farmwang
  • 2017年03月20日 20:24
  • 408

查询局域网电脑的IP,端口号,MAC地址(黑客技术入门)

网上看到很多都是使用nmap工具,这个工具我没有使用过,我自己实现nmap工具的功能,首先我们查询局域网内有哪些电脑是alive的,下面我写了一个脚本:ping.sh   这样局域网内哪些电脑的ip是...
  • qq_21792169
  • qq_21792169
  • 2016年07月19日 13:00
  • 18792

C# 获取局域网IP和MAC地址

C#遍历局域网的几种方法及比较2009-07-03 10:08扫描局域网IP列表的几种方法很多软件都有获知局域网在线计算机IP的功能,但是在.net怎么实现呢,有好多方法,下面我给大家介绍几种,供大家...
  • mane_yao
  • mane_yao
  • 2010年05月12日 16:06
  • 4545

MAC地址 和 ARP:地址解析协议讲解

下面哪个协议被用来找到本地设备的硬件地址() 正确答案: B    RARP ARP IP IMCP MAC地址是网卡的硬件地址,这个是唯一的,不能随意修改!   如果你是通过校园...
  • qq_21989939
  • qq_21989939
  • 2015年09月17日 22:01
  • 779

【记录】通过IP地址获取局域网中设备的MAC地址——java实现

通过IP获取MAC地址——java实现
  • jiasike
  • jiasike
  • 2016年03月31日 15:27
  • 6835

qt获取内网IP、外网IP和Mac地址

重点是内网IP的获取方法,找了很长时间,也找了很多方法。外网IP和Mac地址没什么问题,话不多说,上代码: QString NetClient::getIpInfo() { //mac地址 QLi...
  • u011288190
  • u011288190
  • 2016年07月25日 10:17
  • 2236

局域网怎么通过IP查看对方MAC,用IP反查局域网MAC地址

最近几天发现公司的网络有几台没登记的IP占用很大流量,不知道是什么电脑,IP是手动设置的。我想查下MAC地址是什么,因为公司的MAC地址都有记录,并且是用MAC地址控制上网行为的。知道MAC地址的话查...
  • u013428650
  • u013428650
  • 2014年02月20日 15:57
  • 2014
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用Ip Helper Api 来得到局域网中计算机MAC 地址的一个程序
举报原因:
原因补充:

(最多只允许输入30个字)