[Back to EXEC SWAG index] [Back to Main SWAG index] [Original]

    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.

[Back to EXEC SWAG index] [Back to Main SWAG index] [Original]