"Игорь Коваль. Как написать вирус" - читать интересную книгу автора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 и 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 ".Работа этих команд особых пояснений не требует .Мы просто " добираемся " до нужной ячейки в стеке, последо- вательно считывая предшествующие .Можно, конечно, |
|
|