
Радиоперехват
Xakep, номер #036, стр. 036-052-1
Шпионская запись одной радиопередачи
RainFerocious & Zealot
Звучит Need For Speed: Porsche Unleased - Cold fusion power (soundtrack)
D.J.: Здравствуйте, уважаемые радиослушатели! В эфире передача "LLP", что означает "Low Level Programming". Наш сегодняшний гость - Zeal0t (Громкие нескончаемые аплодисменты под музыку Fluke-Absurd). Hi Zeal0t!!!
Z.: Hi!!!
D.J.: О чем вы нам хотите сегодня рассказать?
Z.: Я хотел бы рассказать о небольшой программке, которая замедляет ход системных часов в Windows.
D.J.: !!????
Z.: Ну, то есть это скорее пример такой программы, которая иллюстрирует, на что способен ассемблер. Это будет полезно как начинающим, так и продвинутым программистам.
D.J.: Ну хорошо, расскажите поподробней, plz.
Z.: Начнем с того, что попытаемся представить, что это вообще такое - замедление или ускорение времени. Представим себе события от мыши. Например, система должна распознавать, когда произошло событие "двойной щелчок", а когда было два последовательных одинарных нажатия. Понятно, что в первом случае интервал между нажатиями был меньше, поэтому системные часы обновлялись чаще, и мы можем различить события.
D.J.: Речь наверно идет о таймере?
Z.: Верно, cистемные часы обновляются с помощью специального устройства - таймера, входящего в состав любой компьютерной системы. Таймер - весьма сложная система, включающая в себя целых три устройства - три канала таймера, каждый из которых может работать в одном из шести режимах.
D.J.: Наверное и управлять им сложно?
Z.: Все в мире относительно. Управление таймером осуществляется путем вывода одного байта в порт 43h. Рассмотрим назначение бит в этом байте.
биты 7-6: если не 11 - номер программируемого канала (мы рассмотрим программирования канала 0)
биты 5-4:
00 - фиксация текущего значения счетчика
01 - чтение/запись только младшего байта
10 - чтение/запись только старшего байта
11 - чтение/запись сначала младшего, а потом старшего байта
биты 3-1: режим работы канала (всего их шесть, но мы рассмотрим только режим 3)
(011) - генератор прямоугольных импульсов, в котором работают по умолчанию каналы 0 и 2 таймера.
бит 0: формат счетчика:
0 - двоичное - шестнадцатибитное число (0000-0FFFFh)
1 - двоичное - десятичное число (000-9999)
D.J.: Мы про DOS или Windows?
Z.: Сначала как было, потом как есть. Итак, в старой доброй системе MS-DOS канал 0 таймера генерил прерывание IRQ0 с частотой приблизительно 18.2 раза в секунду. Для этого необходимо выполнить следующие действия:
1 - в порт 43h таймера нужно послать команду 00110110b, то есть установить режим 3 для канала 0, запись сначала младшего, потом старшего байта и
2 - переслать байт 0FFh в порт 42h (младший байт)
3 - переслать байт 0FFh в порт 42h (старший байт)
D.J.: А!!! Вы инициализируете начальное значение регистра-счетчика?
Z.: Да, и равно оно 0FFFFh. После этого таймер немедленно уменьшает введенное число к нулю со скоростью 1 193 180 раз в секунду. При достижении счетчиком нуля канал 0 таймера вызывает прерывание IRQ0, которое и обновляет системные часы. Отсюда следует очевидный вывод: если мы хотим убыстрить движение времени, то можно задать другое начальное значение, например, 7FFFh и тем самым заставить его генерить IRQ0 чаще...

















































































































