Перехват удаления файла. А как получить инфу о нем ?

Тема в разделе "WASM.BEGINNERS", создана пользователем coocky, 10 апр 2007.

  1. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Привет! Перехватываю удаление файла через NtSetInformationFile (надеюсь правильно :)). Насколько я понял, если флаг FileInformationClass==13, то файл удален. А как мне можно до вызова ОРИГИНАЛЬНОЙ функции получить сведение об удаляемом файле. В частности ег имя и (желательно), полный путь
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ObReferenceObjectByHandle потом ObQueryNameString
     
  3. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    О! Плохо.. Во первых у меня нет описания этих функций.. А во вторых -а разве не несет ни одно поле функции NtSetInformationFile (IN HANDLE FileHandle,OUT PIO_STATUS_BLOCK IoStatusBlock,IN PVOID FileInformation,IN ULONG FileInformationLength,IN FILE_INFORMATION_CLASS FileInformationClass) инфо о файле? А что за указатель FileInformation ?
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    FileHandle - хендл файла.
     
  5. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    :)
    Понятно.... :)
    Ок, пытаюсь получить так
    Код (Text):
    1. typedef struct _FILE_NAME_INFORMATION
    2.   {
    3.     ULONG FileNameLegth;
    4.     WCHAR FileName[1];
    5.   } FILE_NAME_INFORMATION,*PFILE_NAME_INFORMATION;
    6.  
    7.   FILE_NAME_INFORMATION pki = {0};
    8.   PIO_STATUS_BLOCK psb = {0};
    9.   NTSTATUS status;
    10.   pNtQueryFile=NULL;
    11.   reinterpret_cast<FARPROC&>(pNtQueryFile) = GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")), "NtQueryInformationFile");
    12. status =  pNtQueryFile(FileHandle,psb, &pki,sizeof(pki),9);
    Так вот функция возвращает ошибку..
    А строки имени файла-пустые
     
  6. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    GetLastError говорит, что доступ запрещен. Блин, что за байда?
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    кхм.. судя по коду ты орудуешь в ринг3? предупреждать надо..
     
  8. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Да, сорри. И все же вопрос остается открытым
    Попробывал сделать через NtQueryObject
    Код (Text):
    1. WCHAR keyName[512]=L"";
    2.   ULONG rLen=0, sLen=0;
    3.  
    4.   OBJECT_NAME_INFORMATION  pki = {0};
    5.   NTSTATUS status;
    6.   PWCHAR pwszKeyName=NULL;
    7.   pNtQueryFile=NULL;
    8.   reinterpret_cast<FARPROC&>(pNtQueryFile) = GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")), "NtQueryObject");
    9.   if (pNtQueryFile==NULL)
    10.   {
    11.     wcscpy(ch,keyName);
    12.     return;
    13.   }
    14.  
    15.     status =  pNtQueryFile(FileHandle,ObjectNameInformation, &pki,sizeof(pki),&sLen);
    16.     if (status!=STATUS_SUCCESS)
    17.     {
    18.       DWORD err=GetLastError();
    19.       return;
    20.     }
    Все равно-не работает..... Хотя err=0; Просто функция возвращает status!=STATUS_SUCCESS... Бред какой-то. Неужели никто не знает, как из юзер моде получить имя файла по хендлу?
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    дергай NtQueryInformationFile и узнавай все, что хочешь)
     
  10. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Если поднятся на 4 поста выше, то можно увидеть код, где я уже вызывал эту функцию и комментарий к нему
     
  11. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    конечно пустые, у тебя буфер размером 6 байт.
    какую.
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    конечно ошибку. я бы на ее месте тоже возвратил ошибку

    PIO_STATUS_BLOCK psb = {0};
    NTSTATUS status;
    pNtQueryFile=NULL;
    reinterpret_cast<FARPROC&>(pNtQueryFile) = GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")), "NtQueryInformationFile");
    status = pNtQueryFile(FileHandle,psb, &pki,sizeof(pki),9);

    а кто выделит память под IO_STATUS_BLOCK?
    Правильно так:

    IO_STATUS_BLOCK IoStatus = {0};
    NTSTATUS status;
    pNtQueryFile=NULL;
    reinterpret_cast<FARPROC&>(pNtQueryFile) = GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")), "NtQueryInformationFile");
    status = pNtQueryFile(FileHandle, &IoStatus, &pki,sizeof(pki),9);
     
  13. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Сорри. Опечатка в коде.. НО! Работает только такой расклад
    Код (Text):
    1. IO_STATUS_BLOCK iosb;
    2. PFILE_NAME_INFORMATION fii=(PFILE_NAME_INFORMATION) new BYTE[512];
    3.   NTSTATUS status;
    4.   PWCHAR pwszKeyName=NULL;
    5.   pNtQueryFile=NULL;
    6.   reinterpret_cast<FARPROC&>(pNtQueryFile) = GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")), "NtQueryInformationFile");
    7.   if (pNtQueryFile==NULL)
    8.   {
    9.     wcscpy(ch,keyName);
    10.     return;
    11.   }
    12.  
    13.     status =  pNtQueryFile(FileHandle,&iosb, fii,512,FileNameInformation);
    14.     if (status!=STATUS_SUCCESS)
    15.     {
    16.       DWORD err=GetLastError();
    17.       wcscpy(ch,keyName);
    18.       return;
    19.     }
    512 взял от фонаря.. А как определить реальный размер?
     
  14. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    И еще вопросик, раз уже заметил.. А ведь нет буквы диска впереди. Путь начинается со слеша... А где брать С: или Е: ??