Board logo

标题: [原创代码] 读取HeidiSQL 配置文件中的密码 [打印本页]

作者: codegay    时间: 2017-1-21 08:26     标题: 读取HeidiSQL 配置文件中的密码

本帖最后由 codegay 于 2017-1-21 08:30 编辑

读取HeidiSQL 配置文件中的密码
2017-1-21 5:42:01 codegay

HeidiSQL是一款开源的SQL管理工具,用管理MYSQL,MSSQL 等数据库,
很多管理工具都会把密码存在本地,HeidiSQL也是的,但是只是经过非常简单的编码,所以我经过简单的分析后就知道了解密的方法。
连HeidiSQL源码都不用读...

我使用的是版本是HeidiSQL_9.4_Portable,配置会存在软件目录下的portable_settings.txt中,
如果是安装的版的话,配置文件应该是会存在系统的用户目录下。

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

HeidiSQL配置文件节选:
```
  1. Servers\Unnamed-2\SessionCreated<|||>1<|||>2017-01-20 13:32:21
  2. Servers\Unnamed-2\Host<|||>1<|||>127.0.0.1
  3. Servers\Unnamed-2\WindowsAuth<|||>3<|||>0
  4. Servers\Unnamed-2\User<|||>1<|||>root
  5. Servers\Unnamed-2\Password<|||>1<|||>6A6A6A9
  6. Servers\Unnamed-2\LoginPrompt<|||>3<|||>0
  7. Servers\Unnamed-2\Port<|||>1<|||>3306
  8. Servers\Unnamed-2\NetType<|||>3<|||>0
  9. Servers\Unnamed-2\Compressed<|||>3<|||>0
  10. Servers\Unnamed-2\LocalTimeZone<|||>3<|||>0
  11. Servers\Unnamed-2\QueryTimeout<|||>3<|||>0
  12. Servers\Unnamed-2\KeepAlive<|||>3<|||>0
  13. Servers\Unnamed-2\FullTableStatus<|||>3<|||>1
  14. Servers\Unnamed-2\Databases<|||>1<|||>
  15. Servers\Unnamed-2\Comment<|||>1<|||>
  16. Servers\Unnamed-2\StartupScriptFilename<|||>1<|||>
  17. Servers\Unnamed-2\SSHtunnelHost<|||>1<|||>
  18. Servers\Unnamed-2\SSHtunnelHostPort<|||>3<|||>0
  19. Servers\Unnamed-2\SSHtunnelUser<|||>1<|||>
  20. Servers\Unnamed-2\SSHtunnelPassword<|||>1<|||>1
  21. Servers\Unnamed-2\SSHtunnelTimeout<|||>3<|||>4
  22. Servers\Unnamed-2\SSHtunnelPrivateKey<|||>1<|||>
  23. Servers\Unnamed-2\SSHtunnelPort<|||>3<|||>3307
  24. Servers\Unnamed-2\SSL_Active<|||>3<|||>0
  25. Servers\Unnamed-2\SSL_Key<|||>1<|||>
  26. Servers\Unnamed-2\SSL_Cert<|||>1<|||>
  27. Servers\Unnamed-2\SSL_CA<|||>1<|||>
  28. Servers\Unnamed-2\SSL_Cipher<|||>1<|||>
复制代码
```

当时分析的过程当中,我尝试去看HeidiSQL的源码中对密码编码解码的部分,稍微在GITHUB上搜索了一下,
不过没有定位到对应的代码段。哈哈,太水了。
我通过反复把密码填为a r 1 aaa aaaa rrrr 之类这样的

终于发现了算出密码的规则,以密码aaa为例子,
在配置文件可以得到6A6A6A9
6A转为10进制得到106 减最后一位的9得到97,刚好可以对应ASCII码上的字母a,有3个6A,所以还可以还原得到aaa
也就是说前面的都是ASCII码,最后一位是偏移量,ASCII减偏移量就是对应的密码字符。

以下是在ipython中解码的演示
```
  1. int("6A",16)
  2. Out[1]: 106
  3. 106 - 9
  4. Out[2]: 97
  5. chr(97)
  6. Out[3]: 'a'
复制代码
```

以下是一个读取HeidiSQL 配置文件中的密码的python3代码:
```python
  1. # -*- coding: utf-8 -*-
  2. """
  3. 2017-1-21 3:42:54 codegay
  4. """
  5. import re
  6. settings = r"D:\临安初雨\Soft\HeidiSQL_9.4_Portable\portable_settings.txt"
  7. with open(settings,encoding="utf8") as f:
  8.     lines = [r.strip() for r in f.readlines() if "\\Password<" in r]
  9. passwords = [re.split("\<\|\|\|\>",r)[-1] for r in lines]
  10. def heidipass(code):
  11.     ascii = code[:-1]
  12.     d = int(code [-1])
  13.     decode = lambda x:chr(int(x,16) - d)
  14.     password = ''.join(map(decode,re.findall("\w{2}",ascii)))
  15.     return password
  16. for r in passwords:
  17.     print(heidipass(r))
复制代码
```

HeidiSQL官方网站: http://www.heidisql.com/
ASCII码对照表 http://tool.oschina.net/commons?type=4 (没有16进制,差评)
作者: pcl_test    时间: 2017-1-21 09:48

偏移量都是固定的9或是一位数字吗?
作者: happy886rr    时间: 2017-1-21 09:56

回复 1# codegay
seti的说明里有详细的16进制  http://www.bathome.net/thread-42565-1-1.html
作者: codegay    时间: 2017-1-21 10:11

回复 2# pcl_test


    我观察到的都是只有一位,范围是2-9。不过不管是不是一位,反正这个解码思路已经完成了。所以我也没有必要确认了。




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2