Пытаюсь выполнить перехват API функции CreateFileA, методом изменения адреса в разделе импорта. Все нормально перехватывается, однако после любого вызова CreateFileA, вызывающее приложение падает. Причем, с некоторыми другими функциями все ok. Под отладчиком во внедренной DLL видно, что вызов стандартной функции проходит нормально, завершение переопределенной функции тоже, креш происходит где-то дальше, а в ассемблере я не силен. :(
В чем тут может быть проблема, или хотя бы в каком направлении копать?
P.S. Попробовал класс Рихтера для перехвата API функций, результат тот же самый.
Все-таки креш происходит при вызове стандартной CreateFileA. Сейчас проверил: адрес правильный, типы и последовательность параметров совпадают (выдрано из winbase.h)...
Здравствуйте Аноним, Вы писали:
А>Пытаюсь выполнить перехват API функции CreateFileA, методом изменения адреса в разделе импорта. Все нормально перехватывается, однако после любого вызова CreateFileA, вызывающее приложение падает. Причем, с некоторыми другими функциями все ok. Под отладчиком во внедренной DLL видно, что вызов стандартной функции проходит нормально, завершение переопределенной функции тоже, креш происходит где-то дальше, а в ассемблере я не силен.
А>В чем тут может быть проблема, или хотя бы в каком направлении копать?
А>P.S. Попробовал класс Рихтера для перехвата API функций, результат тот же самый.
Код покажи, хукать по разному можно.
V>Код покажи, хукать по разному можно.
typedef HANDLE(*PFNCREATEFILE)(LPCSTR, DWORD, DWORD,
LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE);
//..................
// Подменная функция:
HANDLE WINAPI CreateFileMyA(LPCSTR lpFileName, DWORD dwDesiredAccess,
DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile) {
PFNCREATEFILE pfn = ((PFNCREATEFILE)(PROC)g_createFileHook); // вынесено для проверки, чтобы убедиться, что
// адрес тот
// g_createFileHook - глобальный объект внедряемой DLL, класса, занимающегося поиском и заменой адресов функций в IAT.
// для простоты, можно представить, что это класс CAPIHook Рихтера. Его пробовал тоже, хотя и мой класс
// работает с аналогичным результатом.
HANDLE hHandle = pfn(lpFileName, dwDesiredAccess,
dwShareMode, lpSecurityAttributes,
dwCreationDisposition, dwFlagsAndAttributes,
hTemplateFile); // вот на этом вызове ругается, что
// вроде как параметры функции не очень...
return hHandle;
}
Собственно, замена адреса в IAT происходит нормально, адрес исходной функции сохраняется верный, я все тщательно проверил.
Все, проблема снята. Родную-то функцию надо вызывать как __stdcall. Все невнимательность...