能力值:
( LV4,RANK:50 )
|
-
-
2 楼
RING0 下好像也是 DeviceIoControlFile 传 IOCTL_NDIS_QUERY_GLOBAL_STATS 来获取网卡MAC的吧? 效果也就是DeviceIoControl ,除了这个也没想到其他获取物理MAC的办法. 希望大神能指点一下有没有其他方式.
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
刚写的一段代码,从下面地址扣的 f68K9s2c8@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;
}

|
能力值:
( LV3,RANK:20 )
|
-
-
4 楼
其它方式也有, 比如抓取以太网报文, 不过不是单纯应用层可以做到的
|
能力值:
( LV9,RANK:150 )
|
-
-
5 楼
wmic?
|
能力值:
( LV4,RANK:50 )
|
-
-
6 楼
rrrfff
其它方式也有, 比如抓取以太网报文, 不过不是单纯应用层可以做到的
谢谢提示,不管怎样,至少知道有这么一个方式就好,以后真碰到也好理解.
|
能力值:
( LV4,RANK:50 )
|
-
-
7 楼
鼻塞
wmic?
wmic获取的应该也是虚拟MAC. CMD输入命令 wmic nic where netconnectionid!=NULL get macaddress
|
能力值:
( LV4,RANK:50 )
|
-
-
8 楼
鼻塞
wmic?
还有什么方法没,各位大佬提出来呗
|
能力值:
( LV4,RANK:50 )
|
-
-
9 楼
DeviceIoControl 容易被HOOK,比如某游加速器就是这个,HOOK后修改返回的MAC就可以无限体验加速....
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
lononan
DeviceIoControl 容易被HOOK,比如某游加速器就是这个,HOOK后修改返回的MAC就可以无限体验加速....
迅游?
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
招人,看私信
|