Добрый день.
У меня проблема не удаётся установить хук на функцию 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;
}