Перехват API

Тема в разделе "WASM.NT.KERNEL", создана пользователем igorx86z, 17 мар 2007.

  1. igorx86z

    igorx86z New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    2
    есть следующий код перехвата апи функции, кто может объяснить его строчка за строчкой
    Код (Text):
    1. bool APIHook(LPCSTR sDllName, LPCSTR sAPIName, DWORD dwNewAddress)
    2. {
    3.    LPVOID pvNewAddress = GetProcAddress (GetModuleHandleA(sDllName) ,sAPIName);
    4.  
    5.    PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)GetModuleHandleA(0);
    6.    PIMAGE_NT_HEADERS pNTHeader = (PIMAGE_NT_HEADERS)( (DWORD)pDosHeader + (DWORD) pDosHeader->e_lfanew);
    7.    PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)( (DWORD)pDosHeader + (DWORD)pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress );
    8.  
    9.    if ( IsBadReadPtr(pDosHeader, sizeof(IMAGE_DOS_HEADER)) )
    10.         return false;
    11.  
    12.    while(pImportDesc->Name)
    13.    {
    14.       char *szModuleName = (char *)((DWORD)pDosHeader + (DWORD)pImportDesc->Name);
    15.       if(!stricmp(szModuleName, sDllName))
    16.          break;
    17.  
    18.       pImportDesc++;
    19.    }
    20.  
    21.    PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)( (DWORD)pDosHeader + (DWORD)pImportDesc->FirstThunk );
    22.  
    23.    DWORD dwOldProtect1;
    24.    DWORD dwOldProtect2;
    25.    while(pThunk->u1.Function)
    26.    {
    27.       if(pThunk->u1.Function == (DWORD)pvNewAddress)
    28.       {
    29.          VirtualProtect((void *)&pThunk->u1.Function,sizeof(DWORD),PAGE_EXECUTE_READWRITE,&dwOldProtect1);
    30.          pThunk->u1.Function = ( DWORD )dwNewAddress;
    31.          VirtualProtect((void *)&pThunk->u1.Function,sizeof(DWORD),dwOldProtect1,&dwOldProtect2);
    32.          return true;
    33.       }
    34.       pThunk++;
    35.    }
    36.    return false;
    37. }
    Заранее спасибо
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Сначала определяется база образа, потом проверяется доступность этой памяти на чтение, потом в таблице импорта ищется нужная библиотека, потом ищется нужная функция и вместо ее адреса записывается нужный. Это кратко. Для более детального описания - читай описание таблицы импорта у ицсезиона на этом сайте - сам все поймешь. Т.к. тебе же важен сам алгоритм (ведь операторы СИ тебе никто не будет расжевывать)?

    Кстати, ты не удачно выбрал раздел форума - это раз. Во-вторых, подобная тема уже много раз пробегала
     
  3. igorx86z

    igorx86z New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    2
    2MSoft

    Я не мог понять алгоритм, но ты объяснил хорошо
    Спасибо