CreateFile Hook
От: reg_edit  
Дата: 21.11.08 14:05
Оценка:
Добрый день.

У меня проблема не удаётся установить хук на функцию CreateFile A(W).

Метод который я использую — подменить адрес в таблице импорта. Видел много где про него написано в интернете, включая сами исходники.

Я пытаюсь заменить эту CreateFile на MyCreateFile у процесса notepad.exe (или другого не суть).

Программа находит несколько записей в таблице импорта о вызове CreateFile и заменяет на адресс MyCreateFile, но почему то на 7-ой записи вылетает в момент замены адресса. Функция:
//Сменим адрес на свой
WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew, sizeof(pfnNew), NULL);

в частности она вылетает при попытки записать по адрессу 328AB350 , где находиться значение 7c801a28 и заменить его надо на a1c098

хотя я проверял результат VirtualProtect выполняется нормально и ошибок там не происходит.

Проблема именно с заменой функции CreateFile.
Функции LoadLibraryA(W), LoadLibraryExA(W), GetFileSize, ExitProcess заменились на мои функции нормально, а вот CreateFile не хочет


У меня вопросы:
1. кто то сталкивался с подобной проблемой ? или может у него есть работующий код для подмены CreateFile ?
2. Это нормально что в таблице импорта данные о вызове CreateFile встречаются 7 раз и более ? для других функций данные встречаются тоже более 1-го раза, но там они успешно переписывались и работали как надо.


Вот функция которая это делает (взята с инета):


BOOL CHookedFunction::ReplaceInOneModule(
    PCSTR   pszCalleeModName,
    PROC    pfnCurrent,
    PROC    pfnNew,
    HMODULE hmodCaller
    )
{
    BOOL bResult = FALSE;
    __try
    {
        ULONG ulSize;
        // Get the address of the module's import section
        PIMAGE_IMPORT_DESCRIPTOR pImportDesc =
            (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(
            hmodCaller,
            TRUE,
            IMAGE_DIRECTORY_ENTRY_IMPORT,
            &ulSize
            );
        // Does this module has import section ?
        if (pImportDesc == NULL)
            //__leave;
            return bResult;
        // Loop through all descriptors and
        // find the import descriptor containing references to callee's functions
        while (pImportDesc->Name)
        {
            PSTR pszModName = (PSTR)((PBYTE) hmodCaller + pImportDesc->Name);
            if (stricmp(pszModName, pszCalleeModName) == 0)
                break;   // Found
            pImportDesc++;
        } // while
        // Does this module import any functions from this callee ?
        if (pImportDesc->Name == 0)
            //__leave;
            return bResult;
        // Get caller's IAT
        PIMAGE_THUNK_DATA pThunk =
            (PIMAGE_THUNK_DATA)( (PBYTE) hmodCaller + pImportDesc->FirstThunk );
        // Replace current function address with new one
        while (pThunk->u1.Function)
        {
            // Get the address of the function address
            PROC* ppfn = (PROC*) &pThunk->u1.Function;
            // Is this the function we're looking for?
            BOOL bFound = (*ppfn == pfnCurrent);
            // Is this Windows 9x
            if (!bFound && (*ppfn > sm_pvMaxAppAddr))
            {
                PBYTE pbInFunc = (PBYTE) *ppfn;
                // Is this a wrapper (debug thunk) represented by PUSH instruction?
                if (pbInFunc[0] == cPushOpCode)
                {
                    ppfn = (PROC*) &pbInFunc[1];
                    // Is this the function we're looking for?
                    bFound = (*ppfn == pfnCurrent);
                } // if
            } // if

            if (bFound)
            {
                BOOL vr;
                //Нашли!!!
                DWORD dwDummy;
                //Разрешим запись в эту страницу

                VirtualProtect(ppfn, sizeof(ppfn), PAGE_EXECUTE_READWRITE, &dwDummy);

                //Сменим адрес на свой
                WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew,
                    sizeof(pfnNew), NULL);

                //Восстановим атрибуты
                VirtualProtect(ppfn, sizeof(ppfn), dwDummy , &dwDummy);
                //Готово!!!
                bResult = TRUE;
            } // if
            pThunk++;
        } // while
    }
    __finally
    {
        // do nothing
    }
    // This function is not in the caller's import section
    return bResult;
}
createfile hook
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.