Реферат: Перехват API-функций в Windows NT2000XP

jump.arg = (DWORD)&Intercept_MessageBoxA;

jump.instr_ret = 0xC3;

//Прочитаем и сохраним первые оригинальные 6 байт стандартной API функции

ReadProcessMemory(GetCurrentProcess(),(void*) adr_MessageBoxA,

(void*)&old, 6, &written);

//Запишем команду перехода на нашу функцию поверх этих 6-ти байт

WriteProcessMemory(GetCurrentProcess(), (void*)adr_MessageBoxA,

(void*)&jump, sizeof(jmp_far), &written);

}

Теперь посмотрим, как выглядит сама функция-двойник. Она должна заменить стандартную MessageBoxA, поэтому её тип и состав параметров должны точно соответствовать оригиналу:

//данное определение аналогично __srtdcall

BOOL WINAPI Intercept_MessageBoxA(HWND hwnd, char *text, char *hdr, UINT utype)

{

//Сначала восстанавливаем 6 первых байт функции. Это не обязательное

// действие, просто мы решили подшутить над пользователем, и все

// сообщения функции MessageBoxA переделать на свои, поэтому нам придется

// вызвать оригинальную функцию, а для этого следует восстановить ее адрес:

WriteProcessMemory(GetCurrentProcess(), (void*)adr_MessageBoxA,

(void*)&old, 6, &written);

//Здесь вы можете порезвиться от души и выполнить любые, пришедшие вам

// в голову действия. Мы просто заменили сообщение функции на свое:

char *str = "Hi From MessageBOX!!!!";

//Вызываеморигинальнуюфункциючерезуказатель

((BOOL (__stdcall*)(HWND, char*, char*, UINT))adr_MessageBoxA)(hwnd,

str, hdr, utype);

//Снова заменяем 6 байт функции на команду перехода на нашу функцию

WriteProcessMemory(GetCurrentProcess(), (void*)adr_MessageBoxA,

(void*)&jump, 6,&written);

return TRUE;

К-во Просмотров: 417
Бесплатно скачать Реферат: Перехват API-функций в Windows NT2000XP