python winreg总结

Posted junsec

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python winreg总结相关的知识,希望对你有一定的参考价值。

注册表 结构

注册表由键(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:

    print      

#假如知道键名,也可以直接取值

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()

  

以上是关于python winreg总结的主要内容,如果未能解决你的问题,请参考以下文章

转 Python的WinReg项通过子键循环

转 python:_winreg类型名称

导入python的winreg模块时出现ImportError

python _winreg模块

转 Python模块——_winreg操作注册表

转 python的_winreg的SetValueEx如何使用