先说下目标,目标是获取平时我们登录了用chrome登录各个网站之后,提示是否保存密码,我们直接保存了的那些相关网址的账号以及密码。
先说几个相关思路(第三个姿势是分析编写密码提取工具):
1.打开chrome->设置->显示高级设置->密码管理就会看到这个:
这个是chrome的相关保存密码操作界面。点击某一条记录,在密码后面有一个显示密码的按钮,点击那个按钮,如果当前电脑设置了登录密码,那么就会弹窗要求输入开机密码
成功输入时候,就可以看到密码了,如果本机没有登录密码的话,直接点击显示密码就可以看到密码。
第一种思路就是说在有用户密码的机器上,我们在不知道密码的前提下直接看用户保存的本地账号密码(请注意,这个在目前新版本的chrome里已经不好使了,很早以前的思路)。我们直接右键检查,然后把对应的密码输入框的属性改成 text然后回车就行了,密码就直接显示出来了。
2.还是类似上面1的方法,在没有用户密码的前提下得到曾经保存的账号和密码(这个目前新版本也是可以获取到的)。首先进入到密码管理界面,然后看到一些信息,我们随便拷贝其中的一个网址,比如CSDN的,然后直接登录,因为备份了密码,所以密码会直接填充出来,这个时候我们在登录界面,直接查看网页源码,找到输入密码的位置,把类型改成text回车就行了。
出于好奇试验了下360浏览器,发现同样可以:
总结下1,2。其实上面的1和2应用的场景并不多,通常是没什么卵用,而且在最新的版本上也是可以用1的方法获取登录信息的。只不过前期强行处理下本地环境,强行改下密码。当然这个动作360会警告。
然后用自己改了的密码登录就行了。或者直接清空密码。
3.OK说正题,获取本地chrome登录的账号信息。
(1)首先一点就是找到密码存储的位置,文件或者是注册表,这个的方式很简单,开启监控工具,打开注册表和文件操作信息。然后到chrome密码管理界面,随便删除一条记录,然后看看chrome本身对哪些文件或者注册表进行了修改:
看那路径和名字,很容易猜到就是它了:
C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\Default
这个主意一下,根据版本不同,也可能在这个路径下:
C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\ChromeDefaultData\Login Data
如果看到这里,在结合最上面的1,2两种方法,有没有觉得可以直接把别人的这个文件拷贝到我们自己电脑上,然后通过密码管理器查看?答案是不能。至于为什么,下面会解释这个问题。
(2)分析下这个密码文件。
既然文件找到了,那么就分析下这个文件吧,当然第一反应都是文档形式打开,万一是明文呢?
看来不是了,但是根据前面那个,也该知道了,数据库格式,而且sqlite3。接下来就是直接找个工具打开看下这东西。
可以看到密码部分是加密的。
接下来就是去查加密方式了。这个环节通常很难,而且也是最容易放弃的。但是大家不要忘记,chrome是开源的,直接找下相关部分代码或者网上搜一下chrome常用的加解密函数就行了。结果得到的是这样一对函数:
CryptProtectData/CryptUnprotectData
这对加解密函数非常特别,调用的时候会去验证本地登录身份,这也就是为什么别人的那个密码文档不能直接拷贝到我们自己chrome相关文件夹下去看的原因了。
最后就是代码实现了,找个开源的sqlite3库,先把数据库解出来。然后得到密码的加密数据,然后CryptUnprotectData解密,这个地方细节比较多,有坑点。写的时候要留意。还有就是如果chrome开启的时候直接对这个数据库文件操作会失败,所以建议每次操作都是先拷贝出来再处理。在获取密码的时候,我发现在这个地方,
chrome的处理方式也是直接保存密码,然后把密码存成空,这样当遇到这个网址的时候,就直接把密码填充成空。用这个思路实现的永久不保存,所以在获取密码的时候,如果发现密码是空,那么可以认为是 一律不保存 里的。最后就是注意调用sqlite3库的问题,最好是用带有getBlobField的那个开源代码,一开始自己用的是一个没有这个函数的库,获取的是一个char* 但是问题来了,不知道这个Blob的具体大小,只能采取循环尝试猜测解密长度的方式。在一些机器上,这个方式很慢很慢。几分钟都跑不出来。注意下这个问题。自己写了个账号密码提取工具,下面是本机执行结果(工具下载地址:http://download.csdn.net/detail/u013761036/9719029):
仔细想想整个过程挺简单的,而且貌似有人分析过了。写这个的目的只不过是在享受这个分析的快感吧。