Помогите с перехватом FindNextFile

Тема в разделе "WASM.WIN32", создана пользователем mart, 6 май 2008.

  1. mart

    mart New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    67
    Небольшая предыстория моих действий. Решил написать прогу, которя перехватывает вызовы FindNextFileA и FindNextFileW методом модификации таблицы импорта. Для начала, она перехватывала собственные системные вызовы FindNextFileA и FindNextFileW и делала это весьма успешно. Я решил переделать свою прогу в dll, переделал. Теперь главной задачей стоит перехват этих же вызовов в процессе explorer.exe с целью сокрытия нужных файлов на диске.
    Я внедряю свою длл-ку в процесс, она туда попадает, находит таблицу импорта, находит кернел32.длл, находит адрес нужной функции(почему то именно адрес функции FindNextFileW), успешно его перезаписывает(все это проверял с помощью сообщений MessageBox(...)), НО на этом все и останавливается. Перехода управления на функцию-перехватчик не происходит и файлы не скрываются. Сталкивался ли кто-нибудь с этой проблемой раньше? Кто может чем-нибудь помочь? При необходимости могу выложить исходный текст длл-ки. Заранее спасибо!
     
  2. Klayd

    Klayd Степан

    Публикаций:
    0
    Регистрация:
    7 апр 2006
    Сообщения:
    59
    Адрес:
    Киев
    посмотри тут http://www.wasm.ru/forum/viewtopic.php?pid=175899#p175899
     
  3. mart

    mart New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    67
    Klayd, спасибо огромное, разбираюсь в исходниках! Как я успел понять просмотрев быстро этот топик, винда просто не использует функцию FindNextFile для отображения содержимого каталогов? Зачем же тогда она содержится в таблице импорта?:)
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    используется FindFirst/NextFileW помоему всетаки
    по крайней мере когда я был нубом у меня получалось так скрывать файл
     
  5. mart

    mart New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    67
    Запощу я все-таки исходничек:


    #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 о том, что перезапись адреса функции прошла успешно. Когда этот фрагмент кода был экзешником, перехват срабатывал отлично!
     
  6. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    попробуй поменять атрибуты страниц перед записью (VirtualProtect), потому что по дефолту разрешено только чтение, и зачем WriteProcessMemory для текущего процесса..
     
  7. mart

    mart New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    67
    WriteProcessMemory как раз использую для того, чтобы не заморачиваться с VirtualProtect. Еще раз все проверил, совершенно точно перезаписывается адрес функции FindNextFileW в таблице импорта процесса explorer.exe. Изменений в работе проводника никаких, работает полностью корректно. Походу все-таки используется другая функция для просмотра содержимого каталогов...
     
  8. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    mart
    Понятия таблица импорта процесса не существует. Есть таблица импорта какого-то PE-файла. Похоже, перезаписывается FindNextFileW только в exe-шнике explorer.exe, а фактическое чтение папок наверняка осуществляется из какой-то dll-ки (ибо весь explorer построен на COM, а там основную работу делают именно всякие dllки).
     
  9. mart

    mart New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    67
    Спасибо за корректное замечание. Как я успел понять придется либо изменять ТИ всех подгруженных в экспплорер dll, или же перехватывать функцию ZwQueryDirectoryFile. Думаю, второй путь интереснее:)