Воробьёвы

(-:

ПОУЧИТЕЛЬНАЯ ИСТОРИЯ ИЛИ LAMERS MUST DIE (ЭТО SERRGIO ПРО СЕБЯ)

Позавчера злые черти из Минского клуба хакеров сломали мою Аську :(

Черт, слышал же я о всякой такой ерунде, типа: "не использовать один и тот же пароль в разных местах", "не подключаться к неавторизированным сервисам", "белое не надевать, обтягивающее не носить, не танцевать"...

Дурак, я, в общем, был. У меня один пароль - почти везде: и на вход в винду, и на сквид нашего сервера, и на почтовый ящик, и на аккаунты баннерообменных сетей... ну... и на ICQ в том числе... (теперь-то я везде разный и очень длинный поставил - одним параноиком больше в инете стало).

Чесна говоря - на так называемую "социальную инженерию" взяли, редиски. Пишет, понимаешь-ли, "я тебе грил, я сервак аськин сделал :))". А у нас, надо сказать, тож задумка такая была, только вот руки никак не доходили... Я и клюнул: "не-а!! не говорил!!! мы тож давно хотим подобное сделать, но вот все никак руки не доходят!! давай адрэсу и порт, обновим :))".

Называется, сам нарвался. Подозрения возникли, когда аська предупредила, что этот сервер не является авторизированным, но я подумал, что так и должно быть и смело нажал на кнопку "пофиг".

Через некоторое время по той-же аське мне прислали пароль с комментарием "смени нахрен пароль и больше не ламерствуй : ()".

В принципе что?? Они не злобными оказались. Западла никакого не сделали и мой пароль на аське - все тот же :)). А вот на то, чтобы поменять пароли на остальных многочисленных аккаунтах, вся ночь ушла...

Так вот: "смените нахрен пароль и больше не ламерствуйте" (© Faraon)

А сегодня мы поговорим о прерываниях... Поехали!!

ПЕРВОЕ ПОГРУЖЕНИЕ В ПРЕРЫВАНИЯ

[1] Как известно (об этом нам ежедневно напоминали в средней школе) повторение - мать учения... Вот и мы немножко повторимся...

Итак, предположим, что на вашем компьютере установлена операционная система MS-DOS и загружен Volcov Commander.

Все что делает VC - это "переводит" понятные и визуально отображаемые действия на командный язык DOS и передает их командному интерпретатору. Это самый высокий уровень.

Уровень ниже: на основе введенных команд DOS формирует последовательность выполнения зашитых в него подпрограмм "обработки" этих команд.

Уровень еще ниже: "программа обработки команд MS-DOS" обращается к "наиболее универсальным подпрограммам, прошитым в BIOSе".

Уровень самый низкий: сами подпрограммки, прошитые в BIOSе...

... долго и упорно медитируем ...

[2] Теперь вернемся к нашим "баранам".

Прерывание - это: своеобразный "сигнал" процессору, что устройство либо выполняемая программа НУЖДАЮТСЯ в "низкоуровневых подпрограммах", вшитых в BIOS/расширение BIOSа/ядро операционной системы.

Когда же и "кем" генерируются эти "сигналы"? (в смысле "прерывания").

1. Многочисленными "схемами" компьютера, его устройствами. Например, соответствующее прерывание генерится при нажатии клавиши на клавиатуре.

2. Прерывания генерятся как "побочный продукт" при некоторых "необычных" ситуациях (например, при делении на букву 0), из которых компьютеру хочешь не хочешь, но приходится как-то выкручиваться...

3. Прерывания, которые "преднамеренно" генеририруются программой для того, чтобы произвести то или иное "низкоуровневое" действо...

Далее: когда процессор получает "сигнал" прерывания, он в большинстве случаев (для DOSа, который мы сейчас "колупаем" сказано) останавливает работу приложения и активизирует так называемую "программу обработки прерывания", соответствующуюю данному "номеру прерывания". После того, как "программа обработки прерывания" свое отработает, снова продолжает выполняться ваша программа...

[3] Естественно, программы обработки прерывания (так как из BIOSа они подгружаются в RAM) имеют свой АДРЕС. Однако генератору прерывания этот адрес знать не обязательно :). Есть такая замечательная штука (спросите у тех, кто пишут вирусы) - таблица векторов прерываний. Это таблица соответствия номеров сгенерированных прерываний и адресов, по которым находятся программы их обработки.

Почему "спросите у вирмейкеров?". А потому, что поменять адрес "программы обработки прерывания" на другой - проще вареной репы (мы этим еще займемся) в результате чего при запуске классической программы "HELLO, WORLD" может получиться еще более классический format c:...

Программы обработки прерывания автоматически сохраняют значение текущего сегмента кода (то, что в регистре CS) и указателя команды (то, что в регистре IP) - дабы по завершении "обработки прерывания" снова к нашей безумной радости снова возвратиться к выполняемой программе (просто программе)...

Однако на самом деле все намного сложнее :)). Но ведь это только "первое погружение" в прерывания, верно? А по сему - пока что без особых "наворотов"...

[4] Одно прерывание мы с вами уже знаем :). Это 20-е прерывание, обеспечившее нам выход из нашей COM-программы. Сегодня мы пойдем немножко дальше - помимо "выхода", попробуем поработать еще с одним прерыванием :)).

Итак, я достаю свой толстый талмуд с описанием прерываний и выбираю, каким бы это прерыванием вас занять на ближайшие 1/2 часа ;)...

Ну, например, вот симпатичное:

"Прокрутить вверх активную страницу" - так оно называется :))

Внимательно читаем описание (и мои к нему комментарии):

INT 10h, AH=06h (1) - прокручивает вверх произвольное окно на дисплее на указанное количество строк.

ВХОДНЫЕ ПАРАМЕТРЫ: (2)

AH=06h; (3)

AL - число строк прокрутки (0-25) (AL=0 означает гашение всего окна); (4)

BH - атрибут, использованный в пустых строках (00h-FFh); (5)

CH - строка прокрутки - верхний левый угол; (6)

CL - столбец прокрутки - верхний левый угол;

DH - строка прокрутки - нижний правый угол;

DL - столбец прокрутки - нижний правый угол;

Далее моей книжке входные параметры представлены в виде таблички: (7) Плюс подробнейшее толкование, что подразумевается под словом "атрибут" (регистр BH):

AH06hALЧисло строк
BHАтрибутBLНе имеет значения
CHСтрока (верх)CLСтолбец (верх)
DHСтрока (низ)DLСтолбец (низ)

  Плюс подробнейшее толкование, что подразумевается под словом "атрибут" (регистр BH):

               | 0000 черный           |
               | 0001 синий            |
               | 0010 зеленый          |
               | 0011 голубой          |  Цвет фона
               | 0100 красный          |(разряды 654)
               | 0101 пурпурный        |
 Цвет символа  | 0110 коричневый       |
(разряды 3210) | 0111 белый            |
               |
               | 1000 серый            |                 
               | 1001 светло-синий     |
               | 1010 светло-зеленый   | Повышенная 
               | 1011 светло-голубой   |  яркость   
               | 1100 светло-красный   | (разряд 3)
               | 1101 светло-пурпурный | 
               | 1110 желтый           | 
               | 1111 яркий белый      |
 Мерцание 
(разряд 7)

ВЫХОДНЫЕ ПАРАМЕТРЫ: отсутствуют. (8)

Входные строки гасятся в нижней части окна. (9)

Нормальное значение байта атрибута - 07h. (10)

Не так давно, если бы вам показали подобное "описание", вы бы нихрена в нем не поняли и ужаснулись. Теперь же, после прочтения предыдущих выпусков рассылки, в эти "таблицы" вы более-менее, но "въехать" должны! Просто-напросто обязаны "въехать"!!

Тем более, что сейчас я сделаю комментарии для... хм... для "отстающих учеников":

(1) Черным по белому в моем толстом талмуде написано: "Драйвер видео вызывается по команде INT 10h и выполняет все функции, относящиеся к управлению дисплеем".

И далее... "ДЕЙСТВИЕ: после входа управление передается одной из 18 программ в соответствии с кодом функции в регистре AH. При использовании запрещенного кода функции управление возвращается вызывающей программе.

НАЗНАЧЕНИЕ: прикладная программа может использовать INT 10h для прямого выполнения функций видео..."

Что из этого следует?

1. А то, что выполнив команду INT 10h, мы ВЫПОЛНЯЕМ одну из "функций видео"

2. Так как функций видео - много, необходимо УКАЗАТЬ, КАКУЮ именно ФУНКЦИЮ из МНОЖЕСТВА мы хотим ВЫПОЛНИТЬ.

Дело в том, что "прерывание номер десять" - это не только "прокрутка окна", но и, например, "установка режима видео", "установка типа курсора", "установка политры" и многое другое. Нас же интересует именно первое, поэтому из списка возможных значений (он приведен ниже) мы выбираем именно AH=06h.

Функции, реализуемые драйвером видео:

   AH=00h - установить режим видео;
   AH=01h - установить тип курсора;
   AH=02h - установить позицию курсора;
   AH=03h - прочитать позицию курсора;
   AH=04h - прочитать позицию светового пера;
   AH=05h - выбрать активную страницу дисплея;
   AH=06h - прокрутить вверх активную страницу;
   AH=07h - прокрутить вниз активную страницу;
   AH=08h - прочитать атрибут/символ;
   AH=09h - записать символ/атрибут;
   AH=0Ah - записать только символ;
   AH=0Bh - установить палитру;
   AH=0Ch - записать точку;
   AH=0Dh - прочитать точку;
   AH=0Eh - записать TTY;
   AH=0Fh - прочитать текущее состояние видео;
   AH=13h - записать строку;
 

Соответственно, если перед выполнением INT 10 в регистре AH будет значение 06h, то выполнится именно "прокрутить вверх активную страницу", а ни что-то другое из "простыни" функций десятого прерывания...

(2) Входные параметры?? Что тут может быть непонятного?? Даже запуск ракеты с атомной боеголовкой требует прежде всего указать координаты цели... Чего уж тут говорить об обыкновенной функции??

(3) То, о чем мы уже говорили - номер функции из "простыни"...

(4) Т. е. на СКОЛЬКО строчек прокручивать. Вспомните так назваемый "скроллинг" в любой прикладной программе. На кнопки up, down - подвешен скроллинг на одну строчку (не путать с координатами курсора), а вот на PgUp и PgDown - штук на 18 строк (AL=01h и AL=12h соответственно)... А вот AL=0 вместо того, чтобы вообще не скроллировать (по идее), поступает наоборот - "скроллирует" все, что может, к чертям собачьим...

(5) Ну... скажем так: какого цвета будет окно и символы в нем после скроллирования...

(6) Как известно из школьного курса геометрии, четырехугольник можно построить по двум координатам. Это утверждение справедливо и для окна, в котором мы желаем проскроллировать наш текст.

(7) Резюме того, что было написано выше.

(8) Ну например: попала ли наша ракета в цель или нет...

(9) Если бы использовали функцию 07h, то было бы глубокомысленно написано, что "строки гасятся в верхней части окна"...

(10) Это то самое, которое в DOSе по умолчанию. Белыми буквами по черному фону то есть. Правда, это 07h лучше все же рассматривать как 0000111b :) но это уже совсем другая проблема...

[5] Теперь пишем прогу:

В смыле запускаем наш любимый debug.exe, вводим команду "а" и судорожно стучим по клаве:

     -a 
     119A:0100 xor al,al      ;гашение всего окна
     119A:0102 mov bh,70   ; белое окно
     119A:0104 mov ch,10   ;четыре координаты прямоугольника
     119A:0106 mov cl,10 
     119A:0108 mov dh,20 
     119A:010A mov dl,20 
     119A:010C mov ah,06  ;функция такая-то прерывания
     119A:010E int 10        ;Go!!
     119A:0110 int 20         ; Выход...
     119A:0112 
     -r cx                        ; в CX- сколько байт программы писать 112h-100h=12h
     CX 0000 
     :12 
     -n @int10.com 
     -w 
     Запись: 00012 байт 

Сначала запускаем из-под Volcov Commander.

Затем запускаем из-под DEBUG-а.

Трассируем.

Открываем в Hex Workshop'е.

Смотрим на "бессмыслицу" шестнадцатеричных циферек...

Экспериментируем.

Медитируем...

Дзенствуем...

Дзенствуем...

Еще раз дзенствуем...

И еще раз дзенствуем...

Все... я устал... продолжение через неделю...

НОВЕНЬКИМ: ИЩИТЕ В АРХИВАХ:

Выпуск 2 - про систему счисления.

Выпуск 3 - про порядок загрузки компьютера.

Выпуск 4 - про регистры.

Выпуск 5 - про программу в памяти.

АНОНС СЛЕДУЮЩЕГО ВЫПУСКА

В следующий раз мы продолжим программировать + познакомимся с некоторыми весьма полезными приемами отладки...

Уф...