Contributor: BRAD ZAVITSKY

Here is an anti-debugging unit I created.  Use AntiOn at the start of
whatever has to be hidden (Password/Key gen) and AntiOff at the end.

Actions:
1) Disable Keyboard
2) Change interrupts 1&3 {Trace and Breakpoint}
3) Loop until system time changes. {This will mess up Turbo Debugger}

Note:
Interrupts are accessed directly instead of through DOS function 25h,
this will prevent a debugger that takes over all the interrupts from
disabling from still being able to trace/add breakpoints.

Right now, intxx is set to INT$20 (Halt program) which will crash the
debugger.  Set it's offset to $10 (INT$04) to just ignore the commands.


{$A+,B-,D-,F-,G-,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X-}

unit AntiDbug;

interface

{Enable anti-debugging technique's, Keyboard will no longer work}
procedure AntiOn;
{Disable anti-debugging technique's}
procedure AntiOff;
{Halts some debuggers (Turbo Debugger), called at unit init;
 Can be called freely}
procedure HaltDebug;

implementation

var
  {Direct interrupt access}
  Int01: Pointer absolute $0:$004;
  Int03: Pointer absolute $0:$00C;
  IntXX: Pointer absolute $0:$080; {New interrupt, 04=$10, 20=$80}


  {Saved interrupts}
  SaveInt01,
  SaveInt03: Pointer;

procedure Cli; inline($FA); {Clear interrupts}
procedure Sti; inline($FB); {Store interrupts?}

procedure HaltDebug; assembler;
asm
  {Wait until clock timer changes}
  push ds
  xor ax, ax
  mov ds, ax
  mov ah, [046Ch]
@@TimerWait:
  mov al, [046Ch]
  cmp al, ah
  je @@TimerWait
  pop ds
end;

procedure AntiOn;
begin
  Port[$21] := Port[$21] or $02;
  {Disable interrupts}
  Cli;
  Int03 := IntXX;
  Int01 := IntXX;
  Sti;
end;

procedure AntiOff;
begin
  Port[$21] := Port[$21] and $fd;
  {Enable interrupts}
  Cli;
  Int01 := SaveInt01;
  Int03 := SaveInt03;
  Sti;
end;

begin
  {Try to mess up debuggers}
  HaltDebug;
  {Save interrutps}
  SaveInt01 := Int01;
  SaveInt03 := Int03;
end.