memS equ 1 ;model small convertable to COM model ;**************** RUNTIME LIBRARY OF KILLDIANA.COM ************** include lcmac.mac calln macro name call near ptr name endm callp macro name lea dx,name calln print endm callz macro name push si lea si,name calln printz pop si endm dtas struc resv db 21 dup(?) atr db ? hour dw ? min dw ? lfil dw ? hfil dw ? sname db 14 dup(?) dtas ends dgroup group data,udata,xstack assume ds:data pgroup group prog,tail prog segment byte public 'prog' assume cs:prog org 100h ;FOR MODEL COM start label far cli mov ax,offset pgroup:xtail ;get end of code group add ax,16 ;calculate segment address of ds mov cl,4 ;calculate segment address of ds shr ax,cl ;calculate segment address of ds mov bx,cs ;calculate segment address of ds add ax,bx ;calculate segment address of ds mov ds,ax ;set ds to dgroup mov es,ax ;set es to dgroup mov ss,ax ;set ss to dgroup mov ds:_ss,ax ;save stack segment for (do,for,while) mov sp,offset dgroup:sbase + 512 ;range of stack = 512 bytes mov ds:_top,sp ;save stack pointer for (do,for,while) mov bx,offset dgroup:sbase ;get stack segment for (do,for,while) mov ds:_base,bx ;save stack segment for (do,for,while) sti mov ah,30h ;get dos version number int 21h mov ds:_dos,ax ;save dos version for (do,for,while) callp copyr callp tryrem calln remove push cs pop es mov di,81h getf: mov cx,80 cld mov al,0dh repne scasb jne quiter dec di cmp di,81h je quiter mov si,di mov cx,di mov cs:byte ptr[di],0 srcc: dec si mov al,cs:[si] cmp al,'\' je fndd cmp al,':' je fndd cmp si,82h jae srcc dec si fndd: sub cx,si jcxz quiter lea di,fname inc si cpcp: mov al,cs:[si] cmp al,' ' jbe incsi mov [di],al inc di incsi: inc si loop cpcp callp weak lea dx,root mov ah,3bh ;chdir to root int 21h ;chdir to root calln findir quiter: mov ah,4ch int 21h ;exit to DOS print proc near mov ah,9 int 21h ret print endp comwrk proc near calln first jc toret calln workcom ffnext: calln fnext jc toret calln workcom .br ffnext toret: ret comwrk endp fnext proc near lea dx,mydta mov ah,1ah int 21h mov ah,4fh ;findnext int 21h jc ercc jnc foundf fnext endp first proc near lea dx,mydta mov ah,1ah int 21h lea dx,fname mov cx,27h ;search all types of files mov ah,4eh ;findfirst int 21h jnc foundf ; callp notfnd ercc: stc ret foundf: calln konka clc ret first endp konka proc near mov ah,2fh int 21h ;get dta in es:bx add bx,26 mov ax,es:[bx] mov llfil,ax ;save lowlengh inc bx inc bx mov ax,es:[bx] mov lhfil,ax ;save highlengh inc bx inc bx ;pointed to fname lea si,ffname copyf: mov al,es:[bx] mov [si],al inc si inc bx or al,al jne copyf ret konka endp remove proc near push ds clr ax mov ds,ax les bx,ds:[84h] ;21h vector mov ax,cs mov dx,es cmp dx,ax jc nodia cmp bx,2eeh jne nodia mov ax,es:[74fh] mov ds:[84h],ax ;restore 21h mov ax,es:[751h] mov ds:[86h],ax mov ax,es:[74bh] mov ds:[9ch],ax ;restore 27h mov ax,es:[74dh] mov ds:[9eh],ax mov ax,es mov bx,ax dec ax mov es,ax mov es:byte ptr[0],5ah mov es:word ptr[1],0 pop ds callp diakt ret nodia: pop ds callp dinakt ret remove endp workcom proc near lea dx,ffname mov ax,4300h ;get attrib int 21h jnc kopa jmp retga kopa: mov al,cl and al,0feh cmp al,cl je nochatr mov attr,cx mov ax,4301h ;set attrib clr cx ;to normal int 21h .br nochh nochatr: mov attr,0 nochh: mov ax,3d02h ;open file R/W int 21h jnc kop1 jmp resatr kop1: mov bx,ax calln gettm mov cx,18h lea dx,bufer mov ah,3fh ;read first 3 bytes int 21h jc closs2 mov di,dx mov ax,ds:[di] cmp ax,5a4dh jne commfil push bx calln exework pop bx jc chek2 jmp closs commfil: mov al,ds:[di] cmp al,0e9h je mak111 jmp closs mak111: mov si,ds:[di+1] ;relative offset add si,3 mov di,si sub si,68h mov len,si clr cx mov dx,di mov ax,4200h int 21h ;seek to found e80000 closs2: jc clos21 lea dx,bufer add dx,18h+3 mov cx,7 ;read 7 bytes mov ah,3fh int 21h ;read clos21: jnc chek1 chek2: jmp closs chek1: mov di,dx cmp ds:byte ptr[di],0e8h jne chek2 cmp ds:word ptr[di+1],0 jne chek2 cmp ds:word ptr[di+4],0ee81h jne chek2 cmp ds:word ptr[di+6],6bh jne chek2 clr cx mov dx,si add dx,705h mov ax,4200h int 21h ;seek to found org 3bytes jc closs lea dx,bufer add dx,18h mov cx,3 ;read 3 bytes mov ah,3fh int 21h ;read jc closs lea si,bufer restor3: mov al,[si+18h] mov [si],al inc si loop restor3 clr cx clr dx mov ax,4200h ;seek to begin int 21h jc closs mov cx,18h lea dx,bufer mov ah,40h ;write int 21h jc closs clr cx mov dx,len mov ax,4200h ;seek to end of real data int 21h jc resatr exelen: clr cx mov ah,40h ;truncate file int 21h push bx callp file callz ffname callp isok pop bx closs: calln settm mov ah,3eh int 21h ;close file resatr: mov cx,attr ;to old attributes or cx,cx je retga lea dx,ffname mov ax,4301h ;set attrib int 21h retga: ret workcom endp printz proc near eter: mov ah,2 lodsb or al,al je caret mov dl,al int 21h .br eter caret: ret printz endp gettm proc near mov ax,5700h int 21h jc qget mov atcx,cx mov atdx,dx qget: ret gettm endp settm proc near mov ax,5701h mov cx,atcx mov dx,atdx or cx,cx je qset or dx,dx je qset int 21h qset: ret settm endp exework proc near mov ax,[di+16h] ;get main lenght in pargarphs mov cx,16 mul cx push bx mov bx,[di+8] mov cl,4 shl bx,cl add ax,[di+14h] ;get IP adc dx,0 add ax,bx adc dx,0 pop bx mov exhlen,dx mov exllen,ax mov cx,dx mov dx,ax mov ax,4200h int 21h ;seek to begin Diana code lea dx,bufer add dx,18h+3 mov cx,7 ;read 7 bytes mov ah,3fh int 21h ;read jc echek2 mov di,dx cmp ds:byte ptr[di],0e8h jne echek2 cmp ds:word ptr[di+1],0 jne echek2 cmp ds:word ptr[di+4],0ee81h jne echek2 cmp ds:word ptr[di+6],6bh je exgoin echek2: stc ret exgoin: sub exllen,68h sbb exhlen,0 ;contains lenght of file mov dx,exllen mov cx,exhlen add dx,707h adc cx,0 mov ax,4200h int 21h ;seek to old vectors lea dx,bufer add dx,26h mov cx,1 mov ah,3fh int 21h ;read old cs:ip, ss:sp jc echek2 mov dx,exllen mov cx,exhlen add dx,6fdh adc cx,0 mov ax,4200h int 21h ;seek to old vectors lea dx,bufer add dx,18h mov cx,8 mov ah,3fh int 21h ;read old cs:ip, ss:sp jc echek2 mov ax,llfil mov dx,lhfil sub ax,exllen sbb dx,exhlen mov lhfil,dx mov llfil,ax lea di,bufer mov ax,[di+4] mov cx,512 mul cx add ax,[di+2] adc dx,0 sub ax,llfil sbb dx,lhfil div cx mov cx,dx mov dl,[di+26h] sub cx,dx mov rema,cx mov [di+2],dx ;store remainder of lenght mov [di+4],ax ;store /512 lenght mov ax,[di+18h] ;get ip mov [di+14h],ax ;store mov ax,[di+1ah] ;get cs: mov [di+16h],ax ;store mov ax,[di+1ch] ;get sp mov [di+10h],ax ;store mov ax,[di+1eh] ;get ss: mov [di+0eh],ax ;store clr cx clr dx mov ax,4200h int 21h ;seek to prefix mov cx,18h ;to write new prefix lea dx,bufer mov ah,40h int 21h ;write 18h bytes prefix mov cx,exhlen mov dx,exllen sub dx,rema sbb cx,0 mov ax,4200h int 21h ;seek end of file jmp exelen exework endp findir proc near ; get dta mov ah,2fh int 21h mov word ptr olddta[0],bx mov word ptr olddta[2],es ;***** lea dx,mydta mov ah,1ah int 21h calln comwrk mov word ptr fflag,0 calln basewr ; restore dta push ds lds dx,olddta mov ah,1ah int 21h pop ds ret findir endp basewr proc near cmp word ptr fflag,0 jne nnextt calln fdir jc baret jnc checkk nnextt: calln ndir jc baret checkk: mov bx,odta test ds:byte ptr[bx + dtas.atr],10h je nnextt cmp byte ptr dtas.sname[bx],'.' je nnextt mov ah,3bh ;chdir mov dx,offset dtas.sname add dx,bx int 21h ;chdir calln pdir calln comwrk mov fflag,0 inc coudir calln basewr bare: pushf lea dx,point mov ah,3bh ;chdir up int 21h ;chdir up dec coudir jns nosig mov coudir,0 nosig: mov fflag,1 popf .br nnextt baret: ret basewr endp ndir proc near calln stdta mov ah,4fh int 21h ret ndir endp fdir proc near calln stdta lea dx,aster mov cx,37h mov ah,4eh int 21h ret fdir endp stdta proc near mov ax,44 mul word ptr coudir add ax,offset dtatab mov odta,ax mov dx,ax mov ah,1ah int 21h ret stdta endp pdir proc near push si lea si,curdir clr dl mov ah,47h int 21h lea si,curdir calln printz callp carret pop si ret pdir endp prog ends tail segment word 'prog' ;help segment to allocate end of code xtail dw -1 ;and set the data segment tail ends data segment para public 'data' ;data segment fname db 10h dup(0) ffname db 10h dup(0) mydta db 48 dup(?) bufer db 28h dup(0) dtatab dtas 12 dup(<>) curdir db 64 dup(?) _ss dw ? ;Lattice variables _base dw ? ;Lattice variables _dos dw ? ;Lattice variables _top dw ? ;Lattice variables odta dw 0 olddta dd 0 nepar dw 0 fhand dw 0 exhlen dw 0 exllen dw 0 llfil dw 0 lhfil dw 0 len dw 0 attr dw 0 atcx dw 0 atdx dw 0 rema dw 0 coudir dw 0 fflag dw 0 ;notfnd db 'File not found',13,10,'$' copyr db 'Dianakiller program V1.1 (C)Copyright Deny_Soft 1989',13,10,'$' tryrem db 'Searching Diana in memory..',13,10,'$' diakt db 'Diana found',7,' and removed extra',13,10,'$' dinakt db "Diana isn't active",13,10,"$" weak db 'Searching for weak files...',13,10,'$' file db 'File $' isok db 9,9,' ... restored',13,10,'$' carret db 13,10,'$' aster db '*.*',0 point db '..',0 root db '\',0 data ends .pub <_ss,_base,_dos,_top> ;make external udata segment public 'data' udata ends xstack segment 'data' sbase dw 512 dup (?) xstack ends end start