Создание папки из ring0

Тема в разделе "WASM.NT.KERNEL", создана пользователем drem1lin, 15 ноя 2009.

  1. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    не могу создать папку, все перечитал все что мог, выпадает ошибка доступа
    Код (Text):
    1. RtlInitUnicodeString (&TempUS, L"\\??\\C:\\MFolder");
    2. InitializeObjectAttributes( &DirObjectAttributes, &TempUS, OBJ_CASE_INSENSITIVE, NULL, NULL);
    3. rc2 = pNtCreateFile(&hDir,
    4.     GENERIC_READ|GENERIC_WRITE|FILE_LIST_DIRECTORY,
    5.     &DirObjectAttributes,
    6.     &stb,
    7.     0,
    8.     FILE_ATTRIBUTE_NORMAL,
    9.     FILE_SHARE_READ|FILE_SHARE_WRITE,
    10.     FILE_CREATE,
    11.     FILE_DIRECTORY_FILE,
    12.     0,
    13.     0);
    в чем моя проблема кроме рук?=)
     
  2. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    что насчет OBJ_KERNEL_HANDLE?
     
  3. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Во-первых, что есть "ошибка доступа"? Во-вторых, какой статус возвращается если вообще возвращается? И что такое pNtCreateFile, откуда это?
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Это здесь ни при чём, по крайне мере на выполнение данного участка кода не влияет совершенно точно.
     
  5. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Этот код, часть перехваченной NtCreateFile, а pNtCreateFile - сохраненный оригинальный обработчик. и сразу вопрос, для мониторинга обращения к файлам, какая из функций нужна NtCreateFile, или NtOpenFile. А ошибка - "Неверная попытка доступа к адресу памяти"

    Код (Text):
    1. NTSTATUS __stdcall MyNtCreateFile(
    2.                                   __out     PHANDLE FileHandle,
    3.                                   __in      ACCESS_MASK DesiredAccess,
    4.                                   __in      POBJECT_ATTRIBUTES ObjectAttributes,
    5.                                   __out     PIO_STATUS_BLOCK IoStatusBlock,
    6.                                   __in_opt  PLARGE_INTEGER AllocationSize,
    7.                                   __in      ULONG FileAttributes,
    8.                                   __in      ULONG ShareAccess,
    9.                                   __in      ULONG CreateDisposition,
    10.                                   __in      ULONG CreateOptions,
    11.                                   __in      PVOID EaBuffer,
    12.                                   __in      ULONG EaLength
    13.                                   )
    14. {  
    15.     NTSTATUS rc,rc2;
    16.     HANDLE hDir;
    17.     OBJECT_ATTRIBUTES DirObjectAttributes;
    18.     UNICODE_STRING TempUS;
    19.     IO_STATUS_BLOCK stb;
    20.     rc = pNtCreateFile(FileHandle,DesiredAccess,ObjectAttributes,IoStatusBlock,AllocationSize,FileAttributes,ShareAccess,CreateDisposition,CreateOptions,EaBuffer,EaLength);
    21.             if (IsGoodFormat(ObjectAttributes->ObjectName) == TRUE)
    22.             {
    23.                     RtlInitUnicodeString (&TempUS, L"\\??\\C:\\MFolder");
    24.                    
    25.                     InitializeObjectAttributes( &DirObjectAttributes, &TempUS, OBJ_CASE_INSENSITIVE, NULL, NULL);
    26.                    
    27.                     rc2 = pNtCreateFile(&hDir,
    28.                     GENERIC_READ|GENERIC_WRITE|FILE_LIST_DIRECTORY,
    29.                     &DirObjectAttributes,
    30.                     &stb,
    31.                     0,
    32.                     FILE_ATTRIBUTE_NORMAL,
    33.                     FILE_SHARE_READ|FILE_SHARE_WRITE,
    34.                     FILE_CREATE,
    35.                     FILE_DIRECTORY_FILE,
    36.                     0,
    37.                     0);
    38.             DbgPrint("rc = 0x%X\n", rc2);
    39.             DbgPrint("stb.Information = 0x%X\n", stb.Information);
    40.             }
    41.        
    42.            
    43.     return rc;
    44. }
     
  6. Klayd

    Klayd Степан

    Публикаций:
    0
    Регистрация:
    7 апр 2006
    Сообщения:
    59
    Адрес:
    Киев
    IoCreateFile
     
  7. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    эта функция для меня сейчас слишком.. мне надо при открытии файлов файлы определенных типов копировать в папку. вот какую из функций взять? и где ошибка?
     
  8. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Вот какого хрена из тебя всё клещами тянуть надо? Что было бы с моими проектами, если бы я по каждому долбанному поводу садился как припадошный посреди комнаты, хватался за голову и, раскачиваясь, повторял "где ошибка, где ошибка..."? Ещё раз дашь 10% ответа вместо 100% - обижусь и уйду. Надоело.

    Что такое "Неверная попытка доступа к адресу памяти"? Это код статуса в rc2? Или это код исключения, которое выбрасывается на этой строчке? Напиши точно, какой код статуса (шестнадцатеричное значение!) возвращает второй вызов. Во-вторых, что это такое - pNtCreateFile, откуда этот адрес? Из таблицы сервисов? С ним точно всё в порядке? Это вообще драйвер у тебя или режим пользователя?

    По поводу какая функция, перехватывать нужно обе, и NtCreateFile и NtOpenFile. Во избежание дальнейших проблем настоятельно рекомендую перейти, пока не поздно, на файловые (мини-)фильтры.
     
  9. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Это часть кода драйвера. я в таблице сервисов заменил адрес обработчика NtCreateFile, и сохранил старое значение в рNtCreateFile. Поставленый хук я проверил, он работает. Потом пока тестировал один раз вернул функцией не rc, а rc2 и оттуда узнал текст ошибки.

    rc = 0xC0000005
    stb.Information = 0x0

    вот такой код ошибки. stb Это соответственно io_status_block
     
  10. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Замени второй вызов на IoCreateFile() и всё будет работать, Nt-сервисы в таких случаях звать нельзя напрямую.
     
  11. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Да, забыл совсем, в IoCreateFile() в этом случае нужно указать флаг IO_NO_PARAMETER_CHECKING, иначе опять же не будет работать.
     
  12. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    А если использовать Zw функцию??
     
  13. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Рекурсия будет.
     
  14. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    только что проверил, ни рекурсии, ни зависаний, нет проблем. Папка создалась, все нормально. Какой функцией можно узнать размер файла, из ring 0? GetFileSize естественно не сработал=(
     
  15. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Да ни хрена ты реально не проверил.

    Это временное явление )

    Парень, ты сам всё знаешь и в советах не нуждаешься. Свободен.

    GetFileSize() у него, каково, а? Жжошь!
     
  16. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    =)) Ладно, спасибо, пойду дальше разбираться.
     
  17. Sav1or

    Sav1or New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    52
    FsRtlGetFileSize()