Реферат: Перехват API-функций в Windows NT2000XP
Если откомпилировать этот код как DLL, то получим файл, который в дальнейшем (см.ниже) следует внедрить в процесс, в котором мы хотим перехватить API MessageBoxA.
Метод 2. Перехват API через таблицу импорта.
Прием заключается в замене адреса функции в таблице импорта на адрес функции-двойника. Для понимания данного метода потребуется знание формата PE исполняемых файлов Windows. Как известно, большинство приложений вызывает функции из dll через таблицу импорта, представляющую собой после загрузки exe файла в память списки адресов функций, импортируемых из различных Dll. Откомпилированный вызов функции через таблицу импорта выглядит следующим образом:
Call dword ptr[address_of_function] |
или что-то наподобие. Здесь address_of_function – адрес в таблице импорта, по которому находится адрес вызываемой функции. (Тем, кто не знаком со структурой PE заголовка EXE файла, рекомендуем заглянуть в Интернет за соответствующей информацией.)
При перехвате API через таблицу импорта надо:
найти в таблице импорта элемент IMAGE_IMPORT_DESCRIPTOR, соответствующий той DLL, из которой импортирована функция;
узнать адрес перехватываемой функции при помощи GetProcAddress;
перебирая элементы массива, на который указывает поле FirstThunk, найти адрес перехватываемой функции;
запомнить этот адрес где-нибудь и записать на его место адрес функции-двойника.
Теперь при вызове подмененной функции вначале будет вызываться функция-двойник. После этого она может вызвать (или не вызывать) оригинальную функцию.
Достоинство данного метода в том, что он будет корректно работать в многопоточном приложении, когда несколько потоков одновременно вызывают подмененную функцию. Так же данный метод будет работать в ОС WINDOWS 9.x.
Недостаток – не все функции вызываются через таблицу импорта.
Ниже приведен пример программы, аналогичной приведенной выше, но использующей второй метод перехвата функции:
DWORD adr_MessageBoxA; BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { if(ul_reason_for_call == DLL_PROCESS_ATTACH) InterceptFunctions(); return TRUE; } // Эта функция ищет в таблице импорта - .idata нужный адрес и меняет на // адрес процедуры-двойника void InterceptFunctions(void) { // Начало отображения в памяти процесса BYTE *pimage = (BYTE*)GetModuleHandle(NULL); BYTE *pidata; // Стандартные структуры описания PE заголовка К-во Просмотров: 411
Бесплатно скачать Реферат: Перехват API-функций в Windows NT2000XP
|