2016-11-27 28 views
3

Некоторые джокеры (BIOS/DOS/TSR ...) записывают случайные данные в векторную таблицу прерываний. Я знаю это, потому что разборка мне так сказала.Найдите бесплатный слот прерывания

Обычно, перед захватом вектора прерывания, я проверяю, что выбранный слот IVT пуст. Но со всем этим left-behind-data, как скромное приложение знает, что тем не менее безопасно привязать определенный вектор прерывания?

Хотя ссылка моего программиста описывает DOS функцию 25h SetInterruptVector в

«Безопасно модифицирует вектор прерывания, чтобы указать на указанный обработчик прерываний»

Я не думаю, что это волнует слишком много об этом ранее существовавшем фиктивном контенте. До сих пор для безопасно!


Есть ли какой-нибудь гениальный способ быть абсолютно уверенным в том, что вектор прерывания является бесплатным?

+1

«Безопасное», вероятно, означает убедиться, что никаких прерываний не происходит * в то время как * вектор обновляется. Ответ на остальную часть вопроса почти наверняка: № –

+0

Вы можете использовать мультиплексное прерывание (2Fh) или альтернативное прерывание мультиплексирования (AMIS, 2Dh). Но вы также можете просто выбрать случайное прерывание, которое BIOS и MS-DOS не документируются как используемые. Если вы на самом деле запускаете какие-либо TSR, не сложно определить, используется ли прерывание, которое вы выбрали. Просто перепишите вектор и посмотрите, что-нибудь сломается. –

ответ

5

Нет, нет гениального абсолютно уверенного способа проверить, свободен ли вектор.

Это потому, что каждое возможное значение для прерывания потенциально является допустимым значением.

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

  • 0FFFFh: 0FFFFh может быть действительным (указывая на 0ffefh с A20 маскируется).
  • 0000h: 0000h может быть действительным даже на векторе 0. DWORD нулевого значения нуля декодируется до пары add [bx+si], al, которые действительны.
  • 0b800h: 0000h и другие аналогичные адреса ПЗУ могут быть действительными, поскольку расширительные ПЗУ могут использоваться для переноса кода. Хотя маловероятно, что стандартная видеопамять будет.
  • Адреса в зарезервированных областях BIOS, например (E) BDA, могут быть теоретическими, если данные специально созданы как действительный код и действительная информация.

Конечно, некоторые из приведенных выше примеров очень растянуты и включают в себя данные, выполняемые как код, но основная причина, по которой вам не следует доверять векторным указателям, состоит в том, что BIOS, вероятно, заполняет каждый векторный слот хотя бы фиктивным ISR ,
Это не позволит непреднамеренно плохую инструкцию int повесить систему.


Есть несколько вещей, которые вы могли бы сделать:

  1. Цепной
    Выберите не переполненный номер прерывания N.Подберите набор входных значений I еще не используется (скажем AH = d0-ff). Прикрепите свой ISR к N и обрабатывайте только те значения, которые делегируют другие входы в предыдущий ISR.
  2. Целевая платформа
    Некоторые векторы прерывания, такие как int EA, используются только в определенных системах. Поскольку большинство этих систем ушли, вы можете вернуть их прерывания.
    Если вы украли вектор прерывания, и все работает, и никто не жалуется, то это ваше прерывание. Просто дважды проверьте помещение.
  3. Использование прерывания 2F
    Int 2F и его вариант Alternate Multiplex Interrupt Specification (AMIS) в Int 2D может быть использован в качестве совместно используемого/мультиплексного прерывания.
    AMIS действительно пользовался большой популярностью.

  4. Попробуйте найти пустое место в любом случае
    В качестве первой попытки вы можете попытаться найти нулевые записи в ИВТЕ, хотя действует в теории, они, вероятно, пустые слоты.
    Вы также можете попытаться найти указатель, который присутствует больше одного или двух раз, что указывает на наличие фиктивного ISR (поскольку ISR не может легко идентифицировать его векторный номер).

Я бы поехал с n. 1 лично, если не возможно, я бы выполнил n. 3. Если это невозможно, я бы использовал n.4 с отступлением от n. 2.


Ловля все «подозрительные» значения непрактично и будет дать только небольшой прирост, так что просто снимать для больших.

+0

Вектор 0000: 0000 действительно не может быть действительным. Это не интерпретируется как инструкция. Цепочка не будет работать, если на векторе не установлен уже допустимый обработчик прерываний, поэтому он не устраняет необходимость проверить, есть ли он. –

+0

Я использовал * AMIS * раньше и нашел, что он ввел большие накладные расходы. * Цепочка *, с другой стороны, кажется намного проще. Я исследую это. Поскольку я особенно хочу использовать прерывание B1h по сентиментальным причинам, я думаю, что я остался с более рискованным методом грубой силы, просто воспользовавшись тем, что необходимо. В качестве альтернативы я мог перестать быть сентиментальным! –

+2

Не забывайте, что некоторые векторы прерываний не указывают на код, а на данные. Конечно, их нельзя вызывать с помощью инструкции 'int xx', но BIOS будет полагаться на то, что они указывают на определенные области данных. –