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

ynduanlian 2013-02-08 01:45:55
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
...全文
897 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2013-02-10
  • 打赏
  • 举报
回复
引用 15 楼 dong_y888 的回复:
这是我的运行结果(WINXP SP3 VB6)
哥哥,电脑感染了好几个360系列流氓病毒呢。
bcrun 2013-02-09
  • 打赏
  • 举报
回复
引用 10 楼 ynduanlian 的回复:
用网卡的MAC地址当电脑的机器码(硬件特征码),可行吗?
7楼说的“单纯用wmi获取的不一定是真实的MAC地址”目前还没具体了解过,不过啊,要是有黑客用API HOOK或什么方法,修改你WMI的结果怎么办呢。
ynduanlian 2013-02-09
  • 打赏
  • 举报
回复
WMI的方法是可行的
ynduanlian 2013-02-09
  • 打赏
  • 举报
回复
用网卡的MAC地址当电脑的机器码(硬件特征码),可行吗?
ynduanlian 2013-02-09
  • 打赏
  • 举报
回复
引用 3 楼 dong_y888 的回复:
1)在Visual Basic生成标准的EXE文件。缺省创建 Form1。 2)在Form1中添加一命令按钮,缺省名为Command1。 3)把下列代码放到Form1中说明部分。 Visual Basic code?1234567891011121314151617181920212223242526272829303132333435363738394041424……
你这个代码,我运行了,返回都是0字符
  • 打赏
  • 举报
回复
引用 12 楼 bcrun 的回复:
引用 10 楼 ynduanlian 的回复:用网卡的MAC地址当电脑的机器码(硬件特征码),可行吗? 7楼说的“单纯用wmi获取的不一定是真实的MAC地址”目前还没具体了解过,不过啊,要是有黑客用API HOOK或什么方法,修改你WMI的结果怎么办呢。
可测试下:本地连接的属性---常规页,有个配置,进入后选择高级,里面有个网络地址,可修改为其他的MAC地址(xp系统)。然后通过WMI获取的就是你修改后的这个地址。
dong_y888 2013-02-09
  • 打赏
  • 举报
回复
这是我的运行结果(WINXP SP3 VB6)
bcrun 2013-02-09
  • 打赏
  • 举报
回复
引用 13 楼 wowfiowow 的回复:
WMI根本不靠谱,很不安全
说具体些?
橘子皮... 2013-02-09
  • 打赏
  • 举报
回复
WMI根本不靠谱,很不安全
bcrun 2013-02-08
  • 打赏
  • 举报
回复
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
  • 打赏
  • 举报
回复
单纯用wmi获取的不一定是真实的MAC地址
  • 打赏
  • 举报
回复
用DeviceIoControl函数能获取物理MAC地址
Roock 2013-02-08
  • 打赏
  • 举报
回复
不用这么麻烦吧?用WMI可以获取
橘子皮... 2013-02-08
  • 打赏
  • 举报
回复
Mac地址有什么用?很容易改的吧
dong_y888 2013-02-08
  • 打赏
  • 举报
回复
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。注意,网卡地址将在一信息框中显示出来。
threenewbee 2013-02-08
  • 打赏
  • 举报
回复
http://hi.baidu.com/jzjbyq/item/e15b1ba2b56ea1f215329bb1
threenewbee 2013-02-08
  • 打赏
  • 举报
回复
什么“物理地址”,不就是Mac地址么,有那么麻烦么?

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧