Занят тут кое-какими слегка интересными вещами: смотрел, как и где винда хранит рантаймовые сервисы для рантаймовых драйверов.
Опытным путём была выявлена структура
Занимательно, что за этой же структурой находится одна точно такая же, которая носит название
Технически, получив данную(-ые) структуру(-ы) мы вполне можем определить, какие сервисы используются теми или иными рантаймовыми драйверами. Также, в принципе, зная эту информацию, мы можем вполне себе дампить рантаймовые драйвера.
Рассказал что-то возможно интересное, пора пропадать ещё на N-ное количество месяцев, my pancakes.😏
P.S: только как дописал пост, заметил, что последнее поле имеет адрес самой структуры. Это постирония, ебать.
Опытным путём была выявлена структура
HAL_EFI_RUNTIME_SERVICES_BLOCK, которая, собственно, и формирует структуру с поинтерами на рантаймовые сервисы. Как можно догадаться — это далеко не полный список сервисов, так как некоторые не имеет смысла хранить, либо же не имеет смысла вызывать вовсе (SetVirtualAddressMap, например). Последнее, поле, предполагаю, относится к размеру блока, либо же к их количеству (хз, нужно больше смотреть, на физической машине, вероятно, будет другое значение). Также, судя по всему (да так и есть, если исходить из логических заключений), поинтеры на рантаймовые сервисы формируют ещё одну структуру (один из сервисов судя по всему не существует, земля ему пухом).Занимательно, что за этой же структурой находится одна точно такая же, которая носит название
HAL_IUM_EFI_WRAPPER_TABLE, что, судя из названия, предназначена для использования с включенным DeviceGuard. В себе она уже содержит поинтеры на функции с именами HalpIum* (например, HalpIumGetTime (рантаймовый сервис GetTime)). Технически, получив данную(-ые) структуру(-ы) мы вполне можем определить, какие сервисы используются теми или иными рантаймовыми драйверами. Также, в принципе, зная эту информацию, мы можем вполне себе дампить рантаймовые драйвера.
Рассказал что-то возможно интересное, пора пропадать ещё на N-ное количество месяцев, my pancakes.
P.S: только как дописал пост, заметил, что последнее поле имеет адрес самой структуры. Это постирония, ебать.
Please open Telegram to view this post
VIEW IN TELEGRAM
😭6
EU-23-Pagani-LogoFAIL-Security-Implications-of-Image_REV2.pdf
10.4 MB
LogoFAIL slides (BlackHat 2023)
💊3🤡1
Тут мой знакомый открыл регистрацию на собственный CTF. Зная его - тасочки там будут фановые с примесью постмодерна (возможно даже без раста). Так что рекомендую заценить!
Что касательно меня - дропну кое-что в начале/середине мая. Работа заняла неприлично долго времени, учитывая, что у меня сейчас некоторые технические шоколадки, но, надеюсь, всё будет в порядке и дроп пройдёт все тесты (а тестами придётся обмазываться, как говном по стене)
https://vxtwitter.com/cr3mov/status/1783170345194664052
https://vxtwitter.com/cr3mov/status/1783170345194664052
https://vxtwitter.com/cr3mov/status/1783170345194664052
Что касательно меня - дропну кое-что в начале/середине мая. Работа заняла неприлично долго времени, учитывая, что у меня сейчас некоторые технические шоколадки, но, надеюсь, всё будет в порядке и дроп пройдёт все тесты (а тестами придётся обмазываться, как говном по стене)
https://vxtwitter.com/cr3mov/status/1783170345194664052
https://vxtwitter.com/cr3mov/status/1783170345194664052
https://vxtwitter.com/cr3mov/status/1783170345194664052
vxTwitter / fixvx
💖 13 🔁 4
💖 13 🔁 4
cr3.mov (@cr3mov)
gm
We've opened registration for cr3 CTF at https://cr3c.tf/
Sorry for the delays, we were cooking our stuff.
The platform is currently still in beta, feel free to report any bugs/inconsistencies to the #tickets on our discord!
that's it, stay tuned for…
We've opened registration for cr3 CTF at https://cr3c.tf/
Sorry for the delays, we were cooking our stuff.
The platform is currently still in beta, feel free to report any bugs/inconsistencies to the #tickets on our discord!
that's it, stay tuned for…
💅6💊3💔1
Дарова, блин! 👋 👋 👋
Мы давно с вами не виделись, пирожочечки!
Я обещал запостить кое-что интересное, однако у меня как всегда не было времени, надо было кое-что закрыть (например, диплом (я получил смешную бумажечку от областных минцифр за это)) и ещё некоторые вещи, что не давали нормально работать. Я всё ещё намерен доделать и выложить это кое-что, но я не могу сказать точно, сколько на это ещё уйдёт времени.
Собственно, поэтому, я пишу сейчас с некоторой информацией, которую я накопил за несколько месяцев работы (часто, ленивой работы). Я не думаю, что вы узнаете что-то новое, но я хочу коротко расписать чем занимаюсь и чтоб паблек не стоял в простое.
Я занимался написанием SMM драйвера, что изначально казалось весьма сложной задачей, однако, по прошествию времени оказалось, что нет, это по сути более аутичное направление разработки (ну, как и вся около-прошивочное/embedded направление(я)) со своими приколами и постприколами. Ближе к сути со следующего абзаца.
Первым вопросом может стать коммуникация с "внешним миром" и SMM. У спецификации инициализации платформы есть несколько "официальных" предложений на этот счёт и ещё парочка неочевидных (один зависит от платформы).
Вся коммуникация, очевидно, происходит через SMI-хендлеры, которые, очевидно, регистрируются нами при первой инициализации SMM (DXE Foundation передаёт "список" драйверов платформы DXE Core, онный запускает SMM Core (не всегда первым)). Мы, в свою очередь, имеем 10 типов хендлеров (по спецификации), но только 4 нам интересны:
1. Root SMI - хендлеры, срабатывающие при каждом SMI, выброшенных платформой.
2. Child SMI - хендлеры, срабатывающие при явном указании SMM Core GUID данных хендлеров.
3. SW SMI - софтварные SMI, срабатывающие через триггер-порт
4. Periodic SMI - из названия, хендлеры, срабатывающие в период N времени.
5. SX SMI - хендлеры Sleep State (S0 - S5 или G1 -G3, если описывать комплексно).
6. USB SMI - хендлеры, что срабатывают при подключении USB устройств.
7. GPI SMI - General Purpose Input, не уверен за что они отвечают.
8. Standby SMI - хендлеры, что триггерятся на нажатие кнопки ожидания.
9. Power Button SMI - хендлеры, что триггерятся на нажатие кнопки питания.
10. I/O Trap SMI - хендлерры, обрабатывающие специфичные адреса/диапазоны I/O процессора.
Я работал с первыми тремя и самым удобным оказался в итоге второй вариант, так как для него завезён нормальный протокол в двух его версиях (1, 2). Последний имеет в себе возможность работать с виртуальными адресами (а ещё он реализован как отдельный драйвер на армах). Если мы работаем с рутовыми хендлерами, то их суть заключается в том, что они срабатывают при каждом выброшенном SMI. Это не совсем релевантно, так как им не очень удобно передавать пул памяти, в котором может содержаться необходимая информация (о пулах я скажу позже). Дебажить рутовые хендлеры также не сильно удобно при отладке бутовых фаз (DXE, BDS, TSL), так как, опять же, процессор в этих фазах выбрасывает их достаточное количество.
Интереснее обстоит вопрос с софтварными хендлерами (SW SMI). Видите ли, пирожочки, в основном отладка подобных вещей в первую очередь производится на QEMU и подобных вещах, а только потом на реальных машинах. Так вот, OVMF (образ прошивки для QEMU и подобных) не подразумевает реализацию протокола
Мы давно с вами не виделись, пирожочечки!
Я обещал запостить кое-что интересное, однако у меня как всегда не было времени, надо было кое-что закрыть (например, диплом (я получил смешную бумажечку от областных минцифр за это)) и ещё некоторые вещи, что не давали нормально работать. Я всё ещё намерен доделать и выложить это кое-что, но я не могу сказать точно, сколько на это ещё уйдёт времени.
Собственно, поэтому, я пишу сейчас с некоторой информацией, которую я накопил за несколько месяцев работы (часто, ленивой работы). Я не думаю, что вы узнаете что-то новое, но я хочу коротко расписать чем занимаюсь и чтоб паблек не стоял в простое.
Я занимался написанием SMM драйвера, что изначально казалось весьма сложной задачей, однако, по прошествию времени оказалось, что нет, это по сути более аутичное направление разработки (ну, как и вся около-прошивочное/embedded направление(я)) со своими приколами и постприколами. Ближе к сути со следующего абзаца.
Первым вопросом может стать коммуникация с "внешним миром" и SMM. У спецификации инициализации платформы есть несколько "официальных" предложений на этот счёт и ещё парочка неочевидных (один зависит от платформы).
Вся коммуникация, очевидно, происходит через SMI-хендлеры, которые, очевидно, регистрируются нами при первой инициализации SMM (DXE Foundation передаёт "список" драйверов платформы DXE Core, онный запускает SMM Core (не всегда первым)). Мы, в свою очередь, имеем 10 типов хендлеров (по спецификации), но только 4 нам интересны:
1. Root SMI - хендлеры, срабатывающие при каждом SMI, выброшенных платформой.
2. Child SMI - хендлеры, срабатывающие при явном указании SMM Core GUID данных хендлеров.
3. SW SMI - софтварные SMI, срабатывающие через триггер-порт
B2, могут принимать данные через порт B3. Триггер-порты теоретически могут меняться, смотрите на FADT/FACP ACPI таблицу.4. Periodic SMI - из названия, хендлеры, срабатывающие в период N времени.
5. SX SMI - хендлеры Sleep State (S0 - S5 или G1 -G3, если описывать комплексно).
6. USB SMI - хендлеры, что срабатывают при подключении USB устройств.
7. GPI SMI - General Purpose Input, не уверен за что они отвечают.
8. Standby SMI - хендлеры, что триггерятся на нажатие кнопки ожидания.
9. Power Button SMI - хендлеры, что триггерятся на нажатие кнопки питания.
10. I/O Trap SMI - хендлерры, обрабатывающие специфичные адреса/диапазоны I/O процессора.
Я работал с первыми тремя и самым удобным оказался в итоге второй вариант, так как для него завезён нормальный протокол в двух его версиях (1, 2). Последний имеет в себе возможность работать с виртуальными адресами (а ещё он реализован как отдельный драйвер на армах). Если мы работаем с рутовыми хендлерами, то их суть заключается в том, что они срабатывают при каждом выброшенном SMI. Это не совсем релевантно, так как им не очень удобно передавать пул памяти, в котором может содержаться необходимая информация (о пулах я скажу позже). Дебажить рутовые хендлеры также не сильно удобно при отладке бутовых фаз (DXE, BDS, TSL), так как, опять же, процессор в этих фазах выбрасывает их достаточное количество.
Интереснее обстоит вопрос с софтварными хендлерами (SW SMI). Видите ли, пирожочки, в основном отладка подобных вещей в первую очередь производится на QEMU и подобных вещах, а только потом на реальных машинах. Так вот, OVMF (образ прошивки для QEMU и подобных) не подразумевает реализацию протокола
EFI_MM_SW_DISPATCH_PROTOCOL в виду некоторых хардварных особенностей. Этот протокол регистрируют "silicon-based" драйвера, которые не могут эмулироваться в виду тех или иных особенностей. В теории, нам ничего не мешает написать собственные драйвера или портировать один из предложенных (1, 2) с заменой и переработкой некоторых функций (например, этой), но это не входит в мои текущие задачи. Мы можем "эмулировать" работу софтварных хендлеров, регистрируя, например, рутовый хендлер, записывать в порт B2 номер хендлера и читать порт в хендлере, сравнивая значения из порта с нашим. На мой взгляд это кринжово и костыльно.Please open Telegram to view this post
VIEW IN TELEGRAM
😭7💅1
Violent_Maid
Дарова, блин! 👋 👋 👋 Мы давно с вами не виделись, пирожочечки! Я обещал запостить кое-что интересное, однако у меня как всегда не было времени, надо было кое-что закрыть (например, диплом (я получил смешную бумажечку от областных минцифр за это)) и ещё некоторые…
Хорошо, мы зарегистрировали свой хендлер. А как нам общаться, ебать? Платформа предоставляет два протокола для коммуникации, которые доступны нам как в SMM, так и в DXE, а также в последующих фазах, в том числе в рантайме, при условии, что указатель на протокол будет сконвертирован. У нас есть
Где же выделять буфер для коммуникации? В любом месте, кроме как SMM, так как SMRAM закрывается и открывается отдельным протоколом (мы, технически, можем даже это контролировать, неся ущерб целостности платформы), а в эти окошки очень трудно попасть. Единственное релевантное решение, которое я придумал - написание промежуточного рантаймового DXE драйвера, который ловит регистрацию
Я опущу ещё один метод, потому что хочу рассказать ещё о двух менее очевидных, а ко второму "официальному" вернусь позже. Мы можем общаться с "внешним миром" и SMM, неиронично, через NVRAM переменные, при условии, что у нас есть флаг
Есть ещё забавный вариант общаться через Save State (это по сути "карта" со всеми регистрами и их состояниями на момент срабатывания перырвания), кешируя в SMM драйвере
Перейдём к ещё одному специфическому методу коммуникации - мы можем регистрировать ACPI таблицы определённого типа (но не сразу, только по прошествию какого-то промежутка времени), выделяя физический буфер с типом
По правде говоря, у меня сейчас есть некоторые технические шоколадки, которыми я занимаюсь и я опять же не знаю, сколько на это уйдёт времени, но я постараюсь опубликовать это дело в законченном состоянии и оповестить вас, так как не хочу выкидывать на помойку работу, на которую ушло у меня несколько месяцев (могу выкинуть только себя).
Спасибо моим нескольким друзьям, которым я иногда ною по всему этому поводу и они это терпят.
Stay safe.😅 😅 😅
EFI_MM_COMMUNICATION_PROTOCOL и EFI_MM_COMMUNICATION2_PROTOCOL протоколы (1, 2), которые обращаются к SMM Core и триггерят (1, 2) нужный хендлер через сервисы SmiManage или Trigger (1, 2). Учитывая, что данные протоколы конвоируют данные, нам также необходимо хранить где-то данные для хендлера, которые будут позже конвоированы в пространство SMM. Платформа для таких вещей имеет несколько типов пулов: EfiRuntimeServicesData, EfiRuntimeServicesData, EfiReservedMemoryType, EfiACPIMemoryNVS (и вроде бы ещё EfiACPIReclaimMemory, если не ошибаюсь). С другими типами памяти протоколы не работают, так как не предоставляются фазе рантайма. Где же выделять буфер для коммуникации? В любом месте, кроме как SMM, так как SMRAM закрывается и открывается отдельным протоколом (мы, технически, можем даже это контролировать, неся ущерб целостности платформы), а в эти окошки очень трудно попасть. Единственное релевантное решение, которое я придумал - написание промежуточного рантаймового DXE драйвера, который ловит регистрацию
EFI_MM_COMMUNICATION_PROTOCOL/EFI_MM_COMMUNICATION2_PROTOCOL (1, 2), выбрасывает тестовый SMI в ивенте, который триггерит сервис ExitBootServices и ещё один ивент, что конвертирует указатель на проткол, пул памяти и пару функций, реализующих коммуникацию между режимами и публикует пакет данных для модулей ОС. Это удобно, тащемта, несмотря на то, что в итоге мой драйвер находится в HOB, который загружается DXE Core ещё раньше, чем SMM Core.Я опущу ещё один метод, потому что хочу рассказать ещё о двух менее очевидных, а ко второму "официальному" вернусь позже. Мы можем общаться с "внешним миром" и SMM, неиронично, через NVRAM переменные, при условии, что у нас есть флаг
EFI_VARIABLE_NON_VOLATILE. Это может быть удобно в том случае, если целевая ОС реализует возможность регистрировть такие пременные (кеширует сервисы напрямую, я рассказывал об этом здесь, где это можно увидеть на винде, например). Однако, при работе с SMI хендлерами мы не можем обращаться напрямую к рантаймовым сервисом, так как это "не кекурно" и вообще процессор выбросит #PF, потому что вызов данных сервисов будет за SMRAM (очень красиво cтавим классы). Поэтому, нам необходимо предварительно зарегистрировать коллбек на регистрацию протокола EFI_SMM_VARIABLE_PROTOCOL, только тогда мы можем общаться с рантаймом через NVRAM переменные. Мне, лично, этот метод кажется костыльным.Есть ещё забавный вариант общаться через Save State (это по сути "карта" со всеми регистрами и их состояниями на момент срабатывания перырвания), кешируя в SMM драйвере
EFI_MM_CPU_PROTOCOL протокол, я читал, что это работает на CSM системах с легаси прерываниями (например, INT15 D042). Я смотрел, как это работает, и работает оно не очень, подозреваю, что из-за эмуляции.Перейдём к ещё одному специфическому методу коммуникации - мы можем регистрировать ACPI таблицы определённого типа (но не сразу, только по прошествию какого-то промежутка времени), выделяя физический буфер с типом
EfiACPIMemoryNVS или EfiACPIReclaimMemory, эти таблицы позже будут опубликованы для ОС. Это требует от нас возможность регистрировать SW SMI хендлеры, которые уже не доступны при эмуляции. Этим методом пользуется TCG драйвер для работы с TPM. Увы, нет возможности это затестить сейчас.По правде говоря, у меня сейчас есть некоторые технические шоколадки, которыми я занимаюсь и я опять же не знаю, сколько на это уйдёт времени, но я постараюсь опубликовать это дело в законченном состоянии и оповестить вас, так как не хочу выкидывать на помойку работу, на которую ушло у меня несколько месяцев (могу выкинуть только себя).
Спасибо моим нескольким друзьям, которым я иногда ною по всему этому поводу и они это терпят.
Stay safe.
Please open Telegram to view this post
VIEW IN TELEGRAM
💅11
Violent_Maid
https://github.com/0x00Alchemist/Deadwing
Привет!
Я наконец-то доделал, что хотел. Это заняло неприлично много времени у меня, но что поделать. Я планирую пополнять эту штуку функционалом время от времени, как мне будет что-то приходить в голову интересное.
Насчёт чего-то дальнейшего: у меня есть идеи немного посидеть над ACPI и прочим Power Management stuff, но я пока говорить ничего не буду.
Stay safe!
Я наконец-то доделал, что хотел. Это заняло неприлично много времени у меня, но что поделать. Я планирую пополнять эту штуку функционалом время от времени, как мне будет что-то приходить в голову интересное.
Насчёт чего-то дальнейшего: у меня есть идеи немного посидеть над ACPI и прочим Power Management stuff, но я пока говорить ничего не буду.
Stay safe!
🤓1
Даров! 😳
На днях выловил одну замечательную штуку — DXE драйвер, что регистрирует протокол для обновления прошивки Intel ME. Мне понравилась эта находка, но пока что исключительно в статике.
К сожалению, на данный момент не выловил прямое его использование, хотя желание есть найти хотя бы в статике (это в динамике оч больно тыкать😁 ). Но, предполагаю, что использование протокола происходит в следующем порядке: получаем ревизию (ищем HOB с пейлоудом ME) => сравниваем ревизии => тыкаемся в PCI для записи апдейта => сигнализируем об апдейте платформу => отваливаемся перезагружаемся 😁 😁 😁 😂 😂 😂 . Всё просто и понятно, в принципе.
Под капотом помимо стандартного PCI протокола используется несколько других (скрин 2), идентифицировал я только один: HECI, это сугубо интеловский драйвер для работы и общения с периферией. Посмотреть на него можно тута. Оставшиеся протоколы — это
Гораздо интереснее дела обстоят с ревизиями😁 . Intel пошли по правильному пути, у них для пейлоудов есть HOB'ы, которые можно найти самостоятельно по GUID 🅰️ , но из локбокса можно вытащить, просто это больше кода).
Собсна, достучаться и побаловаться с самим протоколом можно через GUID😂 . У нас также по идее должен лежать PEIM, который, скорее всего, будет работать также, как и с обычными капсульными обновами, только для ME.
Я в комментах оставлю парочку хидеров, где описан формат HOB'ов (честно выдрал из Kabylake) и хидер с форматом протокола обновления😏 (там есть ещё парочка структур, которых нет в других хидерах), если кому-то интересно сделать что-то самопальное или выдрать что-нибудь 😏 😏 😏 . А я пока в спячку.
На днях выловил одну замечательную штуку — DXE драйвер, что регистрирует протокол для обновления прошивки Intel ME. Мне понравилась эта находка, но пока что исключительно в статике.
К сожалению, на данный момент не выловил прямое его использование, хотя желание есть найти хотя бы в статике (это в динамике оч больно тыкать
Под капотом помимо стандартного PCI протокола используется несколько других (скрин 2), идентифицировал я только один: HECI, это сугубо интеловский драйвер для работы и общения с периферией. Посмотреть на него можно тута. Оставшиеся протоколы — это
WDT_PROTOCOL (судя по всему это Watchdog, но вроде бы у EDK2 был свой протокол для этого) и PLATFORM_SEC_HOOK. Они используются единожды, но инфы как-то о них и нет.Гораздо интереснее дела обстоят с ревизиями
992C52C8-BC01-4ECD-20BF-F957160E9EF7. Формат такой же, как и везде: есть хидер HOB'а, его "имя" (GUID по которому его можно идентифицировать) и остальная инфа (собственно, пейлоуд в нашем случае). Формат у пейлоуда весьма большой (скрин 3), и, если попытаться, его можно даже достать и сдампить себе (Почему попытаться? Потому что я не уверен, лежит ли оно в локбоксе или нет Собсна, достучаться и побаловаться с самим протоколом можно через GUID
DCA334AB-56E3-4EDE-B9B3-8EAE2ACF5E78, драйвер у нас DXE, так что играться будет проще Я в комментах оставлю парочку хидеров, где описан формат HOB'ов (честно выдрал из Kabylake) и хидер с форматом протокола обновления
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🤮5💅4💊2
Please open Telegram to view this post
VIEW IN TELEGRAM
💅21
Violent_Maid
Даров! 😳 На днях выловил одну замечательную штуку — DXE драйвер, что регистрирует протокол для обновления прошивки Intel ME. Мне понравилась эта находка, но пока что исключительно в статике. К сожалению, на данный момент не выловил прямое его использование…
А теперь поговорим о PEIM для обновления Intel ME 😌 . Мы немного перешли вниз по чейну загрузки: в PEI фазу, где инициализирован минимум и ещё не произведён переход в DXE фазу. Ниже только SEC (я опущу IBG и PSB здесь, это отдельная тема для разговоров)
PEIM обычно сопровождаются регистрацией или нотификацией определённых дескрипторов (структур). Есть два вида: дескрипторы для нотификаторов и для описателей доступных сервисов для PEI Foundation. Наш PEIM только оповещает определённый PPI (PEIM-to-PEIM Interface). Оба этих дескрипторов имеют одинаковый вид, но я приведу только один, нужный нам:
Соответственно, наш PEIM именно что уведомляет платформу о доступном PPI, это видно на первом скрине😏 . Если смотреть на raw вид дескриптора мы имеем следующий вид. Стоит отметить, что дескриптора тут два, но используется конкретно этим PEIM только один (значит, есть в чейне ещё один промежуточный драйвер 😶 ). Они имеют одинаковые флаги:
Перейдём к коллбекам😁 . Коллбек, который уведомляет наш PEIM по сути просто получает режим загрузки платформы (скрин 3). Этот коллбек служит для верификации режима загрузки (например, чтоб мы случайно не обновились в S3 или S4 😁 ) уже другими PEIM. Не забываем про второй коллбек, он выглядит намного интереснее (скрин 4) 😏 . В первую очередь он получает список всех доступных HOB (Hand-off Block) в платформе на текущий момент, затем, из текущего HOB извлекает структуру, описывающую доступные разделы в прошивке (это, по идее, 😶 ). Когда структура получена, функция начинает искать определённый раздел с GUID 😶 . Я не уверен, что этот GUID одинаков в каждой прошивке, но он действительно существует и имеет в себе несколько полей (скрины 5 и 6). После того, как проверка завершилась, платформа обращается к неизвестному мне регистру 😳 .
Упомяну ещё один неиспользуемый функционал нашего PEIM. Эта штука умеет выходить в длинный режим (скрин 7)😏 😏 😏 . Она изменяет DTB на какой-то свой, полученный извне, модифицирует CR4 регистр. Что интересно, обычно достаточно только 😯 . Для справки: выход в длинный режим платформой используется только в трёх случаях (минимум): передача управления DXE Core, выход из S3 и работа с капсульными обновлениями. Мы относимся к последнему!
DXE драйвер, который мы вытащили ранее можно найти по GUID😏 😏 😏
PEIM обычно сопровождаются регистрацией или нотификацией определённых дескрипторов (структур). Есть два вида: дескрипторы для нотификаторов и для описателей доступных сервисов для PEI Foundation. Наш PEIM только оповещает определённый PPI (PEIM-to-PEIM Interface). Оба этих дескрипторов имеют одинаковый вид, но я приведу только один, нужный нам:
struct _EFI_PEI_NOTIFY_DESCRIPTOR {
UINTN Flags;
EFI_GUID *Guid;
EFI_PEIM_NOTIFY_ENTRY_POINT Notify;
};Соответственно, наш PEIM именно что уведомляет платформу о доступном PPI, это видно на первом скрине
80000020 — в нашем случае это означает, что мы смотрим на коллбеки.Перейдём к коллбекам
EFI_FIRMWARE_VOLUME_HEADER, если текущий HOB ею является 9F8B1DEF-B62B-45F3-8282-BFD7EA19801B (вы можете похлопать гениальности иды, которая очень плохо жрёт терсы (TE Image)), предварительно валидировав сигнатуру _FVH. Судя по всему, тот раздел используется платформой для содержания образа ME для обновления, наверное 0x1800 и 0x1804, а затем пытается ресетнуть платформу через RST_CNT регистр. Сначала ресетает процессор, а затем ресетает что-то неизвестное никому (биты с 4 по 6 зарезервированы, судя по документации) Упомяну ещё один неиспользуемый функционал нашего PEIM. Эта штука умеет выходить в длинный режим (скрин 7)
PAE бита, однако, конкретно здесь присутствуют ещё биты для SSE — весьма нестандартно и непонятно зачем. Очевидно, что она ещё сетает бит LME в MSR_EFER и PG бит в CR0, сетапит новый стек и вызывает нужную функцию с новым стеком DXE драйвер, который мы вытащили ранее можно найти по GUID
A11585B7-8FA2-4F1C-AA6F-DD6309469613. PEIM можно найти по GUID FD27652D-F758-4EFC-B1A9-283EFE51F4E9. Дерзайте Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
💅6🤡2