【问题标题】:De/encoding hex-numbers with python用python解码/编码十六进制数字
【发布时间】:2020-08-28 17:30:38
【问题描述】:

我目前正在尝试使用 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()

我几乎尝试了所有可以在这里或互联网上找到的解决方案,但没有一个对我有用!

提前感谢您的帮助!

【问题讨论】:

  • 你能举一个输入和预期输出的例子吗?
  • 不需要输入。我有第二种方法是使用 winreg 从注册表中“获取”信息。上面的错误是唯一的输出
  • “输入”是指您作为“val”传递给此函数的参数。如果您不确定该输入是什么样的,那可能就是您难以让事情正常工作的原因! :) 一种快速的调试方法是将print(val) 添加到此函数的开头,以便在引发错误之前将其转储到控制台。
  • 我试了一下运行它并得到了一个Access is denied。在您的环境中接收到的相关val2addr 函数的val 的单个示例比查看print_networks 代码更有助于构建最小的可重现示例。
  • 是的,你应该以管理员身份运行文本编辑器/空闲

标签: python registry mac-address


【解决方案1】:

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"

【讨论】:

  • 现在我有一些输出(几个 mac 地址),但我仍然收到错误
  • 考虑到我尝试过的输入,它对我来说很好! /耸肩
  • 也许你可以建议一些我可以传递给它的东西,而不是"1234"
  • 我想我必须继续锁定其他解决方案。但感谢您的快速回复和帮助!
猜你喜欢
  • 1970-01-01
  • 2012-06-26
  • 2019-03-20
  • 1970-01-01
  • 2015-12-23
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
相关资源
最近更新 更多