"Noo, Dos cracking is not dead, Dos is still VERY important for reverse engineering purposes, Windows is more "transient" than DOS, you are well advised to learn dos cracking -and tsrring- techniques, study dos and dos protections every time you get a chance to find one, fish Softice DOS lastversion 92 out of the web... etcetera."
As the name says, DOS Navigator v1.5 (available at http://www.ritlabs.com/dn/
from the authors of THE_BAT!, an e-mail program with a nice protection
that may drive crazy some newbyes...) is a DOS file manager.
It can handle any kind of file manipulation, viewing,
edition, drag & drop, as well as a disk editor and even 2 versions
of the famous Tetris. It doesn't support Windows95 long filenames (I really
couldn't care less about that because I don't like long filenames and I'm
still using the 16 bits Winfile.exe -: ).
It's a useful tool, specially when you get stuck at the
DOS prompt because Win95 doesn't want to load...
It is shareware and has a nagscreen reminding it to you
each time you run it.
Right after installing it, here is the listing of the files in its directory:
   DN.COM     1 778  <= "Launcher"
   DN.OVR   762 170
   DN.PRG   132 720  <= .Exe file packed
with PKLITE
   DN.LNG    17 952
   DN.DLG    57 031
 
 We can see that DN.COM is 1.7Kb and could only
be a "launcher" (the file is full of "jmp xxxx:xxxx" ). Due to its extension,
DN.PRG seems to be the main program. After opening it with an hexeditor,
we can see it is an EXE file and that it has been packed with PKLITE.
The programmers did a little mistake here, because PKLITE
has an option to make compressed file unextractable but they didn't use
it (or may those naughty guys from Ritlabs don't have a Registered version
of the famous PKWARE soft! -: ). Anyway, we will not unpack it, it is not
the purpose of this essay.
 
As  there's a nagscreen but no registration dialog
box, I just assume that the program is looking for a .reg or .key file.
So let's see:
Load DN.COM with SoftICE (with any version of S-ICE Symbol
Loader for DOS - I am using here DLDR.EXE v3.1from S-ICE DOS v2.95 ) and
BPINT on Int21h function 3Dh (open existing file, ds:dx=ASCIZ filename
- Return AX=file handle or error code):
BPINT 21 IF ah==3d do "d ds:dx"
At the 12th break you can see in the data window that
Dos Navigator is looking for DN.KEY. Of course it will return a #2 error
code (file not found) as this is the registration key file and it is not
included in the shareware package.
I simply copy a file in its directory, rename in DN.KEY,
and using the same BPINT, run the program again.
When the break occures, I put a conditional BPINT Int21h/AH=3Fh
(read from file):
BPINT 21 IF ah==3f && bx==?? (put DN.KEY handle returned in Eax during last open_existing_file)
At this point, I was about trying to decrypt the registration procedure. I still had SoftICE Data window pointing to DS:DX and then, about one minute later, I saw the following message in this memory area:
HI, Hacker Nice To See You Here!
I was just wondering if there was any Anti-Cracker/Debugger trick that was about to crash my PC. I noted the Offset location and decided to go ahead to verify this. So, "F12" and I got there at offset xxxx:1ADB (in DN.PRG):
1AC5    push   
bp
1AC6    mov    
bp,sp
1AC8    cmp    
byte ptr [1E8A],00 ; Any_Cracker_Around ?
1ACD    jz     
1AD1              
; 1) Yes, send him the message
1ACF    jmp    
1AF7              
; 2) No Cracker there, go ahead
1AD1    les    
di, [bp+06]
1AD4    push   
es
1AD5    push   
di
1AD6    call   
xxxx:0020          ;
"Hi Hacker..."
1ADB    les    
di, [bp+06]
...
1AF7    leave
1AF8    retf   
0004              
; Back to caller
Pressing "F12" again we land here:
18A1    call   
xxxx:0057          ;
Any_Cracker_Around routine we come from
18A6    push   
0100
18A9    push   
9DD1              
; "key"
18AC    push   
00
18AE    push   
00
18B0    call   
xxxx:19A0          ;
Check if registered
18B5    or     
ax,dx             
; Is it?
18B7    jnz    
18C8              
; Good_Guy jump
...
18C3    call   
xxxx:0034          ;
NagScreen
18C8    mov    
di,9BBA           
; Go_Ahead
Obviously, patching the JNZ at offset 18B7 would get rid of the nagscreen.
The crack is done, but what about
our "Any_cracker_Around" routine?
The message doesn't appear on the
program screen, only in the memory area where ds:dx pointed. It didn't
crash nor it affected the program.
Let's find out how Dos Navigator
check if we are debugging it (or if SoftICE is loaded).
Fisrt I checked the usual DOS tricks
to detect SoftICE (i.e. Int 2Fh/ax=1684h/ bx=0202h/ di=0/es=di...) then
stupid anti-debugging tricks (Int 01h, Int 03h) but didn't find anything.
Then, as I knew that the program
used a "cmp byte ptr [1E8A],00" to check if we are debugging it, I though
the best would be to write a TSR that would check [1E8A]. It would work
like this:
1)-Grab an interrupt as closed as
possible to the "Any_Cracker_Around" routine
2)-Check the flag at [1E8A]:
   a)-If "0" ( cracker
detected) then do nothing, restore the interrupt and go ahead
(nagscreen..)
   b)-If "1" (no debugging)
then get rid of the NagScreen and
go ahead
3)-Restore original Interrupt used
by Dos Navigator.
We must grab an Int as closed as
possible to the routine because during its execution, the program jumps/jumps
back from DN.COM to DN.PRG. The routine is only loaded at the latest moment.
As this happens during the program initialization, intercepting Int 10h
should be fine.
I found a good one:
Int 10h / AX=03h (get cursor position
and size). The routine to check is loaded right before the call to this
Int (but is located far from it).
And now, the TSR:
 
;***********************;
;  Check_DN.asm        
;
;                      
;
;***********************;
 
 code         
segment
             
org      100h
             
assume   cs:code
start: jmp Install
int10         label   
dword                      
; Save old Int10
int10off      dw 0                                
; address
int10seg      dw 0                                
;
NewInt10      proc    
far                        
; Our new Int10.
             
pushf                               
; Save flags.
             
cmp      ax,0300h                   
; Chech if it is
             
jne      Exit                       
; the right one
             
cmp      cx,0020h                   
; otherwise
             
jne      Exit                       
; exit.
Check_Flag:   push     ax                         
; Save ax,
             
push     bp                         
; and bp.
             
mov      bp,sp                      
; sp=>bp.
             
mov      ax,[bp+8]                  
; Get previous segment in DN.EXE.
             
add      ax,2F0Fh                   
; +2F0Fh to get segment to check.
             
push     es                         
; Save es
             
push     di                         
; and di.
             
push     ax                         
; Push ax
             
pop      es                         
; Pop it back into es.
             
mov      di,1E8Ah                   
; Get offset to check.
             
cmp      byte ptr es:[di],0         
; Check our AntiCracker_Flag.
             
je       Bad_Guy                    
; If 0 (Bad_guy), then jump...
Patch_Nag:    sub     
ax,309Fh                   
; -309Fh to get segment to patch.
             
push     ax                         
; Save it.
             
pop      es                         
; Pop it back into es.
             
mov      di,18B7h                   
; Offset to patch.
             
mov      byte ptr es:[di],74h       
; Get rid of the NagScreen.
Bad_Guy:      pop     
di                         
; Restore di,
             
pop      es                         
; es,
             
pop      bp                         
; bp,
             
pop      ax                         
; ax
Exit:         popf                                !
;
; and flags
             
jmp      dword ptr cs:[Int10]       
; Execute Int 10h.
NewInt10      endp
Install:      mov     
ax,3510h                   
; Get interrupt vector.
             
int      21h                        
;
             
mov      Int10off,bx                
; ES:BX = value of interrupt vector
             
mov      Int10seg,es                
;
             
mov      ax,2510h                   
;
             
mov      dx,offset NewInt10         
; New vector to be used for Int 10h
             
int      21h                        
; ...
             
mov      dx,Install-Start+100h+15   
; DX= Program size.
             
mov      cl,4                       
; Divide by 4 to get
             
shr      dx,cl                      
; size in paragraphs.
             
mov      al,0                       
; Exit code.
             
mov      ah,31h                     
;
             
int      21h                        
; Terminate and stay resident.
code          ends
             
end      Start
;**********************;
;  TLINK Check_DN     
;
;  TASM Check_DN /t   
;
;**********************;
 
Now, under DOS run CHECK_DN.COM and then DN.COM and...the
Nagscreen is still present!
Re-boot, don't load SoftICE and try again: the NagScreen
pops again!!
CONCLUSION:
The program doesn't check (and doesn't care) if you are
debugging it or not,  the flag at [1E8A] is
always equal to "0" (Bad_Guy) and will always display the "Hi, Hacker..."
message in memory... conclusions? Draw your own conclusions!
 
Frog's Print - December 1997 - (c) Frog's Print All rights reversed