首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

上面的代码,不能获取的物理地址?

2013-02-19 
下面的代码,不能获取的物理地址?!本帖最后由 bcrun 于 2013-02-08 19:44:40 编辑http://www.codefans.net/

下面的代码,不能获取的物理地址?!
本帖最后由 bcrun 于 2013-02-08 19:44:40 编辑 http://www.codefans.net/soft/12868.shtml
在上面的地址下载了一个据说是可以获取网卡的物理地址的代码,在我的系统下(Windows2003单网卡),执后,没有获取到地址,代码如下,请帮看看是什么原因:

 Option Explicit
 'Download by http://www.codefans.net
 Const NCBASTAT As Long = &H33
 Const NCBNAMSZ As Long = 16
 Const HEAP_ZERO_MEMORY As Long = &H8
 Const HEAP_GENERATE_EXCEPTIONS As Long = &H4
 Const NCBRESET As Long = &H32
 
Private Type NET_CONTROL_BLOCK
  ncb_command    As Byte
  ncb_buffer     As Long
  ncb_length     As Integer
  ncb_callname   As String * NCBNAMSZ
  ncb_name       As String * NCBNAMSZ
  ncb_lana_num   As Byte
  ncb_cmd_cplt   As Byte
End Type

Private Type ADAPTER_STATUS
  adapter_address(5) As Byte
  adapter_type      As Byte
End Type
   
Private Type NAME_BUFFER
  name        As String * NCBNAMSZ
  name_num    As Integer
  name_flags  As Integer
End Type

Private Type ASTAT
  adapt          As ADAPTER_STATUS
  NameBuff(30)   As NAME_BUFFER
End Type

Private Declare Function Netbios Lib "netapi32.dll" (pncb As NET_CONTROL_BLOCK) As Byte

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, _
    ByVal hpvSource As Long, ByVal cbCopy As Long)

Private Declare Function GetProcessHeap Lib "kernel32" () As Long

Private Declare Function HeapAlloc Lib "kernel32" (ByVal hHeap As Long, _
    ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
    
Private Declare Function HeapFree Lib "kernel32" (ByVal hHeap As Long, _
    ByVal dwFlags As Long, lpMem As Any) As Long


Private Sub Command1_Click()
  Dim i As Integer
  Dim pASTAT As Long
  Dim NCB As NET_CONTROL_BLOCK
  Dim AST As ASTAT
  
  NCB.ncb_command = NCBRESET
  Call Netbios(NCB)
  NCB.ncb_callname = "*               "
  NCB.ncb_command = NCBASTAT
  NCB.ncb_lana_num = 0
  NCB.ncb_length = Len(AST)
  pASTAT = HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS _
          Or HEAP_ZERO_MEMORY, NCB.ncb_length)
  NCB.ncb_buffer = pASTAT


  Call Netbios(NCB)
  CopyMemory AST, NCB.ncb_buffer, Len(AST)
  For i = 0 To 5
      Text1.Text = Text1.Text & Format$(Hex(AST.adapt.adapter_address(i)), "00") & "  "
  Next i
  HeapFree GetProcessHeap(), 0, pASTAT
End Sub

Private Sub Command2_Click()
  End
End Sub


[解决办法]
什么“物理地址”,不就是Mac地址么,有那么麻烦么?
[解决办法]
http://hi.baidu.com/jzjbyq/item/e15b1ba2b56ea1f215329bb1
[解决办法]
1)在Visual Basic生成标准的EXE文件。缺省创建 Form1。
2)在Form1中添加一命令按钮,缺省名为Command1。
3)把下列代码放到Form1中说明部分。
Option Explicit
Private Const NCBASTAT = &H33
Private Const NCBNAMSZ = 16
Private Const HEAP_ZERO_MEMORY = &H8
Private Const HEAP_GENERATE_EXCEPTIONS = &H4
Private Const NCBRESET = &H32
Private Type NCB
  ncb_command As Byte 'Integer
  ncb_retcode As Byte 'Integer
  ncb_lsn As Byte 'Integer
  ncb_num As Byte ' Integer
  ncb_buffer As Long 'String
  ncb_length As Integer
  ncb_callname As String * NCBNAMSZ
  ncb_name As String * NCBNAMSZ
  ncb_rto As Byte 'Integer
  ncb_sto As Byte ' Integer
  ncb_post As Long
  ncb_lana_num As Byte 'Integer
  ncb_cmd_cplt As Byte 'Integer
  ncb_reserve(9) As Byte ' Reserved, must be 0
  ncb_event As Long
End Type
Private Type ADAPTER_STATUS
  adapter_address(5) As Byte 'As String * 6
  rev_major As Byte 'Integer
  reserved0 As Byte 'Integer
  adapter_type As Byte 'Integer
  rev_minor As Byte 'Integer
  duration As Integer
  frmr_recv As Integer
  frmr_xmit As Integer
  iframe_recv_err As Integer
  xmit_aborts As Integer
  xmit_success As Long
  recv_success As Long
  iframe_xmit_err As Integer
  recv_buff_unavail As Integer
  t1_timeouts As Integer
  ti_timeouts As Integer
  Reserved1 As Long
  free_ncbs As Integer
  max_cfg_ncbs As Integer
  max_ncbs As Integer
  xmit_buf_unavail As Integer
  max_dgram_size As Integer
  pending_sess As Integer
  max_cfg_sess As Integer
  max_sess As Integer
  max_sess_pkt_size As Integer
  name_count As Integer
End Type
Private Type NAME_BUFFER
  name As String * NCBNAMSZ
  name_num As Integer
  name_flags As Integer
End Type
Private Type ASTAT
  adapt As ADAPTER_STATUS
  NameBuff(30) As NAME_BUFFER
End Type
Private Declare Function Netbios Lib "netapi32.dll" (pncb As NCB) As Byte
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)


Private Declare Function GetProcessHeap Lib "kernel32" () As Long
Private Declare Function HeapAlloc Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function HeapFree Lib "kernel32" (ByVal hHeap As Long,ByVal dwFlags As Long, lpMem As Any) As Long
'把下面的代码放入Command1_Click的事件中:
Private Sub Command1_Click()
  Dim myNcb As NCB
  Dim bRet As Byte
  myNcb.ncb_command = NCBRESET
  bRet = Netbios(myNcb)
  myNcb.ncb_command = NCBASTAT
  myNcb.ncb_lana_num = 0
  myNcb.ncb_callname = "*       "
  Dim myASTAT As ASTAT, tempASTAT As ASTAT
  Dim pASTAT As Long
  myNcb.ncb_length = Len(myASTAT)
  Debug.Print Err.LastDllError
  pASTAT = HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS Or HEAP_ZERO_MEMORY, myNcb.ncb_length)
  If pASTAT = 0 Then
    Debug.Print "memory allcoation failed!"
    Exit Sub
  End If
  myNcb.ncb_buffer = pASTAT
  bRet = Netbios(myNcb)
  Debug.Print Err.LastDllError
  CopyMemory myASTAT, myNcb.ncb_buffer, Len(myASTAT)
  MsgBox Hex(myASTAT.adapt.adapter_address(0)) & " " & Hex(myASTAT.adapt.adapter_address(1)) _
    & " " & Hex(myASTAT.adapt.adapter_address(2)) & " " _
    & Hex(myASTAT.adapt.adapter_address(3)) _
    & " " & Hex(myASTAT.adapt.adapter_address(4)) & " " _
    & Hex(myASTAT.adapt.adapter_address(5))
  HeapFree GetProcessHeap(), 0, pASTAT
End Sub


4)按F5,运行该程序。
5)点击Command1。注意,网卡地址将在一信息框中显示出来。

[解决办法]
Mac地址有什么用?很容易改的吧
[解决办法]
不用这么麻烦吧?用WMI可以获取
[解决办法]
用DeviceIoControl函数能获取物理MAC地址
[解决办法]
单纯用wmi获取的不一定是真实的MAC地址
[解决办法]
Netbios API的不妨再参考一下这个帖子里的得分答案,虽然我个人刚才随便在WIN7下测试了下得不到结果:
http://bbs.csdn.net/topics/30308204
请问:如何获得网络上网卡的Mac [问题点数:70分,结帖人s6w6k] 

我更会优先考虑wmi的方案,这里整理了下前人的代码如下:

Option Explicit

Private Sub Form_Load()
    MsgBox EnumMACAddresses
End Sub
'---------------------------------------------------
' 过程名    : EnumMACAddresses
' 时间      : 2013-2-8 22:06
' 作者      : 杨过.网狐.cn(csdn bcrun)
' 功能      : 枚举本机网卡信息,主要是Mac地址
' 说明      : 因为这方面需求似乎没有通用的参数和返回值标准,这里只是做个示例
' 备注      : CSDN之VB一群:283362041,星辰学园BASIC辅导群:289219875
'---------------------------------------------------
Private Function EnumMACAddresses() As String
    Dim obj1 As Object, oObjs As Object


    Dim sSql As String
    sSql = "SELECT * FROM Win32_NetworkAdapter WHERE ((MACAddress Is Not NULL) AND (Manufacturer <> 'Microsoft'))"
    Set oObjs = GetObject("winmgmts:").ExecQuery(sSql)
    For Each obj1 In oObjs
       EnumMACAddresses = EnumMACAddresses & obj1.MACAddress & "," & obj1.Description & vbCrLf
    Next obj1
End Function



[解决办法]

[解决办法]
引用:
引用:用网卡的MAC地址当电脑的机器码(硬件特征码),可行吗?

7楼说的“单纯用wmi获取的不一定是真实的MAC地址”目前还没具体了解过,不过啊,要是有黑客用API HOOK或什么方法,修改你WMI的结果怎么办呢。
可测试下:本地连接的属性---常规页,有个配置,进入后选择高级,里面有个网络地址,可修改为其他的MAC地址(xp系统)。然后通过WMI获取的就是你修改后的这个地址。
[解决办法]
引用:
这是我的运行结果(WINXP SP3 VB6)


哥哥,电脑感染了好几个360系列流氓病毒呢。

热点排行