есть следующий код перехвата апи функции, кто может объяснить его строчка за строчкой Код (Text): bool APIHook(LPCSTR sDllName, LPCSTR sAPIName, DWORD dwNewAddress) { LPVOID pvNewAddress = GetProcAddress (GetModuleHandleA(sDllName) ,sAPIName); PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)GetModuleHandleA(0); PIMAGE_NT_HEADERS pNTHeader = (PIMAGE_NT_HEADERS)( (DWORD)pDosHeader + (DWORD) pDosHeader->e_lfanew); PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)( (DWORD)pDosHeader + (DWORD)pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress ); if ( IsBadReadPtr(pDosHeader, sizeof(IMAGE_DOS_HEADER)) ) return false; while(pImportDesc->Name) { char *szModuleName = (char *)((DWORD)pDosHeader + (DWORD)pImportDesc->Name); if(!stricmp(szModuleName, sDllName)) break; pImportDesc++; } PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)( (DWORD)pDosHeader + (DWORD)pImportDesc->FirstThunk ); DWORD dwOldProtect1; DWORD dwOldProtect2; while(pThunk->u1.Function) { if(pThunk->u1.Function == (DWORD)pvNewAddress) { VirtualProtect((void *)&pThunk->u1.Function,sizeof(DWORD),PAGE_EXECUTE_READWRITE,&dwOldProtect1); pThunk->u1.Function = ( DWORD )dwNewAddress; VirtualProtect((void *)&pThunk->u1.Function,sizeof(DWORD),dwOldProtect1,&dwOldProtect2); return true; } pThunk++; } return false; } Заранее спасибо
Сначала определяется база образа, потом проверяется доступность этой памяти на чтение, потом в таблице импорта ищется нужная библиотека, потом ищется нужная функция и вместо ее адреса записывается нужный. Это кратко. Для более детального описания - читай описание таблицы импорта у ицсезиона на этом сайте - сам все поймешь. Т.к. тебе же важен сам алгоритм (ведь операторы СИ тебе никто не будет расжевывать)? Кстати, ты не удачно выбрал раздел форума - это раз. Во-вторых, подобная тема уже много раз пробегала