From: "Constantin Poddubny" <const@const.krasnoyarsk.su>
Subject: Re: Как удалить свой резидент ?
Organization: The Sosnovoborsk Municipal Venture for Housing and
Date: Mon, 30 Jan 1995 06:04:47 GMT
Андрей Динарис спрашивал:
> Приветик Всем, кого застал !
>
> Вот такой вопрос чайниковский. Как средствами Паскаля и минимум
> встроенного ассемблера, запустив эту же резидентную программу просто
> второй раз или с ключем, определить, что в памяти уже сидит этот резидент
> и выколупать его оттуда.
> Загоняется то он туда просто, а вот оттуда... ;-/
> Каким образом осуществить намерения Тараса Бульбы ? ;)
>
> Cпасибо.
> Счастливо оставаться !
> Андрей Динарис.
>
Как-то я решил написать собственный TSR-русификатор - уже
существующие мне по той или иной причине не нравились. Отрывки из
этого русификатора, адаптированные к Паскалю я и привожу.
{ функция AnybodyHere возвращает True, если запускаемая резидентная
программа, перехватывающая прерывание Vector, уже есть в памяти. При
этом происходит сравнивание первых Number байт новой запускаемой
программы и старой, уже находящейся в памяти. }
function AnybodyHere( Vector: byte; Number: word ):boolean; assembler;
asm
cld
mov al,Vector
mov ah,35h
int 21h { получить адрес вектора в es:bx }
mov si,bx { ds:si - адрес начала новой подпрограммы }
{ обработки прерывания Vector }
mov di,bx { es:di - адрес начала старой подпрограммы }
{ обработки прерывания вектор }
mov cx,Number { число сравниваемых байт }
xor ax,ax
repe cmpsb { сравнить сигнатуры }
je @1
mov al,False
jmp @2
@1: mov al,True
@2:
end;
Точно не знаю, но, по-моему, именно таким образом происходит
определение наличия резидентного вируса при повторном запуске
зараженной программы дабы вирус не паразитировал на себе.
Эта функция может быть полезна для запрещения повторной загрузки
резидентной программы, а также для выгрузки ее из памяти.
{ процедура Unload восстанавливает адрес программы обработки
прерывания, который был установлен до загрузки новой
|