На языке ассемблера IA-32 можно ли изменить или "загрузить" IDTR, GDTR или LDTR без инструкций LIDT, LGDT и LLDT?
На ассемблере IA-32 можно ли изменять / "загружать" IDTR, GDTR или LDTR без инструкций LIDT, LGDT и LLDT?
Кроме того, есть ли полный список инструкций, которые можно использовать для изменения других регистров? Мне нужно знать, какие инструкции могут быть использованы для модификации CR3, и какие инструкции могут быть использованы для модификации ECX.
Я новичок в сборке IA-32. Я знаю о MOV, ADD, SUB и т. Д., Но это должен быть полный список, и я считаю, что, вероятно, существует множество инструкций, которые потенциально могут быть использованы для изменения этих регистров.
Спасибо!:)
Изменить: причина, по которой я хочу знать, заключается в том, что я рассматриваю вопрос о том, является ли мониторинг трассировки инструкций (с помощью аппаратной отладки) выполненных инструкций возможным способом обнаружения - на внешнем компьютере "мониторинга целостности" - любых вредоносных руткитов, которые изменяют адреса в эти регистры для выполнения так называемой атаки перенаправления трансляции адресов (ATRA). Поэтому я пытаюсь определить, возможно ли определить полный список возможных последовательностей вредоносных команд, изменяющих каждый из этих регистров.
2 ответа
IDTR, GDTR или LDTR могут быть изменены с помощью:
- Инструкции LIDT, LGDT и LLDT
- вход в режим управления системой, изменение значений в области "сохранения состояния", затем выход из режима управления системой для загрузки измененных значений
- с использованием аппаратных расширений виртуализации, где хост может изменять виртуальный IDTR, GDTR или LDTR, используемый гостем
Обратите внимание, что этот список не включает сохранение идентификатора IDTR, GDTR или LDTR и изменение данных, на которые они указывают (IDT, GDT или LDT).
CR3 может быть изменен:
mov cr3
инструкция- аппаратный переключатель задач
- код работает в режиме управления системой
- аппаратные расширения виртуализации (хост изменяет гостя)
ECX может быть изменен:
- несколько сотен разных инструкций (слишком много, чтобы перечислить)
- аппаратный переключатель задач
- код работает в режиме управления системой
- аппаратные расширения виртуализации (хост изменяет гостя)
Обратите внимание, что аппаратное переключение задач почти никогда не используется и больше не поддерживается в длинном режиме; и режим управления системой, как правило, полностью непригоден для программного обеспечения (включая программное обеспечение, работающее с CPL=0), и только для микропрограммного обеспечения системы возможно использовать его.
Относительно IDTR
, GDTR
, а также LDTR
Руководство по системному программированию Intel содержит ответы:
Раздел 2.4.1, "Регистр таблицы глобальных дескрипторов" (GDTR
):
LGDT
а такжеSGDT
Инструкции загрузить и сохранитьGDTR
зарегистрироваться соответственно.
Раздел 2.4.2, "Регистр таблицы локальных дескрипторов" (LDTR
):
LLDT
а такжеSLDT
инструкции загружают и сохраняют часть селектора сегментаLDTR
зарегистрироваться соответственно. Сегмент, который содержитLDT
должен иметь дескриптор сегмента вGDT
, КогдаLLDT
инструкция загружает селектор сегмента вLDTR
: базовый адрес, предел и атрибуты дескриптора изLDT
дескриптор автоматически загружается вLDTR
, Когда происходит переключение задач,LDTR
автоматически загружается с селектором сегмента и дескриптором дляLDT
для новой задачи. СодержаниеLDTR
не сохраняются автоматически до написания новогоLDT
информация в реестр.
Таким образом, есть только две инструкции, используемые для изменения таблицы, но переключение задач в процессоре (хотя он больше не используется ни в одной из основных операционных систем, так что стоит ли вам беспокоиться об этом, зависит от того, что вы на самом деле делаете) вызвать изменение содержимого этого регистра.
Раздел 2.4.3 "IDTR
Регистр таблицы дескрипторов прерываний ":
LIDT
а такжеSIDT
Инструкции загрузить и сохранитьIDTR
зарегистрироваться соответственно.
относительно ECX
Однако однозначного ответа нет. Так как он использовался в качестве регистра "подсчета" во времена реального режима, он мог быть неявно изменен некоторыми инструкциями, связанными с циклом. С верхней части моей головы:
LOOP
(и его производные), который уменьшаетECX
и прыгает, если не ноль. Тем не менее, вы не должны часто видеть эту инструкцию в новом коде, так как в основном это пережиток дней CISC, и поэтому его использование не рекомендуется при создании кода для современных процессоров. Это связано с относительно долгим временем (по сравнению сtest
+ прыжок) требуется, чтобы расшифровать его.REP
(и его производные), который повторяет данную инструкцию до тех пор, покаECX
не ноль.CPUID
, который использует все регистры для возврата идентификационной информации процессора.
Я уверен, что есть еще немного. Я был бы удивлен, если такой список существует, хотя он, конечно, иногда будет полезен.