1. 平台检查
import platform
if platform.system().lower() != 'windows':
print('Please run this script in Windows.')
exit(-1)
此部分借助platform.system()函数来判断当前操作系统是否为Windows。若不是,就输出提示信息并终止程序。
2. 导入必要的库
import sys, winreg
from Crypto.Hash import SHA1
from Crypto.Cipher import AES, Blowfish
from Crypto.Util import strxor
sys
:用于和Python解释器交互,像退出程序这类操作。
winreg
:用来操作Windows注册表。
Crypto库
:用于加密和解密操作,包含SHA1哈希算法、AES和Blowfish加密算法,以及strxor异或操作工具。
3. 定义Navicat11Crypto类
class Navicat11Crypto:
def __init__(self, Key=b'3DC5CA39'):
self._Key = SHA1.new(Key).digest()
self._Cipher = Blowfish.new(self._Key, Blowfish.MODE_ECB)
self._IV = self._Cipher.encrypt(b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF')
def EncryptString(self, s: str):
# 加密字符串的方法
pass
def DecryptString(self, s: str):
# 解密字符串的方法
pass
__init__方法
:初始化加密器,运用SHA1算法对密钥进行哈希处理,接着用Blowfish算法的ECB模式创建加密器,同时生成初始化向量(IV)。
EncryptString方法
:把输入的字符串加密成十六进制的大写字符串。
DecryptString方法
:将十六进制字符串解密为ASCII字符串。
4. 初始化加密器并定义服务器类型和注册表路径
NavicatCipher = Navicat11Crypto()
ServersTypes = {
'MySQL Server': 'Software\\PremiumSoft\\Navicat\\Servers',
'MariaDB Server': 'Software\\PremiumSoft\\NavicatMARIADB\\Servers',
'MongoDB Server': 'Software\\PremiumSoft\\NavicatMONGODB\\Servers',
'MSSQL Server': 'Software\\PremiumSoft\\NavicatMSSQL\\Servers',
'OracleSQL Server': 'Software\\PremiumSoft\\NavicatOra\\Servers',
'PostgreSQL Server': 'Software\\PremiumSoft\\NavicatPG\\Servers',
# 'SQLite Server' : 'Software\\PremiumSoft\\NavicatSQLite\\Servers'
}
NavicatCipher
:初始化Navicat11Crypto类的实例。
ServersTypes
:一个字典,记录不同数据库服务器类型及其对应的注册表路径。
5. 遍历服务器类型并提取信息
for ServersTypeName, ServersRegistryPath in ServersTypes.items():
# 打印服务器类型信息
try:
ServersRegistryKey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, ServersRegistryPath)
except OSError:
print('')
print('No servers is found.')
print('')
continue
i = 0
try:
while True:
# 枚举服务器并提取信息
pass
except OSError:
if i == 0:
print('No servers is found.')
print('')
continue
winreg.CloseKey(ServersRegistryKey)
外层for循环:对每种服务器类型进行遍历。
尝试打开对应的注册表键,若失败则表明未找到该类型的服务器,接着继续下一个类型的遍历。
内层while循环:枚举该类型下的所有服务器,提取服务器的主机名、端口、用户名、密码等信息,并且对加密的密码进行解密后显示出来。
若发生OSError异常,说明已枚举完所有服务器,若没有找到任何服务器则输出提示信息。
6. 提取服务器信息并显示
ServerName = winreg.EnumKey(ServersRegistryKey, i)
ServerRegistryKey = winreg.OpenKey(ServersRegistryKey, ServerName)
try:
ServerHost = winreg.QueryValueEx(ServerRegistryKey, 'Host')[0]
ServerPort = winreg.QueryValueEx(ServerRegistryKey, 'Port')[0]
if ServersTypeName == 'OracleSQL Server':
ServerInitialDb = winreg.QueryValueEx(ServerRegistryKey, 'InitialDatabase')[0]
else:
ServerInitialDb = None
ServerUsername = winreg.QueryValueEx(ServerRegistryKey, 'Username')[0]
ServerPassword = winreg.QueryValueEx(ServerRegistryKey, 'Pwd')[0]
if len(ServerPassword) != 0:
ServerPassword = NavicatCipher.DecryptString(ServerPassword)
ServerUseSsh = winreg.QueryValueEx(ServerRegistryKey, 'UseSSH')[0]
if ServerUseSsh != 0:
ServerSshHost = winreg.QueryValueEx(ServerRegistryKey, 'SSH_Host')[0]
ServerSshPort = winreg.QueryValueEx(ServerRegistryKey, 'SSH_Port')[0]
ServerSshUsername = winreg.QueryValueEx(ServerRegistryKey, 'SSH_Username')[0]
ServerSshPassword = winreg.QueryValueEx(ServerRegistryKey, 'SSH_Password')[0]
if len(ServerSshPassword) != 0:
ServerSshPassword = NavicatCipher.DecryptString(ServerSshPassword)
else:
ServerSshHost = None
ServerSshPort = None
ServerSshUsername = None
ServerSshPassword = None
print(ServerName.center(50, '-'))
print('%-18s' % 'Host:', ServerHost)
print('%-18s' % 'Port:', ServerPort)
if ServerInitialDb != None:
print('%-18s' % 'InitialDatabase:', ServerInitialDb)
print('%-18s' % 'Username:', ServerUsername)
print('%-18s' % 'Password:', ServerPassword)
if ServerUseSsh:
print('%-18s' % 'SSH Host:', ServerSshHost)
print('%-18s' % 'SSH Port:', ServerSshPort)
print('%-18s' % 'SSH Username:', ServerSshUsername)
print('%-18s' % 'SSH Password:', ServerSshPassword)
except:
print('[-] Failed to get info about server "%s". Server info may be corrupted.' % ServerName,
file=sys.stderr)
winreg.CloseKey(ServerRegistryKey)
借助winreg.EnumKey枚举服务器名称,再打开对应的注册表键。
运用winreg.QueryValueEx提取服务器的各项信息,像主机名、端口、用户名、密码等。
若密码存在,则使用NavicatCipher.DecryptString方法进行解密。
若使用了SSH连接,则提取SSH相关信息并解密SSH密码。
最终将服务器信息打印输出,若提取信息时出错,则输出错误提示。
综上所述,这段代码的核心功能是从Windows注册表中提取Navicat数据库连接信息并解密密码,以便查看数据库连接的详细信息。
成功!
运行得到结果:
标签:winreg,python,解密,navicat,ServerRegistryKey,SSH,print,服务器,QueryValueEx From: https://www.cnblogs.com/o-O-oO/p/18688799原创 90 老猫coder