注册表 结构
注册表由键(key,或称“项”)、子键(subkey,子项)和值项(value)构成。一个键就是树状数据结构中的一个节点,而子键就是这个节点的子节点,子键也是键。一个值项则是一个键的一条属性,由名称(name)、数据类型(datatype)以及数据(data)组成。一个键可以有一个或多个值,每个值的名称各不相同,如果一个值的名称为空,则该值为该键的默认值。
在注册表编辑器(Regedit.exe)中,数据结构显示如下,其中,command键是open键的子键,(默认)表示该值是默认值,值名称为空,其数据类型为REG_SZ,数据值为%systemroot%system32NOTEPAD.EXE "%1
_winreg.OpenKey(key,sub_key,res=0,sam=KEY_READ) 打开建,子健
1.读取
读取用的方法是OpenKey方法:打开特定的key
_winreg.OpenKey(key,sub_key,res=0,sam=KEY_READ)
例子:此例子是显示了本机网络配置的一些注册表项
#!/usr/bin/env python
#coding=utf-8
import _winreg
key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, r"SYSTEMCurrentControlSetServicesTcpipParametersInterfaces{0E184877-D910-4877-B 4C2-04F487B6DBB7}")
#获取该键的所有键值,遍历枚举
try:
i=0
while 1:
#EnumValue方法用来枚举键值,EnumKey用来枚举子键
name,value,type = _winreg.EnumValue(key,i)
print repr(name),value,type
i+=1
except WindowsError:
#假如知道键名,也可以直接取值
value,type = _winreg.QueryValueEx(key,"DhcpDefaultGateway")
print "默认网关地址----",value,type
运行的结果如下:
'UseZeroBroadcast' 0 4
'EnableDeadGWDetect' 1 4
'EnableDHCP' 1 4
'IPAddress' [u'0.0.0.0'] 7
'SubnetMask' [u'0.0.0.0'] 7
'DefaultGateway' [] 7
'DefaultGatewayMetric' [] 7
'NameServer' 10.0.0.10 1
'Domain' 1
'RegistrationEnabled' 1 4
'RegisterAdapterName' 0 4
'TCPAllowedPorts' [u'0'] 7
'UDPAllowedPorts' [u'0'] 7
'RawIPAllowedProtocols' [u'0'] 7
'NTEContextList' [u'0x00000004'] 7
'DhcpClassIdBin' None 3
'DhcpServer' 10.104.4.1 1
'Lease' 907200 4
'LeaseObtainedTime' 1264122113 4
'T1' 1264575713 4
'T2' 1264915913 4
'LeaseTerminatesTime' 1265029313 4
'IPAutoconfigurationAddress' 0.0.0.0 1
'IPAutoconfigurationMask' 255.255.0.0 1
'IPAutoconfigurationSeed' 0 4
'AddressType' 0 4
'IsServerNapAware' 0 4
'DhcpIPAddress' 10.104.5.15 1
'DhcpSubnetMask' 255.255.254.0 1
'DhcpRetryTime' 453598 4
'DhcpRetryStatus' 0 4
'DhcpNameServer' 10.0.0.10 1
'DhcpDefaultGateway' [u'10.104.4.1'] 7
'DhcpSubnetMaskOpt' [u'255.255.254.0'] 7
默认网关地址---- [u'10.104.4.1'] 7
2.创建 修改注册表
创建key:_winreg.CreateKey(key,sub_key)
删除key: _winreg.DeleteKey(key,sub_key)
删除键值: _winreg.DeleteValue(key,value)
给新建的key赋值: _winreg.SetValue(key,sub_key,type,value)
例子:
#!/usr/bin/env python
#coding=utf-8
import _winreg
key=_winreg.OpenKey(_winreg.HKEY_CURRENT_USER,r"SoftwareMicrosoftWindowsCurrentVersionExplorer")
#删除键
_winreg.DeleteKey(key, "Advanced")
#删除键值
_winreg.DeleteValue(key, "IconUnderline")
#创建新的
newKey = _winreg.CreateKey(key,"MyNewkey")
#给新创建的键添加键值
_winreg.SetValue(newKey,"ValueName",0,"ValueContent")
python3 对bytes类型不需要ord转换直接可以拿来用
from winreg import * # python3 不同于python2 bytes类型不需要转换处理 #https://stackoverflow.com/questions/50111345/bytes-like-object-is-required-ord-expected-string-of-length-1-but-int-found def ord_char(val): add = '' for ch in val: add += ("%02x " %ch) #add += (str(ch) add = add.strip().replace(" ",":")[0:17] return (add) def prints_net(): net = r"SOFTWAREMicrosoftWindows NTCurrentVersionNetworkListSignaturesUnmanaged" # 打开所有的 machine下的net key = OpenKey(HKEY_LOCAL_MACHINE,net) print ('[+] Network you have join') for i in range(100): try: # 获取 键 guid = EnumKey(key,i) # 打开machine》net 下所有的建 nekey = OpenKey(key,str(guid)) (name,addr,typ) = EnumValue(nekey,5) (name,value,typ) = EnumValue(nekey,4) #print(addr) macaddr = ord_char(addr) #print(value) print ("[+] %s %s" %(value,macaddr)) CloseKey(nekey) except Exception as e: pass def main(): # ord_char("x00x11x50x24x68x7Fx00x00") # ord_char("x00x11x50x24x68x7Fx00x00") # ord_char("x00x11x50x24x68x7Fx00x00") #ord_char(b'xf4xeex14D6xf6') prints_net() if __name__ == '__main__': main()