Q:> Как защитить свою программу от трассировки?
A: Вообще-то защита программ - отдельная и довольно обширная тема.
Можно применять шифрование кода, аппаратные методы защиты и тому подобное.
Для небольших программ можно применить следующий метод -
перехватить прерывания Int 03h - Step by step tracer и Int 01h -
Wait a next step (они используются отладчиками) и создать свой
обработчик для них...
Тогда при загрузке программы в отладчик можно вполне заблокировать
возможность трассировки ;))))
Вот пример кода (100% работает в BP 7.0 под RM,
под другими платформами не тестировался, т.к. нужен был лишь 1 раз ;)))))
Кстати, не забывайте при отладке, что IDE также использует эти
прерывания для трассировки ;))).
Const
OldInt3:pointer=nil; {step by step tracer INT 03h in
MSDOS,PCDOS,DRDOS}
OldInt1:Pointer=nil; {stop (wait a next step) INT 01h in
MSDOS,PCDOS,DRDOS}
TraceFlag:boolean=True; {tracer enabled}
Procedure Int3Reboot; Interrupt;
{процедура перезагрузки ;))) -
новый обработчик прерывания для Int 03h & Int 01h}
var Warm:boolean;
begin
Warm:=true;
Asm
sti
cmp Warm, 0
je @cold
mov AX, 0
jmp @boot
@cold:
mov AX, 1
@boot:
mov DS, AX
mov AX, 1234h
mov [0472h], AX
End;
Inline ($EA/$00/$00/$FF/$FF);
end;
{--------------------------------------------}
Procedure DisableTrace;
{запретить возможность трассировки}
begin
TraceFlag:=false;
GetIntVec($03,OldInt3); {получить адрес прерывания}
GetIntVec($03,OldInt1);
SetIntVec($03,@Int3Reboot); {установить его на свой обработчик}
SetIntVec($03,@Int3Reboot);
end;
{--------------------------------------------}
Procedure EnableTrace;
{разрешить возможность трассировки}
begin
TraceFlag:=true;
SetIntVec($03,OldInt1); {восстановить адрес прерывания}
SetIntVec($03,OldInt3);
end;
WBR, Dmitry Beloshistov AKA [-=BDS=-]
e-mail: torin@kerin.donetsk.ua
|