Добрый день форумчанам. Интересует возможность исполнять код в обработчике SMI. Т.к. домашняя машинка на AMD, работаем по амдшным спекам. Code (C++): UINT64 SmmBase = ReadMsr(SMBASE_MSR); // Получили 0xA0000 constexpr int SMM_SIZE = 65536; BYTE Buffer[SMM_SIZE] = {}; ReadPhysicalMemory(SmmBase, Buffer, SMM_SIZE); // Прочитали память по физ. адресу 0xA0000 По смещению 0x8000, судя по докам, должен быть "SMM Handler", и действительно, по этому смещению начинаются некие данные, но это совсем не 16-битный код, как ожидал. Дамп: Что это такое?
видимо база кривая, т.к. A0000h это видеобуфер. попробуй подставить интеловскую базу: 30000h. судя по докам, у них смещение 8000h такое-же, может и база совпадает. и у каждого из процессоров своя база. Вот из третьего тома Intel:
Попробовал, буфер полностью забит нулями. Вряд ли это проблема с базой, ведь SMBASE, прочитанный через MSR, не может быть неверным. И сам факт, что в полученном дампе какие-то данные начинаются именно со смещения 0х8000, уже о чём-то говорит. На разных ресурсах пишут, что память защищена от записи (как и варианты обхода этой защиты через кэш). Может ли быть, что она защищена и от чтения? --- Сообщение объединено, Dec 28, 2018 --- Upd: действительно, видеопамять. Записал туда 64 килобайта нулей, получилось это: Тогда закономерный вопрос - а что же тогда за адрес в SMBASE, который читаем напрямую из MSR, и почему именно по смещению 0х8000 в этом блоке начинаются какие-то осмысленные данные (именно по этому смещению должен лежать настоящий SmmHandler)
с рождения ibm, сегмент A000:0000h принадлежит видеобиосу. если вы читаете MSR из доса, то дос может легко SMM заточить под себя. во-всех регистрах, где есть приставка BASE, младший бит является битом достоверности адреса - он должен быть взведён (если адрес "правильный"), т.е. в вашем случае адрес должен быть A0001h, и младшую единицу вы должны сбрасывать сами. могу посоветовать утилиту 'PCIScope' с прицепом 'Read&Write' - первая сканит шину PCI, а вторая кажет из винды все физ.адреса - есть возможность сравнить выхлоп проги с реальными значениями в памяти. но в любом случае база SMM A0000h кривая - если не ошибаюсь, то SMM контроллёр тоже висит на шине pci, и её можно проверить утилитой PCIscope.
попалась статья на хакере "128Кб потусторонней памяти" оказывается фишка там есть.. часть(1): https://xakep.ru/2008/07/29/44663/ часть(2): https://xakep.ru/2008/08/05/44759/ в обычном режиме A0000h как-и-положено - это видеобуфер, а при переходе в режим SMM, этот-же адрес используется как SMRAM. во второй части есть описание PCI-регистра управления доступом к SMRAM, который на моём интеле правильно отображает софтина "PCIScope". так-что A0000h это не ошибка - сорян..
Коцит, спасибо за инфу. Пока другие задачки, к SMM вернусь чуть попозже, о результатах потом отпишусь
В копилку. Гугл по запросу force SMI by writing to port 0xb2 дает много информации, например https://habr.com/ru/company/dsec/blog/481692/