国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
網(wǎng)卡mac地址相關信息大全(整理)(上)

首先要感謝jzyhummel(刀鋒[籬影]) 兄弟提供的部分資料^_^

 

   網(wǎng)卡地址這個概念有點混淆不清。因為實際上有兩個地址,mac地址和物理地址,一般說網(wǎng)卡地址我是指物理地址,不知道別人怎么看?物理地址指的是網(wǎng)卡上的存放地址的ROM里的地址,mac地址是這塊卡工作的時候用的地址,一般情況下這兩個地址是一樣的,所以很多人都混用了,甚至不知道有區(qū)別  -_-#

   網(wǎng)卡工作的時候,一個以太網(wǎng)幀601514(不包括crc),幀的crc是網(wǎng)卡自動加的,前導碼是自動加的。網(wǎng)卡目的地址和源地址是驅(qū)動程序加的.所以實際上網(wǎng)卡工作的時候用什么地址作為工作地址完全是由驅(qū)動程序決定的 :)因此,我們完全可以在不改變網(wǎng)卡的物理地址的情況下用軟件方法改變具體的網(wǎng)卡的工作地址.

   MAC地址一般保存在注冊表里,可以修改,于是就有下面連個問題:

   1,可以肆無忌彈的盜用ip,

   2,可以破一些垃圾加密軟件...

   很多軟件是通過網(wǎng)卡地址加密的,這里面有兩種不同。有些做的比較好的是通過物理地址加密。有些是通過工作地址加密.通過工作地址加密的像通過guidgennetbios等方法得到的地址都是mac地址。一般都可以用該方法破解。通過物理地址加密的有點難破,但是也不是沒有辦法。

 

取得系統(tǒng)中網(wǎng)卡MAC地址的三種方法

作者: QinJia

 

第一種方法使用MicrosoftNetbios API 這是一套通過Winsock提供底層網(wǎng)絡支持的命令。使用Netbios的最大缺點是您必須在系統(tǒng)中安裝了Netbios服務(如果您在windows網(wǎng)絡中啟用了文件共享的話,這就不是問題了)。除此此外,這種方法又快又準確。

 

Netbios API只包括了一個函數(shù),就叫做Netbios。這個函數(shù)使用網(wǎng)絡控制塊(network control block)結構作為參數(shù),這個結構告訴函數(shù)要做什么。結構的定義如下:

typedef struct _NCB {

UCHAR ncb_command;

UCHAR ncb_retcode;

UCHAR ncb_lsn;

UCHAR ncb_num;

PUCHAR ncb_buffer;

WORD ncb_length;

UCHAR ncb_callname[NCBNAMSZ];

UCHAR ncb_name[NCBNAMSZ];

UCHAR ncb_rto;

UCHAR ncb_sto;

void (CALLBACK *ncb_post) (struct _NCB *);

UCHAR ncb_lana_num;

UCHAR ncb_cmd_cplt;

#ifdef _WIN64

UCHAR ncb_reserve[18];

#else

UCHAR ncb_reserve[10];

#endif

HANDLE ncb_event;

} NCB, *PNCB;

 

重點在于ncb_command 成員。這個成員告訴Netbios該作什么。我們使用三個命令來探測MAC地址。他們在MSDN的定義如下:

命令描述:

NCBENUM Windows NT/2000: 列舉系統(tǒng)中網(wǎng)卡的數(shù)量。使用此命令后,ncb_buffer成員指向由LANA_ENUM結構填充的緩沖區(qū)。

NCBENUM 不是標準的 NetBIOS 3.0 命令。

 

NCBRESET 重置網(wǎng)卡。網(wǎng)卡在接受新的NCB命令之前必須重置。

NCBASTAT 接受本地或遠程接口卡的狀態(tài)。使用此命令后,ncb_buffer成員指向由ADAPTER_STATUS結構填充的緩沖區(qū),隨后是NAME_BUFFER結構的數(shù)組。

 

下面就是取得您系統(tǒng)MAC地址的步驟:

1》列舉所有的接口卡。

2》重置每塊卡以取得它的正確信息。

3》查詢接口卡,取得MAC地址并生成標準的冒號分隔格式。

 

下面就是實例源程序。

 

#include <windows.h>

#include <stdlib.h>

#include <stdio.h>

#include <iostream>

#include <string>

 

using namespace std;

#define bzero(thing,sz) memset(thing,0,sz)

 

bool GetAdapterInfo(int adapter_num, string &mac_addr)

{

// 重置網(wǎng)卡,以便我們可以查詢

NCB Ncb;

memset(&Ncb, 0, sizeof(Ncb));

Ncb.ncb_command = NCBRESET;

Ncb.ncb_lana_num = adapter_num;

if (Netbios(&Ncb) != NRC_GOODRET) {

mac_addr = "bad (NCBRESET): ";

mac_addr += string(Ncb.ncb_retcode);

return false;

}

 

// 準備取得接口卡的狀態(tài)塊

bzero(&Ncb,sizeof(Ncb);

Ncb.ncb_command = NCBASTAT;

Ncb.ncb_lana_num = adapter_num;

strcpy((char *) Ncb.ncb_callname, "*");

struct ASTAT

{

ADAPTER_STATUS adapt;

NAME_BUFFER NameBuff[30];

} Adapter;

bzero(&Adapter,sizeof(Adapter));

Ncb.ncb_buffer = (unsigned char *)&Adapter;

Ncb.ncb_length = sizeof(Adapter);

 

// 取得網(wǎng)卡的信息,并且如果網(wǎng)卡正常工作的話,返回標準的冒號分隔格式。

if (Netbios(&Ncb) == 0)

{

char acMAC[18];

sprintf(acMAC, "%02X:%02X:%02X:%02X:%02X:%02X",

int (Adapter.adapt.adapter_address[0]),

int (Adapter.adapt.adapter_address[1]),

int (Adapter.adapt.adapter_address[2]),

int (Adapter.adapt.adapter_address[3]),

int (Adapter.adapt.adapter_address[4]),

int (Adapter.adapt.adapter_address[5]));

mac_addr = acMAC;

return true;

}

else

{

mac_addr = "bad (NCBASTAT): ";

mac_addr += string(Ncb.ncb_retcode);

return false;

}

}

 

int main()

{

// 取得網(wǎng)卡列表

LANA_ENUM AdapterList;

NCB Ncb;

memset(&Ncb, 0, sizeof(NCB));

Ncb.ncb_command = NCBENUM;

Ncb.ncb_buffer = (unsigned char *)&AdapterList;

Ncb.ncb_length = sizeof(AdapterList);

Netbios(&Ncb);

 

// 取得本地以太網(wǎng)卡的地址

string mac_addr;

for (int i = 0; i < AdapterList.length - 1; ++i)

{

if (GetAdapterInfo(AdapterList.lana, mac_addr))

{

cout << "Adapter " << int (AdapterList.lana) <<

"'s MAC is " << mac_addr << endl;

}

else

{

cerr << "Failed to get MAC address! Do you" << endl;

cerr << "have the NetBIOS protocol installed?" << endl;

break;

}

}

 

return 0;

}

 

第二種方法-使用COM GUID API

這種方法使用COM API創(chuàng)建一個GUID(全局唯一標識符)并從那里繼承MAC地址。GUID通常用來標識COM組件以及系統(tǒng)中的其他對象。它們是由MAC地址(結合其他東西)計算得來的,表面上MAC地址就包含在其中。我說表面上是因為事實上并沒有包含。

我提供這種方法更多的是為了作為反面教材。您也許用這種方法能夠得到MAC地址,但有時候您只會得到隨機的十六進制數(shù)值。

下面的例子十分簡單,無需多講。我們使用CoCreateGuid創(chuàng)建GUID,并將最后六個字節(jié)放入字符串中。它們可能是MAC地址,但并不是必然的。

 

#include <windows.h>

#include <iostream>

#include <conio.h>

 

using namespace std;

 

int main()

{

cout << "MAC address is: ";

 

// COM要求一個UUID。如果機器中有以太網(wǎng)卡,

// UUID最后的六個字節(jié)(Data427字節(jié))應該是本地以太網(wǎng)卡的MAC地址。

GUID uuid;

CoCreateGuid(&uuid);

// Spit the address out

char mac_addr[18];

sprintf(mac_addr,"%02X:%02X:%02X:%02X:%02X:%02X",

uuid.Data4[2],uuid.Data4[3],uuid.Data4[4],

uuid.Data4[5],uuid.Data4[6],uuid.Data4[7]);

cout << mac_addr << endl;

getch();

return 0;

}

 

 

第三種方法- 使用SNMP擴展API

我要討論的第三種方法是使用WindowsSNMP(簡單網(wǎng)絡管理協(xié)議)擴展來取得MAC地址。在我的經(jīng)驗里,這個協(xié)議很簡單。代碼也是直勾勾的向前的?;静襟E和Netbios相同:

1》取得網(wǎng)卡列表

2》查詢每塊卡的類型和MAC地址

3》保存當前網(wǎng)卡

我個人對SNMP了解不多,但如我剛剛所言,代碼十分清楚。

 

#include <snmp.h>

#include <conio.h>

#include <stdio.h>

 

typedef bool(WINAPI * pSnmpExtensionInit) (

IN DWORD dwTimeZeroReference,

OUT HANDLE * hPollForTrapEvent,

OUT AsnObjectIdentifier * supportedView);

 

typedef bool(WINAPI * pSnmpExtensionTrap) (

OUT AsnObjectIdentifier * enterprise,

OUT AsnInteger * genericTrap,

OUT AsnInteger * specificTrap,

OUT AsnTimeticks * timeStamp,

OUT RFC1157VarBindList * variableBindings);

 

typedef bool(WINAPI * pSnmpExtensionQuery) (

IN BYTE requestType,

IN OUT RFC1157VarBindList * variableBindings,

OUT AsnInteger * errorStatus,

OUT AsnInteger * errorIndex);

 

typedef bool(WINAPI * pSnmpExtensionInitEx) (

OUT AsnObjectIdentifier * supportedView);

 

void main()

{

HINSTANCE m_hInst;

pSnmpExtensionInit m_Init;

pSnmpExtensionInitEx m_InitEx;

pSnmpExtensionQuery m_Query;

pSnmpExtensionTrap m_Trap;

HANDLE PollForTrapEvent;

AsnObjectIdentifier SupportedView;

UINT OID_ifEntryType[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 3};

UINT OID_ifEntryNum[] = {1, 3, 6, 1, 2, 1, 2, 1};

UINT OID_ipMACEntAddr[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 6};

AsnObjectIdentifier MIB_ifMACEntAddr =

{ sizeof(OID_ipMACEntAddr) sizeof(UINT), OID_ipMACEntAddr };

AsnObjectIdentifier MIB_ifEntryType =

{sizeof(OID_ifEntryType) sizeof(UINT), OID_ifEntryType};

AsnObjectIdentifier MIB_ifEntryNum =

{sizeof(OID_ifEntryNum) sizeof(UINT), OID_ifEntryNum};

RFC1157VarBindList varBindList;

RFC1157VarBind varBind[2];

AsnInteger errorStatus;

AsnInteger errorIndex;

AsnObjectIdentifier MIB_NULL = {0, 0};

int ret;

int dtmp;

int i = 0, j = 0;

bool found = false;

char TempEthernet[13];

m_Init = NULL;

m_InitEx = NULL;

m_Query = NULL;

m_Trap = NULL;

 

/* 載入SNMP DLL并取得實例句柄 */

m_hInst = LoadLibrary("inetmib1.dll");

if (m_hInst < (HINSTANCE) HINSTANCE_ERROR)

{

m_hInst = NULL;

return;

}

m_Init =

(pSnmpExtensionInit) GetProcAddress(m_hInst, "SnmpExtensionInit");

m_InitEx =

(pSnmpExtensionInitEx) GetProcAddress(m_hInst,

"SnmpExtensionInitEx");

m_Query =

(pSnmpExtensionQuery) GetProcAddress(m_hInst,

"SnmpExtensionQuery");

m_Trap =

(pSnmpExtensionTrap) GetProcAddress(m_hInst, "SnmpExtensionTrap");

m_Init(GetTickCount(), &PollForTrapEvent, &SupportedView);

 

/* 初始化用來接收m_Query查詢結果的變量列表 */

varBindList.list = varBind;

varBind[0].name = MIB_NULL;

varBind[1].name = MIB_NULL;

 

/* OID中拷貝并查找接口表中的入口數(shù)量 */

varBindList.len = 1; /* Only retrieving one item */

SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryNum);

ret =

m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus,

&errorIndex);

printf("# of adapters in this system : %in",

varBind[0].value.asnValue.number);

varBindList.len = 2;

 

/* 拷貝OIDifType-接口類型 */

SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryType);

 

/* 拷貝OIDifPhysAddress-物理地址 */

SNMP_oidcpy(&varBind[1].name, &MIB_ifMACEntAddr);

 

do

{

 

/* 提交查詢,結果將載入 varBindList。

可以預料這個循環(huán)調(diào)用的次數(shù)和系統(tǒng)中的接口卡數(shù)量相等 */

ret =

m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus,

&errorIndex);

if (!ret)

ret = 1;

else

/* 確認正確的返回類型 */

ret = SNMP_oidncmp(&varBind[0].name, &MIB_ifEntryType,

MIB_ifEntryType.idLength);

 if (!ret) {

j++;

dtmp = varBind[0].value.asnValue.number;

printf("Interface #%i type : %in", j, dtmp);

 

/* Type 6 describes ethernet interfaces */

if (dtmp == 6)

{

 

/* 確認我們已經(jīng)在此取得地址 */

ret =

SNMP_oidncmp(&varBind[1].name, &MIB_ifMACEntAddr,

MIB_ifMACEntAddr.idLength);

if ((!ret) && (varBind[1].value.asnValue.address.stream != NULL))

{

if((varBind[1].value.asnValue.address.stream[0] == 0x44)

&& (varBind[1].value.asnValue.address.stream[1] == 0x45)

&& (varBind[1].value.asnValue.address.stream[2] == 0x53)

&& (varBind[1].value.asnValue.address.stream[3] == 0x54)

&& (varBind[1].value.asnValue.address.stream[4] == 0x00))

{

/* 忽略所有的撥號網(wǎng)絡接口卡 */

printf("Interface #%i is a DUN adaptern", j);

continue;

}

if ((varBind[1].value.asnValue.address.stream[0] == 0x00)

&& (varBind[1].value.asnValue.address.stream[1] == 0x00)

&& (varBind[1].value.asnValue.address.stream[2] == 0x00)

&& (varBind[1].value.asnValue.address.stream[3] == 0x00)

&& (varBind[1].value.asnValue.address.stream[4] == 0x00)

&& (varBind[1].value.asnValue.address.stream[5] == 0x00))

{

/* 忽略由其他的網(wǎng)絡接口卡返回的NULL地址 */

printf("Interface #%i is a NULL addressn", j);

continue;

}

sprintf(TempEthernet, "%02x%02x%02x%02x%02x%02x",

varBind[1].value.asnValue.address.stream[0],

varBind[1].value.asnValue.address.stream[1],

varBind[1].value.asnValue.address.stream[2],

varBind[1].value.asnValue.address.stream[3],

varBind[1].value.asnValue.address.stream[4],

varBind[1].value.asnValue.address.stream[5]);

printf("MAC Address of interface #%i: %sn", j, TempEthernet);}

}

}

} while (!ret); /* 發(fā)生錯誤終止。 */

getch();

 

FreeLibrary(m_hInst);

/* 解除綁定 */

SNMP_FreeVarBind(&varBind[0]);

SNMP_FreeVarBind(&varBind[1]);

}

 

 

得到物理地址的方法對于不同的網(wǎng)卡是不同的,不過都是操作io端口,端口的具體地址要看具體芯片的說明書。加密軟件要得到物理地址,不能用這個方法。一般來說,是在核心態(tài)用NDISREQUEST來得到的。這里提供一個應用層的方法。

要扯到NDISREQUEST,就要扯遠了,還是打住吧...

ndis規(guī)范中說明,網(wǎng)卡驅(qū)動程序支持ioctl_ndis_query_stats接口:

參數(shù)如下:

OID_802_3_PERMANENT_ADDRESS :物理地址

OID_802_3_CURRENT_ADDRESS   mac地址

于是我們的方法就得到了。

首先,看看注冊表,找一找網(wǎng)卡有幾塊,分別是什么設備名。

具體位置和os有關,2000下在hlm/software/microsoft/windows nt/current version/networkcards。然后createfile(devicename,...)注意,要用linkname,因此

還要加上"http:////.//device//".

然后deviceiocontrol(hmac,IOCTL_NDIS_QUERY_STATS,

OID_802_3_PERMANENT_ADDRESS/OID_802_3_CURRENT_ADDRESS...)

具體的情況可以參看ddk下的

OID_802_3_CURRENT_ADDRESS條目。

于是我們就得到了mac地址和物理地址。

 

 

--------------------------------------------------------------------------------

jzyhummel(刀鋒[籬影]):關于如何修改mac地址,沒有太多的講的必要,反正和注冊表有關,下面帖一點如何修改網(wǎng)卡物理地址的東西:

 

可以直接從eeprom讀取或修改(如:8029AS采用的是93c46芯片)

不過網(wǎng)卡的芯片不同,讀取得方式不同。

如讀取8029ASeepromMACOFFSET 0001h;實際ADDRESS I/O+01

MAC存入在EEPROMADDRESS 1h,2h,3h;

如讀取8139CL)的EEPROM(93c46)OFFSET 0050h;實際 I/O+0x50

MAC存入在EEPROM中,ADDRESS 7h,8h,9h中;

系統(tǒng)實際使用的MAC放在8139chin register中,偏移地址是 0000h,0001h,0002h,0003h,0004h,0005h

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
電腦機器碼在哪里查詢
更改網(wǎng)卡MAC地址
【W(wǎng)in7操作系統(tǒng)下修改MAC地址的方法】
通過注冊表修改MAC地址的方法
如何用VB獲得機器的MAC地址
IP地址和WAC地址的區(qū)別
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服