_____ _____ ___
_,┌\/┐ :░ :░ :░ ╓ social distortion all about vx-scene ╖
,4\┘¤"``"¤┘ ll l¤` ll ::;;;::;;.... ....:;..: ::...;.:;;;:;
:░(_ | ___ ll ._
`└/|│S|/┐,_ |¤`┌\╙¤"¤╜/:: |╓,._ Использование "сильных"
_____ ``^"¤└/L, d7┘` ___ 7l:;%%|.$| криптографических алгоритмов
$$$$|_ | `7;?( |asd| :: |$$$|$| в вирусах [2000]
$$$$|/┌,.__,┌\:`4│/┐,_ _ll ``''""¤¤┘┘ by Uncle Fucker
$$$$|`└/|││|\┘` `¤└/│:
Сейчас "стойкие" криптографические алгоритмы используются, буквально,
везде. Я никогда не думал о возможности их использования в вирусах...
Однако, прочитав описание вируса W32/HYBRIS [B,C] от Sophos, эта контора
утверждает, что тело червя (а также его апдейты) "зашифрованы 'сильным' 128
битным криптографическим алгоритмом", я призадумался.
Автора я не знаю, вирусного бинарника у меня нет, поэтому, узнать так-ли
это, и что за алгоритмы используется в черве, я несмог. Немного раньше я
читал описание вирусов от этой конторы - например W32/BYMER они называли
WORM.RC5 (как криптографический алгоритм), бинарника этого "чуда" ;)) у
меня тоже нет, поэтому остается только догадываться.
Как раз сделав одну интересную вещичку, я писал для нее мутейшн. Однако,
прочитав описание Hybris'а, я подумал, может стоит плюнуть на движок и
реализовать какой-нибудь из простеньких криптографических алгоритмов для
продукта. Сказано - сделанно, я выбрал RC4 из-за его простоты и перевел
исходник с C на assembler (исходники представленны ниже).
Т.к. мой продукт использовал очень оригинальный (новый) метод
распространения, использование RC4 было большим плюсом. Алгоритм позволял
использовать ключ до 256 байт, причем он (ключ) должен находиться либо в
теле червя, либо, в каком-то файле.
--- плюсы использования strong cryptographic algorythm ---
Написанный мной продукт оставался на машине (скрывался в 2 местах) и
распространялся только с помощью почты. Он, как бы, состоит из двух частей:
─── "шпион" ───
Списав "спрятанные" вирусные файлы и запустив на другой машине заразиться
было нельзя, т.к. в дропперах контролирующих распространение "зараженной"
почты, ключ не содержался, он находился в том же каталоге, но отдельном
файле и если этот файл будет поврежден или стерт - продукт перестанет
работать (естественно не завесив систему, а просто тихо передав управление)
это конечно плохо. Но, с другой стороны, это антиевристика и продукту
такого типа очень важно, что бы его не смогли обнаружить и удалить.
─── "разносчики заразы" ───
С дропперами, рассылаемыми по почте продуктом, было немного подругому.
Они должны содержать ключ в своем теле, т.е. должны заразить "машину
по любому". Это их единственная миссия.
--- исходники в пример к статье ---
rc4ex.asm - пример использования алгоритма rc4
rc4.inc - файл с процедурами алгоритма rc4
key.asc - пример ключа
Исходники не содержат достаточное количество комментариев, но разобраться
в нем очень просто. Советую почитать статейки про этот алгоритм, посмотреть
его исходники на c/pascal (кому, что ближе).
───[rc4ex.asm]───────────────────────────────────────────────────────[start]──
;
; RC4_SCA (x) 2000
;
; compile
; ───────
; tasm /m rc4ex.asm
; if exist rc4ex.obj tlink /t /x rc4ex.obj
; if exist rc4ex.obj del rc4ex.obj >nul
;
;
.model tiny
.code
org 256
;───────────────
code_size equ (data_end-data_start)
rc4_key_len equ (rc4_key_end-rc4_key_start)
;───────────────
start: sub bp,bp
mov di,(code_size)
lea si,[bp+data_start]
call calculate_crc
mov word ptr [bp+crc],ax
crypt_code: mov dx,(rc4_key_len) ; длина ключа
lea si,[bp+rc4_key_start] ; ключ
call rc4_exp_key
mov dx,(code_size)
lea si,[bp+data_start]
call rc4_crypt
;───────────────
decrypt_code: mov dx,(rc4_key_len) ; длина ключа
lea si,[bp+rc4_key_start] ; ключ
call rc4_exp_key
mov dx,(code_size)
lea si,[bp+data_start]
call rc4_crypt
;───────────────
check_code: mov di,(code_size)
lea si,[bp+data_start]
call calculate_crc
;
cmp word ptr [bp+crc],ax
jz decrypted_ok
;───────────────
decrypted_er: mov ah,9
lea dx,[bp+msg_decrypted_ok]
int 21h
jmp exit_to_dos
;───────────────
decrypted_ok: mov ah,9
lea dx,[bp+msg_decrypted_ok]
int 21h
;───────────────
exit_to_dos: sub ax,ax
int 16h
mov ax,4c00h
int 21h
;─────────────────────────────────────────────────────────────────────────────
data_start label byte
db ' Желтая масса наполняет страну,',13,10
' Нашу культуру хотят уничтожить!',13,10
' Но есть патриоты, они не умрут,',13,10
' Будут гнать из страны всех этих желтых!',13,10
' ─────────',13,10
' (с) Штурм',13,10
data_end label byte
;─────────────────────────────────────────────────────────────────────────────
crc dw ?
msg_decrypted_ok db 'Code decrypted ok$'
msg_decrypted_er db 'Code decrypted not correct$'
;─────────────────────────────────────────────────────────────────────────────
include key.asc
include rc4.inc
;─────────────────────────────────────────────────────────────────────────────
end start
;─────────────────────────────────────────────────────────────────────────────
───[rc4ex.asm]─────────────────────────────────────────────────────────[end]──
* * *
───[rc4.inc]─────────────────────────────────────────────────────────[start]──
;─────────────────────────────────────────────────────────────────────────────
; rc4_exp_key - generate key
;
; on start ds:dx - key size (256)
; ds:si - key location
; ds:bp - current ip
;
rc4_exp_key: push ax cx bx di bp sp
mov dh,dl ; keylenTmp = keylen
;
sub ax,ax ; y = 0
sub di,di ; di = ax
;
sub bx,bx ; x = 0
init_loop: push bx
add bx,bp
mov byte ptr [bx+rc4_key],bl ; rc4key[x]=x
pop bx
inc bl ; x++
jnz init_loop
;
key_loop: push bx
add bx,bp
mov cl,byte ptr [bx+rc4_key] ; sx = rc4_key[x]
pop bx
add al,byte ptr [si] ; y += key[keypos]
add al,cl ; y += sx
push ax
pop di ; di = ax
;
mov ch,byte ptr [di+bp+rc4_key] ; temp = rc4_key[y]
push bx
add bx,bp
mov byte ptr [bx+rc4_key],ch ; rc4key[x] = temp
pop bx
mov byte ptr [di+bp+rc4_key],cl ; rc4key[y] = sx
inc si ; ++keypos
dec dh ; keylenTmp--
jnz no_reset_keypos ; if(!keylenTmp)
;
sub si,dx ; keypos = 0
mov dh,dl ; keylenTmp = keylen
;───────────────
no_reset_keypos:
inc bl ; x++
jnz key_loop
;
mov byte ptr [bp+rc4_x],bl ; rc4->x = 0
mov byte ptr [bp+rc4_y],bl ; rc4->y = 0
pop sp bp di bx cx ax
ret
;─────────────────────────────────────────────────────────────────────────────
; rc4_crypt - crypt data with rc4
;
; on start ds:dx - data size
; ds:si - data location
; ds:bp - current ip
;
rc4_crypt: push ax cx bx di bp sp
or dx,dx ; if len == 0, exit
jz rc4_ret
sub ax,ax ; ax = rc4.y
sub bx,bx ; bx = rc4.x
sub di,di
mov al,byte ptr [bp+rc4_y]
mov bl,byte ptr [bp+rc4_x]
;───────────────
rc4_crypt_lp: inc bl ; x++
push bx
add bx,bp
mov cl,byte ptr [bx+rc4_key] ; sx = rc4_key[x]
pop bx
add al,cl ; y += sx
push ax
pop di ; di = ax
mov ch,byte ptr [di+bp+rc4_key] ; sy = rc4_key[y]
mov byte ptr [di+bp+rc4_key],cl ; rc4_key[y] = sx
push bx
add bx,bp
mov byte ptr [bx+rc4_key],ch ; rc4_key[x] = sy
pop bx
add cl,ch
sub ch,ch
push cx
pop di ; di = cx
mov cl,byte ptr [di+bp+rc4_key]
xor byte ptr es:[si],cl ; *data ^= rc4key[temp]
inc si ; data++
dec dx ; len--
jnz rc4_crypt_lp
mov byte ptr [bp+rc4_x],bl
mov byte ptr [bp+rc4_y],al
rc4_ret: pop sp bp di bx cx ax
ret
;─────────────────────────────────────────────────────────────────────────────
; calculate_crc - calculate crc 16
;
; on start ds:si - data
; ds:di - size of data
;
; on end ds:ax - crc16
;
calculate_crc: cld
push cx dx bx si
mov cx,-1
mov dx,cx
next_byte: sub ax,ax
sub bx,bx
lodsb
xor al,cl
mov cl,ch
mov ch,dl
mov dl,dh
mov dh,8
next_bit: shr bx,1
rcr ax,1
jnc no_carry
xor ax,8320h
xor bx,0edb8h
no_carry: dec dh
jnz next_bit
xor cx,ax
sub dx,bx
dec di
jnz next_byte
not dx
not cx
mov ax,dx
ror ax,cl
add ax,cx
pop si bx dx cx
ret
;─────────────────────────────────────────────────────────────────────────────
rc4_x db 0
rc4_y db 0
rc4_key db 256 dup (?)
;─────────────────────────────────────────────────────────────────────────────
───[rc4.inc]───────────────────────────────────────────────────────────[end]──
* * *
───[key.asc]─────────────────────────────────────────────────────────[start]──
rc4_key_start label byte
db 'mQENAzmHx+YAAAEIAN7+b0mGO9feYybiICWS36DcXf8XU9eCOfrPy4O7Rt+c821Y'
db 'DpNM0RpBaVwmK9ohmxOnWne/1Hx/95hmNlaEHzRz8LJc0PyUcGpnBQ0Kf1cathwn'
db 'LOpwtxdQ9GqWgwuwaY1SzqIvWMf73EaqBqRRgukdLqbV2kkS6rtIBVLMVZ4esm9D'
db 'BfKzk3ubF6GWvHVrHKb0ZJkJ4OHCZRrxdygh3o6CSAni8w/adOk4oGVEI+Nqpses'
rc4_key_end label byte
───[key.asc]───────────────────────────────────────────────────────────[end]──
(x) 2000 Uncle Fucker