我目前正在尝试获取使用python3.8保存在设备上的MAC地址,并且出现以下错误:
在位置3的fromhex()arg中找到的非十六进制数
我知道这是解码错误。这是代码:
def val2addr(val):
if val:
address = ""
for ch in val:
if(not int(ch)):
address += ':'.join(format(s, '02x') for s in bytes.fromhex(str(ch))).replace("\0", "")
address = address.strip(' ').replace(' ', ':')[0: 17]
else:
address += str(ch)
return address + ':'.join(format(s, '02x') for s in bytes.fromhex(str(ch))).replace("\0", "")
return "[!] No MAC [!]"
def print_networks():
net = u"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"+\
"\\NetworkList\\Signatures\\Unmanaged"
print(str(HKEY_LOCAL_MACHINE) + net)
key = OpenKey(HKEY_LOCAL_MACHINE, net, 0, (KEY_WOW64_64KEY + KEY_READ))
print('\n[*] Networks You have Joined:\n')
for network in range(100):
try:
guid = EnumKey(key, network)
netkey = OpenKey(key, str(guid))
mac = QueryValueEx(netkey, 'DefaultGatewayMac')[0]
mac = val2addr(mac)
network_name = QueryValueEx(netkey, 'Description')[0]
print("[+] Network Name: " + network_name + "[+] Mac: " + mac)
CloseKey(netkey)
except Exception as e:
print(e)
break
def main():
print_networks()
if __name__ == '__main__':
main()
我几乎尝试了可以在这里或在互联网上找到的所有解决方案,但没有一个对我有用!
谢谢您的帮助!
fromhex
函数期望的字符串长度至少为两位数(因为每个单独的字节为两位十六进制数),并且您只将其传递给一个字符。如果您打算将输入数字零填充,则可以通过在其前面加上“ 0”来做到这一点:
def val2addr(val: str) -> str:
if val:
address = ""
for ch in val:
if not int(ch):
address += ':'.join(
format(s, '02x') for s in bytes.fromhex("0"+ch)
).replace("\0", "")
address = address.strip(' ').replace(' ', ':')[0:17]
else:
address += str(ch)
return address + ':'.join(
format(s, '02x') for s in bytes.fromhex("0"+ch)
).replace("\0", "")
return "[!] No MAC [!]"
print(val2addr("1234")) # prints "123404"