Пост практически продолжение темы UEFI.
История покупки
Началась вся история с того для работы был приобретен ультрабук Lenovo U310 (с Windows 8). Выбирался ультрабук по таким параметрам как:
- Тонкий
- Долго держит заряд
- Не сильно дорогой
- Наличие аппаратного AES
Шифрование само по себе было важно из-за постоянной работы с конфиденциальными данными + исходные коды рабочих программ.
По этому всё это занимало целый раздел на HDD, который был зашифрован через TrueCrypt.
Так как объем данных был довольно большой, то программной реализации шифрования уже не хватало бы. Вернее хватало бы, но поиск по ним был бы довольно долгий + длительная компиляция.
Именно по этому и хотелось взять ультрабук с поддержкой аппаратного шифрования AES.
Выбор пал на U310 с процессором Intel i5-3317u. Посмотрев описание процессора, точно удостоверился в том, что там присутствует аппаратный AES (реализованный через набор инструкций AES-NI).
Начало проблемы
После покупки сразу удалил все служебные разделы, поставил Windows 8 на SSD (Program Files оставил на HDD). В общем радовался работе. До тех пор пока не пришло время начать шифрование раздела с данными. TrueCrypt упорно показывал что AES-NI отсутствует. CPUID и прочие программы также писали что AES-NI отсутствует. Средняя скорость шифрования была 218 Мегабайт/сек при этом довольно сильно загружался процессор.
Поискав в сети информацию по этому поводу, выяснил что у некоторых работает AES, а у некоторых нет, при том что процессор был одинаковый. Причем на более ранних версиях работало всё (UEFI 65CN21WW). На более поздних (UEFI 65CN89WW) уже не работало. Причина этого вроде в том, что наличие аппаратного AES переводит ультрабук в разряд устройств для аппаратного шифрования и следовательно требует сертификации как криптографическое оборудование. И Lenovo для экономии, на некоторых моделях ультрабуков, через UEFI заблокировали AES-NI
Поставить более старую версию UEFI не получалось т.к. софт с официального сайта отказывался прошивать UEFI и выдавал ошибку
ERROR 233 — Only secured capsule is allowed on a SecureFlash system! Status = 1.
Более новой версии в сети на тот момент не было, а те что были не ставились. В общем пришлось смериться с отсутствием аппаратного AES.
Более того осложнялось всё тем, что микросхема UEFI припаяна на метров к плате и отсутствует система восстановления. т.е. легким движением руки ультрабук превращался в кирпич.
Решение проблемы
Через определенное время на 4pda заметил что товарищ GlowWorm выложил UEFI для U310 версии 65CN90WW. Причем не обычный, а с запуском обновления из под UEFI Shell. Именно там и был обнаружен UEFI модуль который мог прошивать нормально BIOS.
К слову будет сказано — практически все программы и модули для UEFI имеют формат PE+ (64 битный). т.е. спокойно могут быть созданы с использованием любого C компилятора под Windows поддерживающего x64.
В общем после перепрошивки AES так и не заработал. Скорее всего данные о блокировки располагались в NVRAM или еще каком-нибудь другом месте. Но уже была небольшая зацепка. Раз удалось удачно перепрошить, то можно было экспериментировать уже с патчем модулей UEFI.
После чтения мануалов и просто информации в сети, было выяснено что за работу AES-NI отвечает переменная 0x13С в MSR регистре.
Доступ к чтению и записи MSR можно осуществить только из ядра системы (ring 0). Ручное написание драйвера который запишет 0 или 1 туда, не дало никакого результата, так как система не позволяла писать в него. Также по информации из сети было выяснено что некоторые значения можно изменить только из под SMM (System Management Mode — режим системного управления), в который добраться просто так нереально.
На pastebin () была найдена заметка про патч для разблокировки AES-NI.
Смысл блокировки была в том, что получалось значение MSR 0x13C далее если AES присутствовал, то запрашивалось значение какой-то переменной и исходя из её значения, записывалось новое значение в MSR 0x13C, тем самым управляя работой AES-NI.
На pastebin был код
0000000000033D7: B9 3C 01 00 00 mov ecx,13Ch
00000000000033DC: E8 47 18 00 00 call 0000000000004C28
00000000000033E1: A8 01 test al,1
00000000000033E3: 75 2E jne 0000000000003413
00000000000033E5: 0F B7 15 F4 11 00 movzx edx,word ptr [000045E0h]
00
00000000000033EC: 66 0F BA E2 09 bt dx,9
00000000000033F1: 72 0B jb 00000000000033FE
00000000000033F3: F6 C2 04 test dl,4
00000000000033F6: 75 06 jne 00000000000033FE
00000000000033F8: 48 83 C8 03 or rax,3
00000000000033FC: EB 08 jmp 0000000000003406
00000000000033FE: 48 83 E0 FD and rax,0FFFFFFFFFFFFFFFDh
0000000000003402: 48 83 C8 01 or rax,1
0000000000003406: 48 8B D0 mov rdx,rax
0000000000003409: B9 3C 01 00 00 mov ecx,13Ch
000000000000340E: E8 1F 18 00 00 call 0000000000004C32
0000000000003413: 33 C0 xor eax,eax
0000000000003415: 48 83 C4 38 add rsp,38h
0000000000003419: C3 ret
and change
00000000000033F8: 48 83 C8 03 or rax,3
to
00000000000033F8: 48 83 C8 01 or rax,1
Но то было упоминания про UEFI для какого-то другого ноутбука. По этому модули и адреса могли не совпадать. Но всегда можно самому найти по сигнатурам.
Патчим прошивку
1) Для начала нам понадобится инструмент PhoenixTool. В сети нашел PhoenixTool 2.01. С помощью него распаковываем прошивку (файл 65CN90WWv.rom)
Файлы имею вид
XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX_0_XXXX.ROM
XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX_1_XXXX.ROM
XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX_2_XXXX.ROM
XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX_3_XXXX.ROM
Если XXXX совпадают у файлов то значит эти файлы относятся к одному модулю. Цифры 0, 1, 2, 3 меняются. В одном из файлов будет код (либо двоичный либо PE64) В другом писание что за модуль (его название)
2) Затем нам необходимо найти сигнатуру от которой надо отталкиваться. Единственное что приходит в голову это использовать инструкцию mov ecx, 13Ch так как в ней записан интересующий нас номер в MSR.
3) Использую Total Commander осуществляем файлов поиск HEX: B9 3C 01 00 00. В итоге находим два модуля: CpuInitDxe.efi и Shell.efi.
По логике CpuInitDxe.efi как раз подходит. Это имя модуля с файлом 62D171CB-78CD-4480-8678-C6A2A797A8DE_1_727.ROM
4) Дизассемблируем 62D171CB-78CD-4480-8678-C6A2A797A8DE_1_727.ROM через IDA (64 битную версию) в коде находим нужную нам инструкцию. Данная инструкция встречается в функции sub_4580. Как раз рядом видим инструкцию or rax,3 (HEX: 48 83 C8 03)
5) Используя WinHEX можно с легкостью найти то место в файле (HEX: 48 83 C8 03) и заменить на HEX: 48 83 C8 01 тем самым поменяв условия на or rax, 1
6) С помощью PhoenixTool заменяем модуль на пропатченный
Вот и всё, новая прошивка готова.
Результат
После перепрошивки и перезагрузки TrueCrypt увидел наличие AES-NI инструкций (CPUID и прочие программы подтвердили это).
Производительность AES (по замерам TrueCrypt) увеличилась с 218 Мегабайт/сек до 1.2 Гигабайт/сек. Так что практически в 5 раз увеличилась скорость.
Конечно может быть всё можно было проще сделать (правкой nvram или какого-нибудь другого места), но для меня это так и осталось неизвестным.
Единственный минус всей проделанной работы — ультрабук лишился гарантии.
Автор: shevmax