На языке ассемблера 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, который использует все регистры для возврата идентификационной информации процессора.

Я уверен, что есть еще немного. Я был бы удивлен, если такой список существует, хотя он, конечно, иногда будет полезен.

Другие вопросы по тегам