在数字时代,浏览器成为了日常生活中不可或缺的工具之一。它们不仅帮助浏览网页,还存储了大量的个人信息,包括登录凭据。本文将介绍如何从浏览器中获取这些存储的加密凭据,特别是针对Google Chrome浏览器。
Chrome浏览器将用户的登录凭据存储在一个特殊的文件夹中,称为“配置文件夹”。要找到这个文件夹,首先需要了解如何定位它。Chrome内置了一个机制,可以显示关于其版本和安装位置的重要信息。要查看这些信息,只需在地址栏中输入:
chrome://version/
在显示的众多信息中,请参考“配置路径”(Profile Path),这是敏感数据的存储位置。
为了以编程方式获取这个路径,需要执行以下步骤:
#define FORENSICS_CHROMECREDENTIALS_PATH _T("\\Google\\Chrome\\User Data\\Default\\")
bool result = false;
TCHAR szProfileFolderPath[MAX_PATH];
result = SHGetSpecialFolderPath(0, szProfileFolderPath, CSIDL_LOCAL_APPDATA, 0);
StrCat(szProfileFolderPath, FORENSICS_CHROMECREDENTIALS_PATH);
首先,获取了用户Windows用户账户的特定路径。这可能是:
c:\users\john\
或者
c:\users\myself\
由于不知道具体路径,不在运行时使用任何硬编码值,而是在运行时获取它。第二部分是Google数据的相对路径,这是固定的,所以保留这部分硬编码。将两部分组合起来,就得到了路径。
现在已经得到了路径,需要关注一个特定的文件,实际上这是一个SQLite3数据库:
Login Data
要获取这个文件,在路径后添加
"\"
(_T("\\"))然后是字符串
_T("Login Data")
当这样做时,szProfileFolderPath将包含需要打开的数据库的完整路径。
在Secured Globe, Inc.的日常开发工作中,经常使用SQLite3。大多数取证信息都与SQLite3有某种关联。Sqlite3可以在源代码级别使用(将sqlite3.c和sqlite3.h添加到程序中,或者作为静态/动态库使用)。
使用它时,有两个额外的增强:
接下来,打开数据库并对存储凭据的特定表运行查询。这个表被称为“logins”。预定义了要在这张表上执行的查询:
#define CHROME_CRED_SQL_QUERY "SELECT signon_realm,username_value,
password_value,date_created FROM logins"
然后,可以打开数据库并运行这个查询:
CppSQLite3DB CredentialsDB;
// 定义了一个CppSQLite3DB对象
try {
CredentialsDB.open(TEMP_CHROME_DB);
} catch(CppSQLite3Exception &e) {
// 在这里处理异常
return false;
}
SGBrowserCredentials数据结构用于任何获取浏览器凭据的过程,并且能够保存所有浏览器通用的相关字段。
运行SQL查询后,应该预期会得到一些记录。每条记录都是一个单独的条目,例如存储的凭据。使用以下局部变量:
WCHAR *Site, *User, *CreationDate;
DATA_BLOB DataIn, DataOut;
来存储单个记录。还读取加密数据,稍后将对其进行解密。
要解密数据,使用CryptUnprotectData,它解密密码(在DATA_BLOB结构中)。
bool bDecrypted = CryptUnprotectData(&DataIn,
0,
0,
0,
0,
8, &DataOut);
如果成功,将在DataOut中拥有解密后的密码。
在创建单个记录并将其添加到动态数组之前,需要解释Chrome存储每个条目的日期/时间的方式。最简单的方法是将日期/时间(从数据库中以字符串形式获取)转换为FILETIME对象。FILETIME结构包含一个64位值,表示自1601年1月1日(UTC)以来的100纳秒间隔数。首先,需要获取Chrome使用的长数字的前10位数字,并将其存储在ULONGLONG变量中(使用_wcstoui64)。然后将其乘以10,并将“LowPart”和“HighPart”分配给FILETIME对象。