在windows下保存密码无非就是两个位置:注册表和文件。于是用windbg打开查询分析器(版本为SQL Server Management Studio 2005 Express),下几个条件断点:
bp kernel32!CreateFileW ".printf \"file:%mu\\n\",poi(@esp+4);g;"
bp advapi32!RegCreateKeyExW ".printf \"reg key:%mu\\n\",poi(@esp+8);g;"
bp advapi32!RegSetValueExW ".printf \"reg value:%mu\\n\",poi(@esp+8);g;"
执行查询分析器,登录一个服务器,勾选记住密码,然后退出。可以看到windbg输出了很多信息:
依次查看这些文件和注册表,发现mru.dat十分可疑:
可以看出,这个文件是一个标准的.net二进制序列化文件,其中有一段可疑的base64:
解密后为乱码,鉴于windows上绝大部分的可逆加密都是dpapi,于是直接用dpapi进行解密:
Console.WriteLine(Encoding.Unicode.GetString(System.Security.Cryptography.ProtectedData.Unprotect(Convert.FromBase64String("AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA/GdUMC8fOkSbZeHVvNAo5AAAAAAQAAAARABlAGYAYQB1AGwAdAAAABBmAAAAAQAAIAAAABH2ACkH8BeAkWtFpoTTAJkOVsrKIKhgee/heYeTpF7nAAAAAA6AAAAAAgAAIAAAABsgv9bezhjwgM4UJmBEhO3GVZ+1+dNrvNIIsogzsX/qEAAAAM1k6Re4z8UJWAVWT6excM1AAAAAX/lp4sh4tHXD3OZQcV6Rs35q6HQ21zEfpJpGkDyFDQT6fVieZxe1m5oY02sGKne1nvD24RQAtiS8fb467EWMsA=="),null,System.Security.Cryptography.D