Раскопал еще и блок паролей, за исключением пароля к HDD.
Причина только в том, что пароль на винт я установить не смог... Не ставится и все тут. В Сетапе вводишь пароль, подтверждение, пишет ОК, Статус меняется с Clear на Set. Сохраняюсь выхожу, гружу DOS снимаю дамп - разницы нет. Захожу в Сетап - HDD Password = Clear. Делаю снова - все тоже самое. Утилиты DOS/Win показывают статус Security Supported, а должно быть Enabled. Пароль не установлен. Чего только не пробовал - пишет ОК пароль не ставит. Весь мир не знает как его снять, а я не могу поставить...

Есть кейген пароля винта на этот ноут, но если ноут грохнулся - не с чего будет кейгенить. Залоченный винт никаких "секретных кодов" не запрашивает...
Неделями сидеть трассировать модули EFI времени нет.
Внешний вид Setup-Security почти идентичен показанному тут:
http://www.top-password.com/blog/how-to ... er-laptop/Вложение:
set-hdd-password.png [ 21.82 КБ | Просмотров: 9140 ]
Вложение:
remove-hdd-password.png [ 22.75 КБ | Просмотров: 9140 ]
Для открывания винта используется только User пароль. Если стоит пароль на вход в ноут и пароль на винт - пришлось бы запрашивать оба пароля. Я такого не видел. Считать пароль винта из служебки BIOS не может, для этого нужны прпрайетарные виндор команды (и еще знать что ими читать и как раскодировать). Поэтому чтобы обеспечить возможность входа по одному паролю BIOS должен хранить пароль винта среди своих ресурсов и разблокировать им винт. Для восстановления "по коду" - тоже самое. Если у BIOS-а нет пароля от винта - никакими "кодами" и "ответами" он его не разблокирует. Винты "в эти игры не играют".
Остальные пароли я разобрал.
Вот как выглядит область EEPROM для хранения паролей без паролей и с установленными Supervisor = 1, User = AAAAAAAA
Вложение:
Pass_Null_vs_S1_U8xA_800.png [ 35.61 КБ | Просмотров: 9140 ]
Блок паролей хранится в дампе BIOS по смещению 17F000h (FFF7F000h в памяти, согласно FlashIt)
Содержит EFI сигнатуру _FVH и шаблон из 16-и ASCII троек (3333333333333333)
Пароль Supervisor хранится по смещению 17А048h
Пароль User хранится по смещению 17А058h
Принцип хранения обоих паролей одинаков. Пароли зашифрованы.
Каждый блок пароля состоит из Длины - 1 байт, зашифрованного пароля 1 - 8 байт, контрольной суммы 1 байт
Максимальная длина пароля 8 символов определяется формой ввода в BIOS Setup.
Для того, чтобы пароль установился нужно обязательно не только правильно ввести его в сотв форму в Setup и получить подтверждение,
что Password is set, но и выйти из Setup с сохранением настроек.
На каждый блок пароля выделено 16 байт. Не использованные байты заполняются нулями (00h)
Крайне примитивное табличное шифрование производится с использованием фиксированного ключа MAR10648567, взятого из референсного EFI SDK
https://www.virtualbox.org/svn/vbox/tru ... e/MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c
Код:
/**
Encode the password using a simple algorithm.
@param Password The string to be encoded.
@param MaxSize The size of the string.
**/
VOID
EncodePassword (
IN CHAR16
&n
bsp;*Password,
IN UINTN &
nbsp; &nb
sp; MaxSize
)
{
UINTN Index;
UINTN Loop;
CHAR16 *Buffer;
CHAR16 *Key;
Key = L"MAR10648567";
Buffer = AllocateZeroPool (MaxSize);
ASSERT (Buffer != NULL);
for (Index = 0; Key[Index] != 0; Index++) {
for (Loop = 0; Loop < (UINT8) (MaxSize / 2); Loop++) {
Buffer[Loop] = (CHAR16) (Password[Loop] ^ Key[Index]);
}
}
CopyMem (Password, Buffer, MaxSize);
FreePool (Buffer);
return;
}
Однако, алгоритм использован иной, даже попроще. Точнее сказать, алгоритмов шифрования с помощью данного ключа в BIOS-е используется 2 разных, и оба они "попроще".
Шифрование с указанным ключом встречается в трех модулях EFI.
Метод в модуле OemSetupBrowser, который, в числе прочего, обеспечивает
диалог меню паролей в Setup. Метод использует операцию XOR между паролем и
ключом, и где он используется я не разбирался. Возможно добавлен в соотв модуль для маскировки.
Вложение:
OemSetupBrowser_1008.png [ 70.3 КБ | Просмотров: 9140 ]
Метод в модулях SysPassword и Int15Interface. Метод использует операцию ADD с простым ключем-шаблоном MAR10648567.
Именно этот метод используется для кодирования паролей перед записью в EEPROM.
Вложение:
SysPass_1008.png [ 89.77 КБ | Просмотров: 9140 ]
Процедура кодирования пароля очень проста:
Берем первый байт пароля, добавляем к нему ВТОРОЙ байт из ключа-шаблона - получаем первый байт закодированного пароля.
Берем второй байт пароля, добавляем к нему ТРЕТИЙ байт из ключа-шаблона - получаем второй байт закодированного пароля.
и так далее до конца пароля. Т.е. CryptedPass[i] = Pass[i] + Key [i+1].
В конце считаем и пишем контрольную сумму, которую нужно вычислить суммирование всех байтов ЗАКОДИРОВАННОГО пароля,
ВКЛЮЧАЯ ДЛИНУ, после его вычесть 1 и применить бинарную операцию NOT. От результата взять только младший байт и записать его в конце пароля,
После чего дополнить строку закодированного пароля нулями (00h) до полной длины 16 байт.
Возьмем первый пароль со скрина - пароль Supervisor.
Заведомо известно, что он состоит из одной ASCII единицы.
ASCII код "1" = 31h
Ключ MAR10648567 в памяти записан в Unicode.
Поскольку все символы относятся к первым 128 символам Unicode они однозначно попадают в нулевую кодовую таблицу
и их запись в памяти выглядит как ASCII коды перемежающиеся нулями (00h код страницы Unicode).
Код:
4D 00 41 00 52 00 31 00 30 00 36 00 34 00 38 00 35 00 36 00 37 00
Процедура кодирования пароля "нулями" и кодовыми страницами Unicode не интересуется, поэтому использует лишь ASCII коды, пропуская нули.
При этом "эффективный" ключ "MAR10648567" состоит из 11 ASCII символов:
Код:
4D 41 52 31 30 36 34 38 35 36 37
Берем первый (и единственный) символ пароля "1".
К его коду 31h добавляем код ВТОРОГО символа ключа 41h, получаем 72h
Теперь вся строка закодированного пароля состоит из 2 байт - длины = 01h и кода первого символа 72h (т.е. 01 72)
Теперь посчитаем контрольную сумму: 01h + 72h = 73h, 73h - 01h =72h, NOT 72h = 8Dh.
Дополняем контрольную сумму в конец закодированного пароля и дополняем строку нулями до 16 байт.
Тогда полная строка закодированного пароля для записи в EEPROM получится:
Код:
01 72 8D 00 00 00 00 00 00 00 00 00 00 00 00 00
Смотрим на скрин, сравниваем по смещению 17F048h
Возьмем второй пароль со скрина - пароль Supervisor.
Заведомо известно, что он состоит из 8 ASCII символов AAAAAAAA.
Следует заметить, что пароли в этом BIOS НЕ Case Sensitive, т.е. регистронезависимые.
Поэтому как бы мы не ввели пароль "AAAAAAAA", "aaaaaaaa", "AaAaAaAa" - он будет преобразован к нижнему регистру: "aaaaaaaa".
ASCII код "aaaaaaaa" = 61 61 61 61 61 61 61 61h
"Эффективный" ключ "MAR10648567" все тот же, состоит из 11 ASCII символов:
Код:
4D 41 52 31 30 36 34 38 35 36 37
Берем первый символ пароля "a". К его коду 61h добавляем код ВТОРОГО символа ключа 41h, получаем A2h
Берем второй символ пароля "a". К его коду 61h добавляем код ТРЕТЬЕГО символа ключа 52h, получаем B3h
Берем третий символ пароля "a". К его коду 61h добавляем код ЧЕТВЕРТОГО символа ключа 31h, получаем 92h
и т.д. до конца пароля.
Теперь вся строка закодированного пароля состоит из 9 байт - длины = 08h и закодированного пароля (т.е. 08 A2 B3 92...)
Теперь посчитаем контрольную сумму: 08+A2+B3+92+91+97+95+99+96h = 04DBh, 04DBh-01h = 04DAh, NOT 04DAh = FFFFFB25h => 25h.
В итоге получаем
Код:
Pass: 08 61 61 61 61 61 61 61 61
++ ++ ++ ++ ++ ++ ++ ++
Key: 4D 41 52 31 30 36 34 38 35 36 37
== == == == == == == ==
Code: 08 A2 B3 92 91 97 95 99 96 25
Длину ^^ не троогаем, Checksum ^^ считаем
Дополняем контрольную сумму в конец закодированного пароля и дополняем строку нулями до 16 байт.
Тогда полная строка закодированного пароля для записи в EEPROM получится:
Код:
08 A2 B3 92 91 97 95 99 96 25 00 00 00 00 00 00
Смотрим на скрин, сравниваем по смещению 17F058h
Декодировать пароль нужно, понятно обратной процедурой:
Берем закодированный пароль, при желании считаем контрольную сумму чтобы проверить его целостность.
Вычитаем из каждого байта кода соотв символ шаблона - получаем исходный пароль, вернее ASCII коды его символов,
переводим их в символы по любой таблице ASCII или в Hex Editor (типа Hiew или WinHex) и восстанавливаем доступ
к компу назвсисимо от наличия и работоспособности утилит.
Код:
Code: 08 A2 B3 92 91 97 95 99 96 25
-- -- -- -- -- -- -- --
Key: 4D 41 52 31 30 36 34 38 35 36 37
== == == == == == == ==
Pass: 08 61 61 61 61 61 61 61 61
Иной вариант - забиваем всю область пароля нулями, соотв пароль будет пустой.
Только не весь блок затираем! Смотрим на верхнем скрине как выглядит чистый не запароленный блок, сравниваем с нижним, запароленным блоком ниже и понимаем, что нужно вычистить из своего блока, а что не трогать!
Флажок (вернее флажки) опции Password On Boot хранятся в виртуальном CMOS, в блоке NVRAM, по адресу 180000h.
Кроме CMOS в данном блоке хранятся иные переменные часто изменяемые, в т.ч. данные DMI о загрузочных устройствах
итп RunTime информация. Чтобы предотвратить преждевременный износ Flash памяти в данном блоке организован Wear Leveling
Каждый раз блок информации пишется на новое свободное место, а старые копии остаются на своих местах пока не кончится место.
После этого физические блоки под самыми старыми записями стираются и на них пишется новая копия данных.
Все бы хорошо, но из-за этого не просто найти текущую копию CMOS среди десятков других. Остальными переменными я не занимался,
но что касается CMOS, то при записи новой копии меняется флажок в предыдущей копии.
Первые байты каждой копии CMOS представляют из себя широко известную сигнатуру AAh 55h, третий байт, как раз некий флажок,
меняющийся с 7Fh в актуальной копии на 7Ch в устаревшей (но тут я серьезно не рыл, поэтому нужно признать "измышлениями"

).
По смещению 32h можно увидеть название блока в Unicode "S e t u p ". Вот по этим признакам и ориентироваться при поиске CMOS.
Смещения там не "круглые", что в десятичной, что в шестнадцатиричной системе. Каждый блок CMOS занимает 2EAh (746 десятичных) байт.
Пример:
Код:
00 00 00 00-00 00 AA 55-7C 00 07 00-00 00 0C 00 U|
00 00 BC 02-00 00 F4 27-4A A0 00 DF-42 4D B5 52 'Jа BM R
39 51 13 02-11 3D 10 AF-53 00 65 00-74 00 75 00 9Q = пS e t u
70 00 00 00-00 00 00 00-00 00 00 00-00 00 01 03 p
;
Найдя актуальную копию CMOS, флажки можно увидеть по смещениям 20h и E2h ОТ НАЧАЛА CMOS!
Если стоит опция Password on Boot, то байт по смещению 20h = 10h, по смещению E2h = 01h
Если Password on Boot отключен, то байт по смещению 20h = 11h, по смещению E2h = 00h
Соотв, есть возможность менять и иные флажки в CMOS, но для этого нужно иметь его карту.
Метод представляется сложным (вернее не сложным а довольно трудоемким) даже для искушенного специалиста,
поэтому приведена для желающих самостоятельно исследовать тему либо написать готовый инструмент (с пониманием своей степени ответственности в этой рискованной области!).
Для того чтобы узнать или снять пароль с использованием этой информации нужно снять полный дамп BIOS!
Если у Вас ноутбук может загрузить любую ОС - сливаете бакап BIOS Backup Toolkit под Win32/64 или FlashIt Dump.bin /G под DOS (см предыдущие посты). Если пароль не позволяет ничего грузить - снять можно только методами типа попыток корочения джамперов или попыток аварийного восстановления BIOS из бут блока (опсано в предыдущем посте). В последнем случае потеряете DMI (если бут блок пишет закрытые области и у Вас в образе нет заполненного DMI).
Для специалиста иной раз легче выпаять SPI, считать дамп на проге и высчитать или вычистить из него пароли (Будьте осторожны, там может быть еще пароль на винт, до которого я не добрался по причинам описанным вверху, делайте бакапы!)
Дополнительная информация:
Основная часть кода в BIOS (касается всех или большинства Insyde) сжата по алгоритму LZMA. Для того, чтобы иметь возможность изучать весь код, вырезать и исследовать отдельные EFI модули
нужно распаковать имидж утилитой LZMA из комплекта LZMA SDK (основа 7Zip).
Открываете образ BIOS любым Hex редактором, ищете ближайшую последовательность байтов "5D 00 00 80 00"
и вырезаете начиная с нее все до конца файла в отдельный файл (напр Insyde.lzm). Потом распаковываете этот файл: LZMA d Insyde.lzm Insyde.bin
Модули имеют PE/EXE (EFI) формат и начинаются со стандартной сигнатуры "MZ", вскоре после котрой можно найти "PE".
Имена модулей в Unicode вписаны в конце каждого модуля. После нахождения ивырезания модулей все прекрасно разбирается и изучается методами статического анализа.
Я не использовал в прцессе разбирательства ничего кроме Far, Hiew и FC из комплекта DOS/Win.
Вот смещения интересных модулей (В РАСПАКОВАННОМ BIOS! НЕ в образе для заливки во флеш!):
SysPassword 135438h-135F13h
OemSetupBrowser 13F538h-158617h
Int15Interface 1B22BCh-1B767Fh
PasswordConsole 135F70h-136CD4h
HddPswdServiceBody 136D54h-13A220h
HddPswdService 13A288h-13B54Ch
HiiDtabase 13B598h-13F4F4h
Некоторые интересные адреса видно на скринах, также пользуйтесь поиском по ключевым словам и не забывайте про F6 DataRef в Hiew
Если потребуется патч и пересборка - лучше использовать проверенные инструменты Andyp на тему Insyde BIOS SLIC Mod.
Прикладываю весь "комплект исследователя" в аттаче
Вложение:
6935_BIOS_Unpacked.zip [1.16 МБ]
Скачиваний: 44
Успехов!
P.S. Если что не по месту то админы могут перенести в правильное место. Я не обижусь
