求助:请问如何获得网卡的物理地址?(200)

  • 主题发起人 主题发起人 caibw
  • 开始时间 开始时间
C

caibw

Unregistered / Unconfirmed
GUEST, unregistred user!
网卡地址有两种,一种是网卡的真实物理地址这个与操作系统无关,占且称为硬地址,一种是在操作系统启动后能修改的地址,占且称为软地址,请问哪位大侠能告诉一下,怎么获得网卡的硬地址?软地址获得方法我有看到,通过"NCB"获得。
 
自己先顶一下,急求解!
 
好像没人解啊,说说我的意图吧!我想取硬件指纹加密,想用网卡地址从而验证客户端的唯一性,但是发现在windows下网卡软地址是记在注册表中,而且用户可以修改。所以想能不能取到网卡本身的真实地址,求解中!
 
我以前收藏的~~~你看看~~~unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; procedure Button1Click(Sender: TObject); private procedure GetAdapterInformation; { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} const MAX_HOSTNAME_LEN = 128; { from IPTYPES.H } MAX_DOMAIN_NAME_LEN = 128; MAX_SCOPE_ID_LEN = 256; MAX_ADAPTER_NAME_LENGTH = 256; MAX_ADAPTER_DESCRIPTION_LENGTH = 128; MAX_ADAPTER_ADDRESS_LENGTH = 8; type TIPAddressString = array[0..4*4-1] of Char; PIPAddrString = ^TIPAddrString; TIPAddrString = record Next : PIPAddrString; IPAddress: TIPAddressString; IPMask : TIPAddressString; Context : Integer; end; PFixedInfo = ^TFixedInfo; TFixedInfo = record { FIXED_INFO } HostName : array[0..MAX_HOSTNAME_LEN+3] of Char; DomainName : array[0..MAX_DOMAIN_NAME_LEN+3] of Char; CurrentDNSServer: PIPAddrString; DNSServerList : TIPAddrString; NodeType : Integer; ScopeId : array[0..MAX_SCOPE_ID_LEN+3] of Char; EnableRouting : Integer; EnableProxy : Integer; EnableDNS : Integer; end; PIPAdapterInfo = ^TIPAdapterInfo; TIPAdapterInfo = record { IP_ADAPTER_INFO } Next : PIPAdapterInfo; ComboIndex : Integer; AdapterName : array[0..MAX_ADAPTER_NAME_LENGTH+3] of Char; Description : array[0..MAX_ADAPTER_DESCRIPTION_LENGTH+3] of Char; AddressLength : Integer; Address : array[1..MAX_ADAPTER_ADDRESS_LENGTH] of Byte; Index : Integer; _Type : Integer; DHCPEnabled : Integer; CurrentIPAddress : PIPAddrString; IPAddressList : TIPAddrString; GatewayList : TIPAddrString; DHCPServer : TIPAddrString; HaveWINS : Bool; PrimaryWINSServer : TIPAddrString; SecondaryWINSServer: TIPAddrString; LeaseObtained : Integer; LeaseExpires : Integer; end; function GetNetworkParams(FI: PFixedInfo; var BufLen: Integer): Integer; stdcall; external 'iphlpapi.dll' Name 'GetNetworkParams'; function GetAdaptersInfo(AI: PIPAdapterInfo; var BufLen: Integer): Integer; stdcall; external 'iphlpapi.dll' Name 'GetAdaptersInfo'; function GetNetworkParameters: string; //得到机器的名称 var FI: PFixedInfo; Size: Integer; Res: Integer; begin Size := 1024; GetMem(FI,Size); Res := GetNetworkParams(FI,Size); if (Res <> ERROR_SUCCESS) then begin SetLastError(Res); RaiseLastOSError; end; result := FI^.HostName; FreeMem(FI); end; function MACToStr(ByteArr: PByte; Len: Integer): string; //把MAC转换为字符串 begin Result := ''; while (Len > 0) do begin Result := Result+IntToHex(ByteArr^,2)+'-'; ByteArr := Pointer(Integer(ByteArr)+SizeOf(Byte)); Dec(Len); end; SetLength(Result,Length(Result)-1); { remove last dash } end; procedure TForm1.GetAdapterInformation; //将MAC码写到文本框中 var AI, Work: PIPAdapterInfo; Size: Integer; Res: Integer; I: Integer; begin Size := 5120; GetMem(AI, Size); Res := GetAdaptersInfo(AI, Size); if (Res <> ERROR_SUCCESS) then begin SetLastError(Res); RaiseLastOSError; end; with Memo1.Lines do begin Work := AI; //适配器信息 I := 1; repeat Add(''); Add('适配器 '+IntToStr(I)); //适配器编号 Add(' 适配器MAC: '+MACToStr(@Work^.Address,Work^.AddressLength)); //MAC Inc(I); Work := Work^.Next; until (Work = nil); end; FreeMem(AI); end; procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Lines.Clear; Memo1.Lines.Add('主机名称:' + GetNetworkParameters); GetAdapterInformation; end; end.
 
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, NB30;type PASTAT = ^TASTAT; TASTAT = record adapter: TAdapterStatus; name_buf: TNameBuffer; end;type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}function Getmac: string;var ncb: TNCB; s: string; adapt: TASTAT; lanaEnum: TLanaEnum; i, j, m: integer; strPart, strMac: string;begin FillChar(ncb, SizeOf(TNCB), 0); ncb.ncb_command := Char(NCBEnum); ncb.ncb_buffer := PChar(@lanaEnum); ncb.ncb_length := SizeOf(TLanaEnum); s := Netbios(@ncb); for i := 0 to integer(lanaEnum.Length) - 1 do begin FillChar(ncb, SizeOf(TNCB), 0); ncb.ncb_command := Char(NCBReset); ncb.ncb_lana_num := lanaEnum.lana; Netbios(@ncb); Netbios(@ncb); FillChar(ncb, SizeOf(TNCB), 0); ncb.ncb_command := Chr(NCBAstat); ncb.ncb_lana_num := lanaEnum.lana; ncb.ncb_callname := '* '; ncb.ncb_buffer := PChar(@adapt); ncb.ncb_length := SizeOf(TASTAT); m := 0; if (Win32Platform = VER_PLATFORM_WIN32_NT) then m := 1; if m = 1 then begin if Netbios(@ncb) = Chr(0) then strMac := ''; for j := 0 to 5 do begin strPart := IntToHex(integer(adapt.adapter.adapter_address[j]), 2); strMac := strMac + strPart + '-'; end; SetLength(strMac, Length(strMac) - 1); end; if m = 0 then if Netbios(@ncb) <> Chr(0) then begin strMac := ''; for j := 0 to 5 do begin strPart := IntToHex(integer(adapt.adapter.adapter_address[j]), 2); strMac := strMac + strPart + '-'; end; SetLength(strMac, Length(strMac) - 1); end; end; result := strMac;end;procedure TForm1.Button1Click(Sender: TObject);begin Edit1.Text := Getmac;end;end.
 
to de410 经测试,得到的是网卡软地址。还是非常感谢分享。
 
to nanshan 谢谢分享,还是得到是可变的网卡地址!
 
请哪位知道的,不吝指点一哈!
 
除非是专门针对特定的网卡,否则是不可能的,你想一下为什么不同的网卡要不同的驱动就明白了。另一个例子,原来8029和8139网卡的驱动有在DOS下修改MAC的相关程序,这说明物理MAC也是靠不住的。楼主还是放弃吧
 
首先我也不是十分确定我的说法一定正确,但我的解释应该对你有用.网卡实际上就只有一个物理地址,这个地址是保存在网卡的一块芯片上的,好像是叫EPROM,在安装驱动程序的时候,会把这个MAC地址读到注册表中,然后一般的程序访问网卡的物址地址,实际上就是读这个注册表MAC地址.我估计你说的硬件物理地址和软地址应该就是指的这种吧?但是这个网卡自身的物理地址也是可以改变的,所以如果你拿来加密,对于高手那是徒劳的.以前在做无盘的时候,有时候为了管理的方便,我们经常改这个物理地址,那时候还是DOS时代,有专门的三方软件改MAC地址,改变之后,你装一个启动芯片一看,物理地址跟着就改了.
 
不用搞的太复杂。xp下我想可以很简单的把mac搞到:(1)写条指令运行一下这个命令: cmd.exe /c ipconfig/all >c:/mac.txt(2)读取c:/mac.txt中含有“Physical Address”的行,再取该行最后17位字符。可别说这个不会。呵呵~~楼上所说的mac也可以改虽不错,但那是其它问题了。至于执行(1)时闪过的黑窗也是可以hide掉的。
 
to del520我想表达的跟你叙述的意思一样。现在我只需要读取最原始的MAC地址的方法。我测了下,我把网卡地址键入一个16位的值,改了之后,在选择”不存在“,网卡地址还是之前默认的网卡地址,也就是说操作系统能通过操作实时得到网卡的最初地址,我想那个地址就应该是网卡芯片中的地址。既然操作系统能做到,我想还是有方法的,不知道还有没有人知道啊?
 
TO lps 我懂你说的意思了。要换思路了!谢谢!
 
多人接受答案了。
 
完全放弃MAC也是没有必要的,软件加密和保护这个东西是没有绝对的。
 
后退
顶部