Комментарии 122
После многочасовых мучений выяснилось, что первый вариант отпадает. И даже не потому что в даташите на мой чипсет (Intel Skylake / Kaby Lake) нет описания как послать произвольную SPI команду по шине, это я смог найти в даташите у китайцев. Чипсет нагло игнорирует мои попытки послать запрос, будто эта фича (SPI Software Sequencing) отключена, короче я так и не нашёл, где её включить.Начиная со Skylake как раз режим software sequencing больше не поддерживается.
Громадное спасибо за статью, снимаю шляпу за проделанную работу! Это прям хабртортище!
Grub умеет прикидываться биусом, я бы для него модуль дописывал и эмулировал диск, но так тоже интересно)
Вот этого не подскажу. За чтение отвечает отдельный микроконтроллер, и там всё настолько точно подогнано, что сомневаюсь в возможности. Лучше спросить у спецов по восстановлению данных.
На хабре видел статью по флешкам по этой теме.
То чувство когда только что компилировал efi-приложение на базе edk2, а тут такое.. Снимаю шляпу.
Не смотрели, прокатит ли такой трюк с SSD? Ибо мобильный HDD в чачестве системного харда - боль.
Это нужно изучать внутренности прошивки какого-нибудь SSD. В сети есть некоторые полезности в плане изучения и отладки, но программных инструментов гораздо меньше. Точно возможно, но сколько уйдёт на исследование - заранее сказать сложно.
Не смотрели, прокатит ли такой трюк с SSD? Ибо мобильный HDD в чачестве системного харда - боль.
Эхъ, в былые времена с дискеток систему подгружали(1я, 2я, 3я..) - счастливые ходили;)
Я так понял, по паспорту диска всё равно можно заподозрить неладное. Правда это никак не поможет, ОС всё равно не сможет туда писать и оттуда читать. Такой подход может пригодиться при проверке на границе, например.
Разве что по служебному паспорту, где будет несколько разных Max_LBA. Обычный ATA паспорт подозрений не вызывает, в нём что угодно написать можно. Например, так в Xbox 360 "прошивали" HDD, полностью подсовывая паспорт от другого диска.
Для этого ноутбук нужно как минимум разобрать. Простая проверка с помощью LiveCD или вообще загрузки в имеющуюся ОС никак не заподозрит неладное.
Наклейку можно оторвать/сделать частично нечитаемой/заменить на наклейку от другого диска подходящего размера.
и наклейку можно поменять
Отличная статья!
Есть предположение, что можно добиться примерно того же результата на дисках, которые поддерживают спецификацию OPAL 2. Там можно определять области диска, которые доступны на чтение или запись или недоступны вообще. И удалить эти области можно только обладая паролем админа от этого диска.
А там не будет ли ситуации, когда видно, что область есть, но доступа к ней нет? Или прям совсем скрывается, уменьшая размер диска?
Прям совсем скрывается, диск теперь считает, что у него другая конфигурация
Попробовал загрузиться с другого устройства без расшифровки основного OPAL 2.0 диска (Samsung 970 Evo Plus) — Evo видится как маленький EFI System Partition (где лежит sedutil, запрашивающий пароль) плюс "нераспределённая область" на весь размер шифрованной части. При этом, если расшифровать, маленький EFI раздел полностью исчезает. Непоследовательно как-то, могли бы точно так же скрывать большую часть в заблокированном состоянии.
Когда диск совсем нерасшифрован - у него особый режим: MBR - небольшая незашифрованная область, которая помогает загрузиться машине и провести процедуру расшифровки диска.
А вот если будет кусок диска доступ к которому совсем закрыт, а у другому открыт - я не знаю, что будет. Надо экспериментировать. :-) Насколько я понимаю это весьма редкие режимы работы OPAL.
MBR в заблокированном состоянии, естественно, видеться должен. Мои претензии к тому, что в нём так же видится (как неразмеченное пространство) и шифрованный объём. Так понимаю, диск сообщает системе полный объём, а та уже понимает что таблица разделов в MBR описывает существенно меньшее пространство и показывает «у вас там есть ещё».
Кстати, «раз уж все здесь», вопрос к специалистам по UEFI: давно мечтаю написать (или найти готовый) UEFI-модуль, загружаемый из этого самого видимого MBR-раздела, который бы запрашивал пароль, посылал в OPAL-диск (это команды Security Protocol In/Out), подхватывал изменившуюся конфигурацию диска и продолжал загрузку с него же, не перезагружая систему (как сейчас делает sedutil). Это вообще возможно?
Ну если это будет небольшой GPT раздел с .efi загрузчиком, то он подхватится автоматом, с посылкой команд диску проблем не вижу, тот же ATA протокол задействовать, если чего. А вот как потом без перезагрузки сбросить диск и вызвать загрузчик операционки (естественно, тоже EFI) - не скажу, но думаю, что возможно
Вроде как PBA от sedutil делает именно это - загружает OS после разблокировки диска, так что наверняка это возможно.
Но насколько я понимаю, проблема в другом: засыпание OS + блокировка диска и пробуждение с разблокировкой диска. Я надеюсь увидеть как это делает Windows 10, но пока не придумал как заставить его использовать аппаратное шифрование диска с которого он сам и грузится.
Как раз sedutil PBA и пользуюсь сейчас, но он довольно медленный: сначала стартует сильно урезанный образ Linux, содержащий приложение, запрашивающее пароль, посылающее команду дискам и перезагружающее систему, дальше идёт повторная загрузка с того же диска, но уже из шифрованной части. Вместо этого хотелось бы как-то так: из MBR грузится UEFI-приложение, запрашивает пароль, посылает его диску, перечитывает конфигурацию диска и продолжает с него загрузку.
Режим сна и OPAL — отдельная проблема пока без нормальных решений (видел костыли с удержанием пароля в RAM и повторной отправкой его диску, спасибо, не надо), у меня он просто отключён. Проблему режима сна наверное решило бы встраивание вышеописанного UEFI-модуля в BIOS? (повторно запросить пароль и разблокировать диск до восстановления контекста ОС?) Или загружаемому модулю как-то можно "остаться резидентом" и вмешаться в процесс пробуждения?
Со сном проблема, там пробуждение идёт очень урезанно, только с этапом PEI, не представляю как меню выводить. Только если сохранять пароль где-то
Если для хранения пароля использовать TPM, то мне кажется можно было бы и не хранить пароль во время сна. Ведь BitLocker умеет доставать секреты для расшифровки диска без каких-либо паролей, просто из TPM, который в свою очередь гарантирует, что загрузка прошла без модификаций.
В общем я читал, что Windows 10 умеет использовать OPAL 2, но вживую этого не видел. Было бы интересно посмотреть.
У Linux добавили какой-то патч для NVME, чтобы сохранять пароль от OPAL на время сна, но как это работает - опять-таки неизвестно. Надеюсь, что это временный, дополнительный пароль только на время сна.
Если для хранения пароля использовать TPM, то мне кажется можно было бы и не хранить пароль во время сна. Ведь BitLocker умеет доставать секреты для расшифровки диска без каких-либо паролей, просто из TPM, который в свою очередь гарантирует, что загрузка прошла без модификаций.BitLocker не хранит секреты в TPM. Он может использовать TPM в качестве key protector (как они это называют). Ключ для шифрования данных в любом случае хранится где-то снаружи, либо в защищенном виде, либо нет.
В общем я читал, что Windows 10 умеет использовать OPAL 2, но вживую этого не видел. Было бы интересно посмотреть.Скорее всего, вы читали про Encrypted Hard Drive, а не про Opal. Это не эквивалентные вещи: Microsoft eDrive дополнительно реализует протокол на основе IEEE 1667 для provisioning дисков с аппаратным шифрованием, который и используется в BitLolocker (точнее, может использоваться, потому что по умолчанию – не используется).
Можно ли таким диском пользоваться вне экосистемы BitLocker у меня возможности проверить нет. Насколько понимаю, с этим могут быть проблемы.
У Linux добавили какой-то патч для NVME, чтобы сохранять пароль от OPAL на время сна, но как это работает — опять-таки неизвестно. Надеюсь, что это временный, дополнительный пароль только на время сна.Вы про это?
Не знал, что PBA перезагружает комп после разблокировки диска. Это многое объясняет.
А зачем для разработки и отладки UEFI-драйвера встраивать его в прошивку? Можно же из Shell или через Driver Option загружать его с флешки, а потом реконнектить все драйверы, чтобы диск заново обнаружился.
О, драйверы можно реконнектить? Если есть какие материалы про такую отладку почитать, присылайте, было бы круто! А так да, встраивал чтобы до ATA драйвера запуститься и успеть послать переключение до того, как разметку начнет читать.
Исходники команды disconnect из UEFI Shell: https://github.com/tianocore/edk2/blob/master/ShellPkg/Library/UefiShellDriver1CommandsLib/Disconnect.c
Правда, не знаю, поддерживает ли драйвер AHCI контроллера disconnect.
Ещё можно по-другому обойтись без встраивания – переключать и перезагружаться, если от перезагрузки состояние диска не сбрасывается.
Ня! Жаль, нельзя второй плюс в карму. Да что там — два.
Это торт, я джава года ждал такого качественного материала.
Мужик, ты псих ненормальный. Аж подбивает самому статью написать про что-нибудь из реверса и низкоуровневого треша.
А теперь напридумывали всякие ооп, абстракции, шаблоны проектирования, специализированные микросхемы вместо универсальной логики, надмозговый оверинжиниринг в самых примитивных задачах, так что железки по сути стали обфусцированным неподдающимся доработке шлаком.
Если бы не было этого шлака, то прогресс был бы гораздо медленнее, а так благодаря всем этим абстракциям и т.п. разработка проще, легче, дешевле. То, что в статье описано, это круто конечно, но это удел меньшинства. 99% людей это вряд ли понадобится.
Но это не меняеет того, что для инжинера железки по большей части не пригодны и приходится брать специально промышленные ОЕМ модули, которые рассчитаны на дальнейшую разработку, и стоят в 10 раз дороже. И то порой даже в ОЕМ палки в колеса ставят, добавляя всякие проверки подписи и защиты от постороннего вмешательства.
Пробный запуск OpenOCD показал
А как вы делали этоот пробный запуск?
А может, аппаратно? 2 диска и условный переключатель П2К (или мультиплексор/шинный формирователь шустрый) на sata/pcie?
Я понимаю, что немного в сторону, но не проще на жестком диске посредством Lnux сделать четвертый раздел и установить туда тот же Linux.
Поясню, в Windows есть ограничение на количество разделов на одном диске в количестве трех - не размеченная область, диск 1 и Диск 2...
При этом есть нюанс, Windows новый раздел не видит, а Linux видит всё.
Да вроде в десятке уже без ограничений, даже на флешке дюжина разделов теперь видится. И конечно же проще, но не так интересно!
Честно говоря я не знаю, в чем была причина, но в моем случае было именно так, при разметке диска область не монтировалась и её не было видно... Могу с легкостью отнести этот эффект к моим кривым рукам :)))
Столько трудов в него было вложено, столько исследований проведено и собрано в финальную статью!
Буду читать ещё раз, а то не всё с первого раза уложилось и появилось множество вопросов.
Особенно понравилось отключение проверки выхода за пределы максимального LBA. Преобразование ATA в код, LBA из ATA команды во внутренний LBA, добавление патча в конец модуля.
Шедеврально!
А отключение проверки на выход за пределы максимального LBA не приведёт к тому, что кривой софт, запущенный с первой половинки диска, повредит данные на второй половинке диска? Или эта проверка перенесена в транслятор, меняющий номер запрашиваемого LBA-блока?
Скажите, а физическая головка чтения/записи только половину площади самой поверхности использует ? Или файл может оказаться в любом месте ?
Точно сказать нельзя, диск внутри себя транслирует логический номер сектора в реальное место на диске. Но вообще, тут диск с одной пластиной и двумя головками, предположу, что в "режиме 0" почти все данные будут размещаться на одной половине блина HDD (головка 0), а в "режиме 1" - соответственно, будет использоваться вторая половина блина (головка 1).
Наверно несложно будет реализовать режим «только для чтения» для основного раздела, записывая изменения на дополнительный и отдавая ОС актуальные данные, а во время перезагрузки реализовать возможность выбора — продолжить модификацию данных, откатиться к исходному состоянию или модифицировать его до текущего.
В случае с HDD откат / модификация будет занимать продолжительное время (копирование 160 гигов внутри диска), но вообще возможно.
В ней хранить список модифицированных секторов и собственно их актуальное содержимое. При обращении ОС к номеру сектора, имеющемуся в таблице, отдавать модифицированное содержание (вплоть до перезагрузки). За сессию ведь перезаписывается не так много секторов, причём часть из них — повторно — часто модифицируемые файлы, промежуточные состояния можно отбрасывать.
Можно вообще добавить возможность фильтрации по типу файлов или папке, к примеру изменения в реестре или в системной папке не фиксировать без необходимости, «забывая» при перезагрузке.
ps. Список и содержимое модифицированных секторов вообще можно хранить в ОЗУ, пока его объёма достаточно.
Тут уже посложнее, например, если в диапазон чтения попадает как оригинал, так и измененные данные, понадобится их как-то соединить.
Я про случай, когда в одном ATA запросе читают диапазон секторов, в котором как неизмененные, так и измененные сектора попадутся. Это придется внутри диска их по отдельности вычитывать, чтобы целиком ответ вернуть.
Для уменьшения движения головок и для выравнивания загруженности каждой из них диски используют различные схемы чтения и записи.
![](https://habrastorage.org/getpro/habr/comment_images/10f/89a/725/10f89a725cc8c47f2c33db8b1974610c.png)
Красные линии показывают путь, по которому пройдёт блок магнитных головок во время чтения или записи. Как вы можете видеть, путь зигзагообразный. Количество треков в зигзаге может отличаться на разных дисках и на современных дисках также может быть уникальным для каждой головки каждого диска (поскольку головки имеют различные параметры TPI и изменяющиеся зигзаги помогут уменьшить движения БМГ)."
Похоже, задержка на переключение головки относительно небольшая. Что если уполовинивать HDD именно переключением головки — тогда для чтения оригинальной/модифицированной версии сектора будет достаточно выбрать нужную головку и дождаться сектора, пропустив один оборот шпинделя (8 мс для 7200 об/мин)?
Конечно, для скорости потокового чтения задержка будет губительной, но большие файлы как раз модифицируются гораздо реже.
А отключение неисправной головки сервисные утилиты должны поддерживать, наверно и в прошивке есть для этого какой-то механизм.
Не, ну это ещё больше усложняет задачу :)
Несколько вопросов от полного нуба в EFI, если можно :)
1. Когда драйвер выгружается? Не получится ли так, что он сработает на какое-нибудь «позднее» Ctrl-C и переключит хард, который уже используется?
2. События синхронные? В смысле, если кто-то очень быстро два раза нажмёт Ctrl-C, оно не отправит команду дважды? А если хард определится во время обработки Ctrl-C?
3. Не стало ли медленнее читать/писать данные харду? Подозреваю, что нет, но было бы интересно потестировать.
4. Можно ли написать EFI-драйвер, который будет жить параллельно с осью, или это всё выгружается при старте оси?
5. Правильно ли я понимаю, что secure boot с этим всем несовместим?
Выгружается с запуском системы, сейчас позднее переключение возможно, но если убрать отправку на все текущие диски, оставив только реагирование на новые обнаруженные диски, проблема решится
Ctrl+C только выставляет флажок, на каждый диск команда отправится единожды. И даже если отправить дважды, повторная посылка ни на что не повлияет
Тут только разница в скорости чтения между началом и концом диска. Сам патч на скорость не влияет
Можно, но больше ограничений в плане возможностей и скорости работы
С Secure Boot можно жить, а вот всякие BIOS Guard, которые проверяют целостность прошивки ноутбука помешают засунуть свой драйвер
Microsoft все уже написал за нас, даже не нужно делать ничего вручную.
Visual Studio нынче 2 языка вроде бы сразу ставит?
Но если нет – можно доставить, сейчас инсталлятор стал, по ощущениям, сильно лучше в плане простоты и скорости до-установки компонента, нежели он был раньше :)
FT232H с алиэкспрессНапоминаю, официальный драйвер FTDI окирпичивает китайские клоны.
В схеме подключения была ошибка, я этого не знал и искал ошибки у себя, в итоге ее выявил. Квест был тот еще.
Цель статьи - показать общие техники, подходы к изучению и модификации любых устройств. По WD в сети очень много информации - сервис команды прямым текстом, утилиты, статьи по JTAG и переделке прошивки. Как можно видеть, даже из программ всё это извлекается максимум за час, кому нужно, он и без статьи достанет. Сомневаюсь, что известные многим 4 команды изменят картину.
У нас имеется относительно тонкая прослойка т.н. «специалистов», сидящих по закрытым форумам, и у себя там занимающихся реверс-инженерией, взломом прошивок, написанием утилит и т.п., а затем использующая эти знания для того, чтобы свои услуги и знания подороже продать. Пока все нормально, ничего необычного.
Но, при всем этом, эти «специалисты» свято уверены в том, что эти их «ноу-хау» надо ревностно охранять, иначе на них заработает кто-то другой, либо, не приведи рандом, производитель исправит свои баги, и тогда придется реверсить снова. А на любого, кто посмел эти же знания получить из других источников, даже с первой страницы гугла, и затем поделился ими, таковые «специалисты» яростно нападают, обвиняя авторов материалов в крысятничестве, помощи неведомым злоумышленникам, лишении хлеба честных трудяг, и прочих смертных грехах по отдельности и скопом. Вот это все — уровень ремесленника, а не специалиста, и смотреть на засилие таких «специалистов» в русскоязычном интернете уже просто сил нет никаких.
“Кто-то недалекий из числа моих бывших коллег посчитает эту книгу предательством или, как минимум, помехой в славном деле борьбы с преступностью. Мол, раскрыл все секреты. На самом деле профессиональные секреты могут быть только у провинциального ремесленника, конкурирующего с таким же, как он сам, гробовщиком или горшечником. Если виртуоз-скрипач, карточный шулер или летчик-ас вам расскажут, как они все это проделывают, вы все равно на скрипке не заиграете, в карты продуетесь, а самолет в небо не поднимете. «Недостаточно овладеть премудростью, нужно также уметь пользоваться ею» (это сказал не я, а Цицерон).”Специалисты без кавычек знаниями своими охотно делятся, потому что между ними и обывателем — пропасть из многих лет опыта решения реальных проблем. «Я статьи и книги читал!» «Ну да, я их писал.»
Владимир Андреевич Ажиппо. “Не зарекайся.”
Нет, продолжаем считать, что писать статьи, и этим помогать тренировать новичков и создавать интерес к теме — это все зашквар, подготовка себе замены, и уменьшение потенциального дохода…
Именно по этой вот причине у нас тут, ребята, в нашем ИТ все через жопу, и именно поэтому писать статьи на русском практически некому и практически не для кого.
По сути своей реверс инженеринг — это кража интелектуальной собственностиИзвините, но больше мне с вами не о чем разговаривать, у нас принципиально различные взгляды на жизнь, и к согласию мы не придем.
гораздо полезнее было бы, не описывать весь этот процесс а реализовать подобное решение так — чтобы оно было доступно каждому
Хочешь накормить человека один раз — дай ему рыбу. Хочешь накормить его на всю жизнь — научи его рыбачить (с)
Кстати говоря, с нынешней копроэкономикой реверс скоро станет бессмысленным, т.к. вообще всё железо становится одноразовым.
Интересно, при очередном обновлении 10, может прилететь обновление bios / uefi, оно затрет изменения или нет?
Браво!
Осталось только оформить все это в виде юзабельного простыми людьми инструментария и можно будет с БГ поручаться.
Впечатляет! Спасибо за статью. Проделал все тоже по ней с Intel NUC и уже исследованным ранее с помощью ft2232HL диском. Не пользовался только отладкой с SpiWrite(): прокинул зависимости на EFI_GRAPHICS_OUTPUT_PROTOCOL.
Подскажите по SpiWrite(), SpiRead(), откуда они?
Это мои функции, реализующие Intel SPI Hardware Sequencing протокол.
Спасибо, а то уже на libMPSSE от FTDI начал думать.
Там как раз вся суть в том, что через чтение BIOS производится дебаг. И эмулятор и отладчик в одном лице, удобно.
Да, здорово, что DediProg заложили необходимый функционал. Сам был удивлен, когда забрал такой эмулятор за сотню долларов на e-bay. Видимо зря игнорировал "SPI Hyper Terminal".. Хотя посещали мысли из драйвера выплевывать нечто по SPI и смотреть trace.
Нашел доки на свой чипсет, попробую реализовать SpiWrite(), SpiRead() .
Не ожидал встретить такое серьезное исследование, да еще и практическим примером!
Отличная работа!
Необычный дуалбут: ноутбук с «двойным дном»