Как защитить программу от трассировки?

Защита программ - это отдельная и довольно обширная тема: можно применять шифрование кода, аппаратные методы защиты и тому подобное.

Для небольших программ можно применить следующий метод - перехватить прерывания 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;