通过注册表以及文件操作的方式获取当前正在实际使用的物理网卡MAC地址

博客介绍了如何在存在虚拟网卡的情况下,通过遍历注册表和读取特定文件来获取实际使用的物理网卡MAC地址。作者对比了多种方法,强调了所提方法的稳定性和准确性,并且在修改MAC地址后仍能正确反映变化。此外,还提供了一种改进的常规方法,即使在MAC地址被修改后也能获取到最新的值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

获取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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值