Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых) |
![]() |
eXeL@B —› Программирование —› Внедрение DLL и перехват API-функций |
Посл.ответ | Сообщение |
|
Создано: 06 декабря 2006 21:28 · Личное сообщение · #1 Учусь перехватывать API-функцию CreateFile(). Для этого в процесс внедряю библиотеку DLL, которая подгружает подгружает библиотеку DLL с заменяющими функциями и правит таблицу импорта. Нужна помощь: при работе приложения получаю необрабатываемое исключение. В чем проблема сама разобратся не могу. Часть кода Carrier.dll //-------------------------------------------------------------------- ------- void ReplaceIATEntryInOneMod(PCSTR pszCalleeModName, PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller){ // Получаем адресс раздела импорта модуля ULONG ulSize; PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR) ImageDirectoryEntryToData(hmodCaller, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize); if (pImportDesc == NULL) return; // в этом модуле нет раздела импорта // находим дискриптор раздела импорта со ссылками // на функции DLL (вызываемого модуля) for (;pImportDesc->Name; pImportDesc++) { PSTR pszModName = (PSTR)((PBYTE) hmodCaller + pImportDesc->Name); if (lstrcmpiA(pszModName, pszCalleeModName) ==0) break; // найден } if (pImportDesc->Name ==0) return; // этот модуль не импортирует никаких функций из данной DLL // получаем таблицу адрессов импорта (IAT) для функций DLL PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA) ((PBYTE) hmodCaller + pImportDesc->FirstThunk); // заменяем адреса исходных функций адресами своих функций for (; pThunk->u1.Function; pThunk++){ // получаем адрес адреса функции PROC* ppfn = (PROC*) &pThunk->u1.Function; // та ли это функция которая нас интересует? BOOL fFound = (*ppfn == pfnCurrent); if (fFound){ // адреса сходятся; изменяем адресс в разделе импорта WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew, sizeof(pfnNew), NULL); return; // получилосы; выходим } } // если мы попали сюда, значит в разделе импорта // нет ссылки на нужную функцию }; //-------------------------------------------------------------------- ------- void MyInit(){ // Загрузка собственной библиотеки HANDLE LabraryHandle = LoadLibrary("c:\HookFunction.dll"); PROC pfnOrig = GetProcAddress(GetModuleHandle("Kernel32"), "CreateFileA"); PROC pfnRepl = GetProcAddress(LabraryHandle, "HookCreateFile"); HMODULE hmodCaller = GetModuleHandle(NULL); ReplaceIATEntryInOneMod( "Kernel32.dll", // модуль, содержащий ANSI-функцию pfnOrig, // адрес исходной функции в вызываемой DLL pfnRepl, // адрес заменяющей функции hmodCaller); // описатель модуля, из которого надо вызвать // новую функцию pfnOrig = GetProcAddress(GetModuleHandle("Kernel32"), "CreateFileW"); ReplaceIATEntryInOneMod( "Kernel32.dll", // модуль, содержащий ANSI-функцию pfnOrig, // адрес исходной функции в вызываемой DLL pfnRepl, // адрес заменяющей функции hmodCaller); // описатель модуля, из которого надо вызвать // новую функцию }; //-------------------------------------------------------------------- ------- #pragma argsused BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved) { switch(fwdreason) { case DLL_PROCESS_ATTACH: MyInit(); break; default: break; } return true; } //--------------------------------------------------------------------------- Часть кода HookFunction.dll extern "C" __declspec(dllexport) HANDLE HookCreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTempleFile) { HANDLE hFile = CreateFile( "c:FileFunction.log", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, NULL); LPDWORD NumberWritten; BOOL bWrite = WriteFile( "c:FileFunction.log", &lpFileName, lstrlen(lpFileName), NumberWritten, NULL); CloseHandle(hFile); return CreateFile( lpFileName, dwDesiredAccess, FILE_SHARE_READ, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTempleFile); }; Объясните плз что не так ![]() ![]() |
|
Создано: 07 декабря 2006 02:46 · Личное сообщение · #2 |
|
Создано: 07 декабря 2006 10:42 · Личное сообщение · #3 |
|
Создано: 09 декабря 2006 04:23 · Личное сообщение · #4 |
|
Создано: 09 декабря 2006 13:23 · Личное сообщение · #5 |
|
Создано: 09 декабря 2006 14:19 · Личное сообщение · #6 http://softsearch.ru/programs/94-785-hook-development-kit-download.sht ml http://softsearch.ru/programs/94-785-hook-development-kit-download.shtml Hook Development Kit --- Набор весьма интересных исходников для написания шпионов. Есть так же на дисках crackl@b. Весьма полезно будет. Сам пользовался этой информацией. ----- Уважайте других и пишите грамотно. ![]() |
|
Создано: 09 декабря 2006 15:25 · Личное сообщение · #7 |
![]() |
eXeL@B —› Программирование —› Внедрение DLL и перехват API-функций |