Как защитить программу от трассировки?
Защита программ - это отдельная и довольно обширная тема: можно применять шифрование кода, аппаратные методы защиты и тому подобное.
Для небольших программ можно применить следующий метод - перехватить прерывания Int 03h - Step by step tracer и Int 01h - Wait a next step (они используются отладчиками) и создать свой обработчик для них. Тогда при загрузке программы в отладчик можно вполне заблокировать возможность трассировки.
Ниже приведен пример кода, который работает в BP 7.0 под RM, под другими платформами не тестировался. При отладке, не забывайте, что 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;