首页
社区
课程
招聘
[求助]请教一个关于网卡物理MAC的问题
发表于: 2017-10-23 23:22 4843

[求助]请教一个关于网卡物理MAC的问题

2017-10-23 23:22
4843
很多软件硬件加密,硬件验证都是通过网卡物理MAC来计算的
我所知道的获取网卡物理MAC的就一种方式, DeviceIoControl --> IOCTL_NDIS_QUERY_GLOBAL_STATS (百度这个关键词,可以出来一大堆)
请问一下,是否还有其他获取网卡物理MAC的方式,最终是不是也调用 DeviceIoControl --> IOCTL_NDIS_QUERY_GLOBAL_STATS
有知道的大神希望能帮忙解答下....




[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 8437
活跃值: (6358)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
RING0  下好像也是  DeviceIoControlFile  传  IOCTL_NDIS_QUERY_GLOBAL_STATS  来获取网卡MAC的吧?
效果也就是DeviceIoControl  ,除了这个也没想到其他获取物理MAC的办法.
希望大神能指点一下有没有其他方式.
2017-10-23 23:27
0
雪    币: 8437
活跃值: (6358)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
刚写的一段代码,从下面地址扣的
5efK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0M7$3c8F1i4K6u0W2L8h3W2U0M7X3!0K6L8$3k6@1i4K6u0W2j5$3!0E0i4K6u0r3k6h3&6Q4x3X3c8#2M7#2)9J5c8X3I4A6j5Y4u0S2M7Y4W2Q4x3V1k6S2j5e0x3$3y4e0V1I4y4H3`.`.
#include "stdafx.h"

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <WinSock2.h>
#include <Iphlpapi.h>
#include <Ntddndis.h>

#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
bool GetPhyMacAddress(char* svr_name, char *sRet);
int main()
{
	PIP_ADAPTER_INFO pAdapter = NULL;
	DWORD dwRetVal = 0;
	char PhyMAC[100] = { 0 };


	ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
	pAdapter = (IP_ADAPTER_INFO *)MALLOC(sizeof(IP_ADAPTER_INFO));
	if (pAdapter == NULL) {
		printf("Error allocating memory needed to call GetAdaptersinfo\n");
		return 1;
	}
	// Make an initial call to GetAdaptersInfo to get
	// the necessary size into the ulOutBufLen variable
	if (GetAdaptersInfo(pAdapter, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
		FREE(pAdapter);
		pAdapter = (IP_ADAPTER_INFO *)MALLOC(ulOutBufLen);
		if (pAdapter == NULL) {
			printf("Error allocating memory needed to call GetAdaptersinfo\n");
			return 1;
		}
	}

	if ((dwRetVal = GetAdaptersInfo(pAdapter, &ulOutBufLen)) == NO_ERROR) {

		while (pAdapter) {
			printf("网卡名称:    %s \n", pAdapter->AdapterName);
			printf("虚拟MAC :    ");
			if (pAdapter->AddressLength==6)
			{
				printf("%02X-%02X-%02X-%02X-%02X-%02X \n", 
					pAdapter->Address[0],
					pAdapter->Address[1],
					pAdapter->Address[2],
					pAdapter->Address[3],
					pAdapter->Address[4],
					pAdapter->Address[5]
				);
			}
			
			RtlZeroMemory(PhyMAC,100);
			GetPhyMacAddress(pAdapter->AdapterName, PhyMAC);
			printf("物理MAC :    %s \n", PhyMAC);

			pAdapter = pAdapter->Next;
			printf("-------------------------------------------------------------\n");
		}
	}
	else {
		printf("GetAdaptersInfo failed with error: %d\n", dwRetVal);

	}
	if (pAdapter)
	{
		FREE(pAdapter);
	}

	getchar();
	return 0;


}

bool GetPhyMacAddress(char* svr_name, char* sRet)
{
	bool bRet = false;
	char pstrBuf[512] = { 0 };

	sprintf_s(pstrBuf, "//./%s", svr_name);


	HANDLE hDev = CreateFileA(pstrBuf, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
	//printf("hDev: \t%d\n", hDev);
	if (hDev != INVALID_HANDLE_VALUE)
	{
		int inBuf;
		BYTE outBuf[256] = { 0 };
		DWORD BytesReturned;
		inBuf = OID_802_3_CURRENT_ADDRESS;

		BOOL bRetValue = DeviceIoControl(hDev, IOCTL_NDIS_QUERY_GLOBAL_STATS, (LPVOID)&inBuf, 4, outBuf, 256, &BytesReturned, NULL);
		if (bRetValue)
		{
			inBuf = OID_802_3_PERMANENT_ADDRESS;
			bRetValue = DeviceIoControl(hDev, IOCTL_NDIS_QUERY_GLOBAL_STATS, (LPVOID)&inBuf, 4, outBuf, 256, &BytesReturned, NULL);
			if (bRetValue)
			{
				
				sprintf_s(sRet,100, "%02X-%02X-%02X-%02X-%02X-%02X", outBuf[0], outBuf[1], outBuf[2], outBuf[3], outBuf[4], outBuf[5]);

			}
		}

		bRet = (bRetValue == TRUE) ? true : false;
		CloseHandle(hDev);
	}

	return bRet;
}

应该没毛病.

2017-10-24 00:23
0
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
其它方式也有,  比如抓取以太网报文,  不过不是单纯应用层可以做到的
2017-10-24 09:56
0
雪    币: 5
活跃值: (10)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
5
wmic?
2017-10-24 11:16
0
雪    币: 8437
活跃值: (6358)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
rrrfff 其它方式也有, 比如抓取以太网报文, 不过不是单纯应用层可以做到的
谢谢提示,不管怎样,至少知道有这么一个方式就好,以后真碰到也好理解.
2017-10-24 11:31
0
雪    币: 8437
活跃值: (6358)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
鼻塞 wmic?
wmic获取的应该也是虚拟MAC.  CMD输入命令  wmic  nic  where  netconnectionid!=NULL  get  macaddress
2017-10-24 11:33
0
雪    币: 8437
活跃值: (6358)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
鼻塞 wmic?
还有什么方法没,各位大佬提出来呗
2017-10-24 11:36
0
雪    币: 8437
活跃值: (6358)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
DeviceIoControl  容易被HOOK,比如某游加速器就是这个,HOOK后修改返回的MAC就可以无限体验加速....
2017-10-24 11:39
0
雪    币: 15
活跃值: (586)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
lononan DeviceIoControl 容易被HOOK,比如某游加速器就是这个,HOOK后修改返回的MAC就可以无限体验加速....
迅游?
2017-10-24 13:52
0
雪    币: 91
活跃值: (636)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
招人,看私信
2017-11-1 01:11
0
游客
登录 | 注册 方可回帖
返回