Заменить ObjectAttributes из-под zwCreateFile

Тема в разделе "WASM.WIN32", создана пользователем Begemot, 8 мар 2007.

  1. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Примерно так:
    Код (Text):
    1.     // исходное имя файла
    2.     PWSTR FileName = L"\\??\\C:\\File.txt";
    3.    
    4.     // область для маппинга (минимум страница)
    5.     PWSTR FileNameToMap = ExAllocatePoolWithTag( NonPagedPool, 0x1000, ' gaT' );
    6.     memcpy( FileNameToMap, FileName, sizeof(FileName) );
    7.    
    8.     // формируем MDL
    9.     PMDL mdl = IoAllocateMdl( FileName, 0x1000, FALSE, TRUE, NULL );
    10.     MmBuildMdlForNonPagedPool( mdl );
    11.  
    12.     __try
    13.     {
    14.         PVOID UserModePointer = MmMapLockedPagesSpecifyCache( mdl, UserMode, MmCached, NULL, FALSE, NormalPagePriority );
    15.  
    16.         if( UserModePointer )
    17.         {
    18.             // теперь UserModePointer указывает на UserMode-ную проекцию буфера FileNameToMap
    19.  
    20.             // работаем
    21.  
    22.             MmUnmapLockedPages( UserModePointer, mdl );
    23.         }
    24.     }
    25.     __except( EXCEPTION_EXECUTE_HANDLER)
    26.     {
    27.         DPRINT("Failed");
    28.     }
    29.  
    30.     IoFreeMdl( mdl );
    31.     ExFreePool( FileNameToMap );
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Сори, не
    , а, конечно,
     
  3. Begemot

    Begemot New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2006
    Сообщения:
    79
    Спасибо,
    Но в таком варианте получаю ошибку STATUS_DATATYPE_MISALIGNMENT (80000002).
    Код (Text):
    1. if( UserModePointer )
    2. {
    3.     ObjectAttributes->ObjectName=UserModePointer;
    4.     status=TrueNtCreateFile(FileHandle,DesiredAccess,ObjectAttributes,IoStatusBlock,
    5.             AllocationSize,FileAttributes,ShareAccess,CreateDisposition,
    6.             CreateOptions,EaBuffer,EaLength);
    7.     DPRINT("%x ---- %d", status, FileHandle);
    8.     MmUnmapLockedPages( UserModePointer, mdl );
    9. }
    А таком варианте прежнюю ошибку:
    Код (Text):
    1. if( UserModePointer )
    2. {
    3.     InitializeObjectAttributes(&InterceptedObjectAttributes, UserModePointer, OBJ_CASE_INSENSITIVE, NULL, NULL);
    4.     status=TrueNtCreateFile(FileHandle,DesiredAccess,&InterceptedObjectAttributes,IoStatusBlock,
    5.             AllocationSize,FileAttributes,ShareAccess,CreateDisposition,
    6.             CreateOptions,EaBuffer,EaLength);
    7.     DPRINT("%x ---- %d", status, FileHandle);
    8.     MmUnmapLockedPages( UserModePointer, mdl );
    9. }
     
  4. Begemot

    Begemot New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2006
    Сообщения:
    79
    Упс, не заметил, сейчас проверю
     
  5. Begemot

    Begemot New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2006
    Сообщения:
    79
    Хмм, в таком варианте: 0xc0000005
     
  6. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    а что это за перехватчик ZwCreateFile? Через KiServiceTable? Тогда это перехват NtCreateFile. А оригинальный ты, наверное, вызываешь через сохраненный указатель? Если все так, то можно попробовать на самом деле вызывать не оригинальный NtCreateFile, а ZwCreateFile. Не исключено, что это поможет, хотя на самом деле такая подмена опасна
     
  7. Begemot

    Begemot New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2006
    Сообщения:
    79
    Да, сорри NtCreateFile.
    Перехват через SDT.

    Совсем уже...
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Begemot
    А MDL то лочится и проецируется нормально?
     
  9. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    проецировать надо целиком весь ObjectAttributes, включая строку с именем файла, и соответсвенно настраивать на эту юзермодную строку ->ObjectName
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Begemot
    InterceptedObjectAttributes размести тоже в user-mode пространстве.
    Угу? Но тогда надо будет делать флаг того, что ты сам вызвал эту функцию, бо если я не ошибаюсь вызов Nt* из Zw* проходит через KiSystemService. Причем флаг не должен быть, а массивом + сделать лок для этого массива.
     
  11. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    кстати, не знал
     
  12. LivelyRoger

    LivelyRoger New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2006
    Сообщения:
    20
    Сталкивался с той же проблемой, не покажите как правильно должен выглядеть данный код с учетом Ваших слов?

    И вообще, как достучаться до строки в UserModePointer, например через DbgPrint.

    Подскажите, плиз, я тока учусь....
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Код (Text):
    1. // твои OBJECT_ATTRIBUTES
    2. POBJECT_ATTRIBUTES KernelModeAttributes;
    3.  
    4. // область для маппинга (минимум страница)
    5. PWSTR MappingBuffer = ExAllocatePoolWithTag( NonPagedPool, 0x1000, ' gaT' );
    6. memcpy( MappingBuffer, KernelModeAttributes, sizeof(*KernelModeAttributes) );
    7.  
    8. // формируем MDL
    9. PMDL mdl = IoAllocateMdl( KernelModeAttributes, 0x1000, FALSE, TRUE, NULL );
    10. MmBuildMdlForNonPagedPool( mdl );
    11.  
    12. __try
    13. {
    14.     PVOID UserModePointer = MmMapLockedPagesSpecifyCache( mdl, UserMode, MmCached, NULL, FALSE, NormalPagePriority );
    15.  
    16.     if( UserModePointer )
    17.     {
    18.         // теперь UserModePointer указывает на UserMode-ную проекцию буфера KernelModeAttributes
    19.         POBJECT_ATTRIBUTES UserModeObjectAttributes = (POBJECT_ATTRIBUTES) UserModePointer;
    20.  
    21.         // работаем
    22.         MmUnmapLockedPages( UserModePointer, mdl );
    23.     }
    24. }
    25. __except( EXCEPTION_EXECUTE_HANDLER)
    26. {
    27.     DPRINT("Failed");
    28. }
    29.  
    30. IoFreeMdl( mdl );
    31. ExFreePool( MappingBuffer );
    мог и ошибиться)
     
  14. LivelyRoger

    LivelyRoger New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2006
    Сообщения:
    20
    Если я все правильно понял со всего написанного ранее, то при инициализации UserModeObjectAttributes понадобится строка с именем файла также промапинная в usermode.
    Так ли это? Если да, то придется ли повторять весь этот код еще и для нее?
     
  15. LivelyRoger

    LivelyRoger New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2006
    Сообщения:
    20
    И все же, как достучаться до UserModePointer из предыдущего примера?
    Не могли бы вы привести пример для DbgPrint?

    Пишу так:
    Код (Text):
    1. DPRINT("%ws", (PWSTR) UserModePointer);
    И имею: \???
    Ерунда какая-то...
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    проецировать обратно на системные адреса :))
     
  17. LivelyRoger

    LivelyRoger New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2006
    Сообщения:
    20
    А тут как?

    Кстати, к предыдущему примеру (маппинг только имени файла), делаю так(используя приведенный код):

    Код (Text):
    1. ObjectAttributes->ObjectName->Buffer=(PWSTR)UserModePointer;
    2. status=TrueNtCreateFile(FileHandle,DesiredAccess,ObjectAttributes,IoStatusBlock,
    3.         AllocationSize,FileAttributes,ShareAccess,CreateDisposition,
    4.         CreateOptions,EaBuffer,EaLength);
    И status = 0xC000003A, т.е. STATUS_OBJECT_PATH_NOT_FOUND.
    Путь к файлу задан как в примере, и файл существует....
    Интересно...
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    уверен, что он начинается с \??\ ?
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    имхо, код придется повторить
     
  20. LivelyRoger

    LivelyRoger New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2006
    Сообщения:
    20
    Да, уверен