Реферат: Перехват API-функций в Windows NT2000XP
MessageBox(NULL, "Can`t get addr_MessageBoxA", "Error!", 0);
return;
}
// В таблице импорта ищем соответствующий элемент для
// библиотеки user32.dll
while(iid->Name) //до тех пор пока поле структуры не содержит 0
{
if(strcmp((char*)(pimage + iid->Name), "USER32.dll") ==0 ) break;
iid++;
}
// Ищемв IMAGE_THUNK_DATA нужныйадрес
isd = (DWORD*)(pimage + iid->FirstThunk);
while(*isd!=adr_MessageBoxA && *isd!=0) isd++;
if(*isd == 0)
{
MessageBox(NULL, "adr_MessageBoxA not found in .idata", "Error!", 0);
return;
}
// Заменяем адрес на свою функцию
DWORD buf = (DWORD)&Intercept_MessageBoxA;
DWORD op;
// Обычно страницы в этой области недоступны для записи
// поэтому принудительно разрешаем запись
VirtualProtect((void*)(isd),4,PAGE_READWRITE, &op);
// Пишемновыйадрес
WriteProcessMemory(GetCurrentProcess(), (void*)(isd),
(void*)&buf,4,&written);
//восстанавливаем первоначальную защиту области по записи
VirtualProtect((void*)(isd),4,op, &op);