获取MAC地址的方法很多,网上流传的大多是:
1.通过GetAdaptersInfo获取。
2.通过ipconfig/all命令获取,然后通过管道方式获取输出结果,并对结果进行分析处理。
3.使用Windows的SNMP(简单网络管理协议)扩展来取得MAC地址,据说是只有安装了该协议的才能获取,本人没有测试。
4.使用Microsoft的Netbios API。 这是一套通过Winsock提供底层网络支持的命令。使用Netbios的最大缺点是您必须在系统中安装了Netbios服务。
5.使用COM GUID API。这种方法比较不靠谱,有时获取的是随机的十六进制数。
参见:http://biancheng.dnbcw.info/vc/206196.html
通过比较以上方法可以发现,还是第一种方法比较简单和稳定一些。
但是现在的虚拟网卡特别多,尤其是安装了虚拟机等软件后。获取真实的网卡MAC地址就比较困难了,
有网友提出:
区分物理网卡和虚拟网卡:pAdapter->Description中包含"PCI"是:物理网卡。(试了3台机器可以)
区分无线网卡和有线网卡:pAdapter->Type为71的是:无线网卡。(试了2个无线网卡也可以)
经过本人的实践测试,以上说法均不对。
今天在分析逆向一个盗号木马时发现它使用了一种更为简单有效的方法:
通过遍历
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards
的子键,我这里是HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\8
可见我的网卡列表很多,8号才是我当前使用物理网卡。
Description = 基于 Marvell Yukon 88E8057 PCI-E 的通用千兆以太网控制器
ServiceName = {0E2FF64C-9EA6-43B0-A9D4-673FAED6048C}
然后打开文件
\\.\{0E2FF64C-9EA6-43B0-A9D4-673FAED6048C}
通过DeviceIoControl获取MAC地址。具体代码如下(参考:http://bbs.pediy.com/showthread.php?t=109584):
// main.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
#define OID_802_3_PERMANENT_ADDRESS 0x01010101
//#define OID_802_3_CURRENT_ADDRESS 0x01010102
#define IOCTL_NDIS_QUERY_GLOBAL_STATS 0x00170002
int GetMac(IN OUT TCHAR *szMac,IN int nBuf