Вирусы под Windows
Категория реферата: Рефераты по информатике, программированию
Теги реферата: возраст реферат, доклад по обществознанию
Добавил(а) на сайт: Jandukin.
Предыдущая страница реферата | 7 8 9 10 11 12 13 14 15 16 17 | Следующая страница реферата
Как вызывать API, имея возможность вызывать его и в то же время та-
кой возможности не имея? Ответ: вызывать API, расположение которо-
го в памяти известно - это API в файле KERNEL32.DLL, он находится
по постоянному адресу.
Вызов API приложениями выглядит приблизительно так:
call APLFUNCTIONJMAME
например:
call CreateFileA
После компиляции этот вызов выглядит так:
db 9Ah .инструкция call
dd 7777 ;смещение в таблице переходов
Код в таблице переходов похож на такой:
jmp far [offset into import table]
Смещение в таблице импортируемых имен содержит адрес диспетчера
для данной функции API. Этот адрес можно получить с помощью
GetProcAddress API. Диспетчер функций выглядит так:
push function value
call 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 Test Release |
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 для каждого конкретного случая. Это позволит полу-
чить номер функции и обойтись без необходимой для вызова таблицы
импортируемых имен.
Рекомендуем скачать другие рефераты по теме: оценка курсовой работы, конспект урока по русскому языку.
Предыдущая страница реферата | 7 8 9 10 11 12 13 14 15 16 17 | Следующая страница реферата