Р В Р’ВВВнфо
ОтветРСвЂВВть
Всем привет! Пытаюсь расшифровать пароли "cookies" браузера Chrome(v80), но функция CryptUnprotectData() всегда возвращает ошибку ERROR_INVALID_DATA (0х0000000D). Может кто-нибудь подскажет, что я делаю не так?
Известно, что в этих браузерах, к шифрованию паролей был добавлен ключ, который нужно передать в параметре "entropy" функции CryptUnprotectData() при расшифровке пароля. Закодированный в Base64 ключ хранится в файле Json, и убрав у него сигнатуру "DPAPI" я расшифровал его той-же CryptUnprotectData(). Функция вернула ОК=1, и т.к. она не только расшифровывает, но и проверяет целостность структуры BLOB (с размером и адрес ключа), то можно сделать вывод, что ключ у меня валидный.
Теперь, на этапе декодирования самого пароля из базы SQLite, в первом аргументе CryptUnprotectData() я передаю структуру BLOB пароля, а в третьем - BLOB ключа, но функция постоянно возвращает FALSE. Ясно, что неправильно оформлена структура BLOB пароля из базы, но устранить ошибку не могу.
Если я правильно понимаю, то пароль состоит из 4-х частей: сигнатура "v10", 12-байтное поле IV, далее сам пароль переменной длинны, и в хвосте - 16-байтный "код аутентификации". Вопрос - с какого смещения нужно передавать этот пароль функции CryptUnprotectData()? Пробовал по всей длине, потом без сигнатуры v10, без IV (с соответствующей правкой длинны в BLOB), но всегда одинаковая ошибка.
Вот так выглядит всё поле с паролем в базе-данных SQLite, и эти 4 составляющие я выделил в блоки - красный сигнатура, зелёный IV, потом данные, и синий = код-аутентификации. Пишу на ассемблере и буду благодарен за любые советы.
Известно, что в этих браузерах, к шифрованию паролей был добавлен ключ, который нужно передать в параметре "entropy" функции CryptUnprotectData() при расшифровке пароля. Закодированный в Base64 ключ хранится в файле Json, и убрав у него сигнатуру "DPAPI" я расшифровал его той-же CryptUnprotectData(). Функция вернула ОК=1, и т.к. она не только расшифровывает, но и проверяет целостность структуры BLOB (с размером и адрес ключа), то можно сделать вывод, что ключ у меня валидный.
Теперь, на этапе декодирования самого пароля из базы SQLite, в первом аргументе CryptUnprotectData() я передаю структуру BLOB пароля, а в третьем - BLOB ключа, но функция постоянно возвращает FALSE. Ясно, что неправильно оформлена структура BLOB пароля из базы, но устранить ошибку не могу.
Если я правильно понимаю, то пароль состоит из 4-х частей: сигнатура "v10", 12-байтное поле IV, далее сам пароль переменной длинны, и в хвосте - 16-байтный "код аутентификации". Вопрос - с какого смещения нужно передавать этот пароль функции CryptUnprotectData()? Пробовал по всей длине, потом без сигнатуры v10, без IV (с соответствующей правкой длинны в BLOB), но всегда одинаковая ошибка.
Вот так выглядит всё поле с паролем в базе-данных SQLite, и эти 4 составляющие я выделил в блоки - красный сигнатура, зелёный IV, потом данные, и синий = код-аутентификации. Пишу на ассемблере и буду благодарен за любые советы.
Р В РЎв„ў сообщенРСвЂВВРЎР‹ РїСЂРСвЂВВложены файлы: