Небольшая предыстория моих действий. Решил написать прогу, которя перехватывает вызовы FindNextFileA и FindNextFileW методом модификации таблицы импорта. Для начала, она перехватывала собственные системные вызовы FindNextFileA и FindNextFileW и делала это весьма успешно. Я решил переделать свою прогу в dll, переделал. Теперь главной задачей стоит перехват этих же вызовов в процессе explorer.exe с целью сокрытия нужных файлов на диске. Я внедряю свою длл-ку в процесс, она туда попадает, находит таблицу импорта, находит кернел32.длл, находит адрес нужной функции(почему то именно адрес функции FindNextFileW), успешно его перезаписывает(все это проверял с помощью сообщений MessageBox(...)), НО на этом все и останавливается. Перехода управления на функцию-перехватчик не происходит и файлы не скрываются. Сталкивался ли кто-нибудь с этой проблемой раньше? Кто может чем-нибудь помочь? При необходимости могу выложить исходный текст длл-ки. Заранее спасибо!
Klayd, спасибо огромное, разбираюсь в исходниках! Как я успел понять просмотрев быстро этот топик, винда просто не использует функцию FindNextFile для отображения содержимого каталогов? Зачем же тогда она содержится в таблице импорта?
используется FindFirst/NextFileW помоему всетаки по крайней мере когда я был нубом у меня получалось так скрывать файл
Запощу я все-таки исходничек: #include <windows.h> #include <Dbghelp.h> int d = 1; PROC * ppfn; BOOL WINAPI NewFindNextFile(HANDLE hFile,LPWIN32_FIND_DATA fData) { MessageBox(NULL,"...::MyFindNextFile::...","Greetings!",0); BOOL param = ((BOOL (__stdcall*)(HANDLE,LPWIN32_FIND_DATA))ppfn)(hFile,fData); return param; } int MyReplace(FARPROC afnNew,CHAR * modName,CHAR * interceptFun) { HMODULE tmod = GetModuleHandle(TEXT(modName)); FARPROC FNForig = GetProcAddress(tmod,interceptFun); ULONG ulSize; //define process name CHAR * FileName = (CHAR *) malloc (262); GetModuleFileName(NULL, FileName, MAX_PATH + 1); int i; for (i = strlen(FileName) ; i >= 0 ; i--) { if (FileName == '\\') break; } CHAR * actName = (CHAR *) malloc (strlen(FileName) - i + 2); FileName+=(i+1); strcpy(actName,FileName); MessageBox(NULL,"Service Message",actName,0); //end define process name HMODULE hmodCaller = GetModuleHandle(actName); PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR) ImageDirectoryEntryToData(hmodCaller, TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize); if (pImportDesc == NULL) return 0; // в этом модуле нет раздела импорта // находим дескриптор раздела импорта со ссылками // на функции DLL (вызываемого модуля) for (; pImportDesc->Name; pImportDesc++) { PCHAR pszModName = (PCHAR) ((PBYTE) hmodCaller + pImportDesc->Name); if (!strcmp(pszModName,modName)) { PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA) ((PBYTE) hmodCaller + pImportDesc->FirstThunk); DWORD ii = 0; for (; pThunk->u1.Function; pThunk++) { BOOL eq = ((FARPROC)pThunk->u1.Function == FNForig); if (eq == TRUE) { ppfn = (PROC *)pThunk->u1.Function; DWORD dwDummy; if(WriteProcessMemory(GetCurrentProcess(), (PBYTE) hmodCaller + pImportDesc->FirstThunk + ii , &afnNew, sizeof(afnNew), &dwDummy) == TRUE) { MessageBox(NULL,"Hooray","Modification Succeess",0); } } ii+=4;//смещение указателя на 4 байта } } } return 0; } //BOOL APIENTRY Dll BOOL WINAPI DllMain(HANDLE hModule, DWORD fdwReason, LPVOID lpReserved) { if (d == 1) { MessageBox(NULL,"Greetings!","DLL_IN_PROCESS",0); DWORD Param; MyReplace((FARPROC)NewFindNextFile,"KERNEL32.dll","FindNextFileW"); d = 0; } return TRUE; } После вызова функции WriteProcessMemory вылетает MessageBox о том, что перезапись адреса функции прошла успешно. Когда этот фрагмент кода был экзешником, перехват срабатывал отлично!
попробуй поменять атрибуты страниц перед записью (VirtualProtect), потому что по дефолту разрешено только чтение, и зачем WriteProcessMemory для текущего процесса..
WriteProcessMemory как раз использую для того, чтобы не заморачиваться с VirtualProtect. Еще раз все проверил, совершенно точно перезаписывается адрес функции FindNextFileW в таблице импорта процесса explorer.exe. Изменений в работе проводника никаких, работает полностью корректно. Походу все-таки используется другая функция для просмотра содержимого каталогов...
mart Понятия таблица импорта процесса не существует. Есть таблица импорта какого-то PE-файла. Похоже, перезаписывается FindNextFileW только в exe-шнике explorer.exe, а фактическое чтение папок наверняка осуществляется из какой-то dll-ки (ибо весь explorer построен на COM, а там основную работу делают именно всякие dllки).
Спасибо за корректное замечание. Как я успел понять придется либо изменять ТИ всех подгруженных в экспплорер dll, или же перехватывать функцию ZwQueryDirectoryFile. Думаю, второй путь интереснее