读取HeidiSQL 配置文件中的密码

2017-1-21 5:42:01 codegay

HeidiSQL是一款开源的SQL管理工具,用管理MYSQL,MSSQL 等数据库,

很多管理工具都会把密码存在本地,HeidiSQL也是的,但是只是经过非常简单的编码,所以我经过简单的分析后就知道了解密的方法。

连HeidiSQL源码都不用读...

我使用的是版本是HeidiSQL_9.4_Portable,配置会存在软件目录下的portable_settings.txt中,

HeidiSQL安装版会配置信息存在以下注册表中:

HKEY_CURRENT_USER\Software\HeidiSQL\

密码会保存在:

HKEY_CURRENT_USER\Software\HeidiSQL\Servers这个节点下面。

HeidiSQL portable版运行后也会建立注册表信息,退出软件会删除,配置信息最终会保存到portable_settings.txt中:

HKEY_CURRENT_USER\Software\HeidiSQL Portable [一串随机数]

类似这样:HKEY_CURRENT_USER\Software\HeidiSQL Portable 9532

打开portable_settings.txt可以看到配置文件中有以下这样的ip 密码之类这样的信息

HeidiSQL配置文件节选:

Servers\Unnamed-2\SessionCreated<|||>1<|||>2017-01-20 13:32:21
Servers\Unnamed-2\Host<|||>1<|||>127.0.0.1
Servers\Unnamed-2\WindowsAuth<|||>3<|||>0
Servers\Unnamed-2\User<|||>1<|||>root
Servers\Unnamed-2\Password<|||>1<|||>6A6A6A9
Servers\Unnamed-2\LoginPrompt<|||>3<|||>0
Servers\Unnamed-2\Port<|||>1<|||>3306
Servers\Unnamed-2\NetType<|||>3<|||>0
Servers\Unnamed-2\Compressed<|||>3<|||>0
Servers\Unnamed-2\LocalTimeZone<|||>3<|||>0
Servers\Unnamed-2\QueryTimeout<|||>3<|||>0
Servers\Unnamed-2\KeepAlive<|||>3<|||>0
Servers\Unnamed-2\FullTableStatus<|||>3<|||>1
Servers\Unnamed-2\Databases<|||>1<|||>
Servers\Unnamed-2\Comment<|||>1<|||>
Servers\Unnamed-2\StartupScriptFilename<|||>1<|||>
Servers\Unnamed-2\SSHtunnelHost<|||>1<|||>
Servers\Unnamed-2\SSHtunnelHostPort<|||>3<|||>0
Servers\Unnamed-2\SSHtunnelUser<|||>1<|||>
Servers\Unnamed-2\SSHtunnelPassword<|||>1<|||>1
Servers\Unnamed-2\SSHtunnelTimeout<|||>3<|||>4
Servers\Unnamed-2\SSHtunnelPrivateKey<|||>1<|||>
Servers\Unnamed-2\SSHtunnelPort<|||>3<|||>3307
Servers\Unnamed-2\SSL_Active<|||>3<|||>0
Servers\Unnamed-2\SSL_Key<|||>1<|||>
Servers\Unnamed-2\SSL_Cert<|||>1<|||>
Servers\Unnamed-2\SSL_CA<|||>1<|||>
Servers\Unnamed-2\SSL_Cipher<|||>1<|||>

当时分析的过程当中,我尝试去看HeidiSQL的源码中对密码编码解码的部分,稍微在GITHUB上搜索了一下,

不过没有定位到对应的代码段。哈哈,太水了。

我通过反复把密码填为a r 1 aaa aaaa rrrr 之类这样的,然后查ASCII码表和配置文件中的密码串对比,

终于发现了算出密码的规则,以密码aaa为例子,

在配置文件可以得到6A6A6A9

6A转为10进制得到106 减最后一位的9得到97,刚好可以对应ASCII码上的字母a,有3个6A,所以还可以还原得到aaa

也就是说前面的都是ASCII码,最后一位是偏移量,ASCII减偏移量就是对应的密码字符。

以下是在ipython中解码的演示

int("6A",16)
Out[1]: 106 106 - 9
Out[2]: 97 chr(97)
Out[3]: 'a'

以下是一个读取HeidiSQL 配置文件中的密码的python3代码:

# -*- coding: utf-8 -*-
"""
2017-1-21 3:42:54 codegay
"""
import re
settings = r"D:\临安初雨\Soft\HeidiSQL_9.4_Portable\portable_settings.txt" with open(settings,encoding="utf8") as f:
lines = [r.strip() for r in f.readlines() if "\\Password<" in r]
passwords = [re.split("\<\|\|\|\>",r)[-1] for r in lines] def heidipass(code):
ascii = code[:-1]
d = int(code[-1])
decode = lambda x:chr(int(x,16) - d)
password = ''.join(map(decode,re.findall("\w{2}",ascii)))
return password for r in passwords:
print(heidipass(r))

参考资料:

HeidiSQL官方网站: http://www.heidisql.com/

HeidiSQL源码(非官方)https://github.com/HeidiSQL/HeidiSQL

ASCII码对照表 http://tool.oschina.net/commons?type=4 (没有16进制,差评)

2017-1-22 3:30:25 补充: 这个链接有其他用户帖出了各种语言版本的代码 https://gist.github.com/jpatters/4553139

2017-1-28 2:06:53 补充: Heidisql 源码中密码加密解密的函数名分别是encrypt decrypt:

https://github.com/HeidiSQL/HeidiSQL/blob/c62da41849ff943bf913ad76f16bc60c1653abc5/source/helpers.pas

为了防止原链接失效,我把代码摘出来:

{***
Password-encryption, used to store session-passwords in registry
@param string Text to encrypt
@return string Encrypted Text
}
function encrypt(str: String) : String;
var
i, salt, nr : integer;
h : String;
begin
randomize();
result := '';
salt := random(9) + 1;
for i:=1 to length(str) do begin
nr := ord(str[i])+salt;
if nr > 255 then
nr := nr - 255;
h := inttohex(nr,0);
if length(h) = 1 then
h := '0' + h;
result := result + h;
end;
result := result + inttostr(salt);
end; {***
Password-decryption, used to restore session-passwords from registry
@param string Text to decrypt
@return string Decrypted Text
}
function decrypt(str: String) : String;
var
j, salt, nr : integer;
begin
result := '';
if str = '' then exit;
j := 1;
salt := StrToIntDef(str[length(str)],0);
result := '';
while j < length(str)-1 do begin
nr := StrToInt('$' + str[j] + str[j+1]) - salt;
if nr < 0 then
nr := nr + 255;
result := result + chr(nr);
inc(j, 2);
end;
end;

读取HeidiSQL 配置文件中的密码的更多相关文章

  1. python3读取sqlyog配置文件中的MySql密码

    这个人有什么目的?: 我多多少少听过一些安全圈的大牛说到类似的思路,大意是可以通过扫描各种程序和服务的配置文件(比如SVN的文件,RSYNC的配置文件等), 从中发现敏感信息,从而找到入侵的突破口.沿 ...

  2. 单例模式读取properties配置文件中的信息

    public class ConfigManager {    private static ConfigManager config = null;    //创建Properties文件  读取配 ...

  3. EasyPlayerPro Windows播放器读取xml配置文件中的特殊字符问题

    问题被反馈 今日一客户反馈说播放不了带用户名密码的流, 奇怪,这个问题不存在啊-,按照客户的说法, 是将url地址保存在配置文件中,然后再打开EasyPlayerPro运行: 问题复现 在EasyPl ...

  4. Password Management:Password in Configuration File 密码管理:配置文件中的密码

  5. SecureCRT 配置文件中 找密码

    打开本地电脑如下路径 C:\Users\XXX\AppData\Roaming\VanDyke\Config\Sessions 找到配置文件. 运行命令:python SecureCRTDecrypt ...

  6. shell读取nginx配置文件中nginx的端口

    #!/bin/shport=`nl /usr/local/openresty/nginx/conf/nginx.conf | sed -n '/listen/p' | awk 'NR==1{print ...

  7. 在OpenErp的配置文件中为数据库密码加密

      openerp连接数据库的用户名和密码可以命令行给出, 也可以设置在配置文件中, 如下例所示: db_user = openerp db_password = laoliu 因为它使用了明文的密码 ...

  8. spring boot 项目从配置文件中读取maven 的pom.xml 文件标签的内容。

    需求: 将pom.xml 文件中的版本号读取到配置文件并打印到日志中. 第一步: 在pom.xml 中添加以下标签. 第二步: 将version 标签的值读取到配置文件中 这里使用 @@  而不是  ...

  9. SpringBoot项目配置文件中密码的加密

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/15565862.html 版权声明:本文为博主原创文章,转载请附上博文链接! 公众号:追梦1819 ...

随机推荐

  1. 解决来自美国IP的攻击过程

    1.因为最近接口文档confluence服务总是自动关闭.   解决方法: 1.查看阿里云上的报警提示,看到来自外国的Ip的攻击.这时我选择把攻击的IP加入黑名单. 加入黑名单的方法:https:// ...

  2. R语言查看栅格值

    有这么一个需求,知道栅格上的坐标,想看看这个坐标上的栅格值是多少.坐标长这个样子 那么这样的坐标下的栅格值该怎么看 cellFromXY(the.stack$t1,c( -1505000,683500 ...

  3. [冷知识] 连字符-减号-横杠的区别 difference between hyphen-minus-dash

    因为早期打印机等宽的原因, 连字符和减号都是 -, 叫做hyphen-minus ,对应Unicode: U+002D(ASCII也是). 现在减号可以是:U+2212, 但编程语言中还是习惯使用U+ ...

  4. linux文件名乱码解决

    问题描述:公司的FTP服务器早就搭建好,windows客户端可以上传文件到FTP服务器,但是上传去的文件在LINUX目录下文件是乱码. 解决方法:首先编辑/etc/sysconfig/i18n这个文件 ...

  5. Log4Net 常见错误提示(不断更新中)

    1. 无法识别log4中的节点,如:<section>等 解决办法:在configrition中直接申明log4 <configSections><!--必须为第一个节点 ...

  6. HDOJ-2039

    #include<iostream> #include<cstdio> using namespace std; int main(){ int m,flag; float x ...

  7. github项目上传与克隆

    1. 先去git官网https://git-scm.com/下载git: 2. 桌面新建文件夹,例如project,文件夹中新建任意文件例如index.html: 3. 打开文件夹,按住shift+右 ...

  8. 跟我一步一步写出MongoDB Web 可视化工具(一)

    前言 距离上一次写博客,已经不记得大概有多长时间了, 是时候继续前行了... MongoStudio 是一个Web的 MongoDB可视化操作工具, 一年半前已经写好, 但是总觉得不足, 现从头开始. ...

  9. 软件工程wc项目,基于py

    ###WC项目文件链接:https://github.com/ILTHEW/wc.git 个人项目:WC 实践是理论的基础和验证标准,希望读者贯彻"做中学"的思想,动手实现下面的项 ...

  10. gevent模块学习(四)

    gevent.spawn会对传入的子任务集合进行调度,gevent.joinall 方法会阻塞当前程序,除非所有的greenlet都执行完毕,才会退出程序 公有方法 gevent.spawn(cls, ...