Для любителей натива (часть 1) Не удаляемая директория

Дата публикации 9 янв 2018 | Редактировалось 24 янв 2018
Cogitations poenam nemo patitur (лат.)
Никто не несет наказания за мысли
© sysenter 2004

JID: sysenter@jabber.no

Не удаляемая директория


Хидер, который будет необходим под все эти выкрутасы в дальнейшем и сама либа ― в аттаче.

В общем, запланировал небольшой цикл статей, для тех, кто любит юзермод. Часть будет на Си, часть на Fasm, часть на masm32.
Но в том плане, что это не совсем юзермод, а именно самую низкую его часть, "приближенную к ядру" ― функции native (нативные) из библиотеки ntdll.dll
Итак функция, которая создает директорию, которую стандартными средствами удалить не возможно, код:
Код (C++):
  1. bool MakeNoRemoveDirectory(LPWSTR lpDirPathName)
  2. {
  3.         UNICODE_STRING NameU ={0};
  4.         HANDLE DirectoryHandle = NULL;
  5.         IO_STATUS_BLOCK ioSB = {0};
  6.         bool flag=false;
  7.         OBJECT_ATTRIBUTES ObjAttr;
  8.         RtlInitUnicodeString(&NameU,lpDirPathName);
  9.         RtlDosPathNameToNtPathName_U(lpDirPathName,&NameU,NULL,NULL);
  10. _R:    InitializeObjectAttributes(&ObjAttr,&NameU,OBJ_CASE_INSENSITIVE,NULL,NULL);
  11.         if(NT_SUCCESS(NtCreateFile (&DirectoryHandle,FILE_LIST_DIRECTORY | SYNCHRONIZE | FILE_OPEN_FOR_BACKUP_INTENT,
  12.                                         &ObjAttr,&ioSB,NULL,FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_READONLY,FILE_SHARE_READ,
  13.                                                                 FILE_CREATE,FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,NULL,0)))
  14.         {
  15.             NtClose(DirectoryHandle);
  16.             if(NameU.Buffer)
  17.             if (flag)    {OutputDebugStringW(NameU.Buffer); return flag;}
  18.             flag=true;
  19.             wcscat(NameU.Buffer,L"\\..\\");
  20.             NameU.Length+=4*sizeof(WCHAR);
  21.             goto _R;
  22.         }
  23.         return flag;
  24. }
Технология сложная, если разбирать корни. Доступна только в нативе, если углубляться в ФС, описание которых займет еще 120 страниц; и здесь рассказывать, ― то займет не одну страницу, думаю, что сообщество или скопипастит или изучит, ― кому как. Одну из следующих частей опубликую, как создавать скрытые ключи в реестре (доступна только в нативе соответственно). Функцию подкорректировал ― отладочный лог можно посмотреть через DbgView, к примеру.
Таким макаром можно создать директорию, которую удалить возможно только через файловую систему.

Вложения:

  • sample.7z
    Размер файла:
    71,3 КБ
    Просмотров:
    494

11 4.789
RET

RET
Well-Known Member

Регистрация:
5 янв 2008
Публикаций:
17

Комментарии


      1. zerodawn 4 апр 2018
        RET, ты даун что ли или нет. Тебе написали - все компилится. Код не рабочий. На 7-ке во всяком случае.

        Я выше привел аналог, но рабочий. В 2 строчки кода. А не твои выебывания.
      2. RET 19 фев 2018
        Кто хочет - тот сам поймет
      3. RET 19 фев 2018
        ADD: что не шарит в нативе - тот не лезь ;)
        Я готовлю цикл статей по NtQuryObject применительно к перехвату.. если тут у вас не компилится, что уж говорить... это PoC ,если надо могу под студию выкинуть сабж? Надо?

        sample.7z - это то что нужно ;)
      4. RET 19 фев 2018
        Ok будет, вообще кто в теме Руссиновича читайте сорцы, тамо вот имхо заворотливо, но прямо
        , пока его мелкософт не перекупил, а писалось это с 2к винды
      5. RET 17 янв 2018
        Вы ребят сами чтоль.... Код рабочий, уберите цикл и всё, это был спуф; на самом деле он просто с флехи у меня запускался..... На самом деле это кусок моей потахи... А вообще у Русиновича сорцы читайте тогда.
      6. zerodawn 16 янв 2018
        RET ты чяво курейшь. Как скорость связана с утверждением, что это нельзя сделать без натива. Причем тут скорость. Обалденно, скомпилить. По твоему я это че в бат файл сунул? Ясен фиг скомпилил, и прикинь, боже мой, без ОШИБОК. Но возвращает False, а в дебаггер лезть лень, дебажить этот говнокод с goto нет никакого желания.

        И как права связаны с мать его ntdll? Сам сказал все апи туда ведут, особенно из kernel32, так причем тут админ. И да, я пробовал и от админа.И мой код который я привел тоже работает офигенно. Удалить директорию не удается, а снять аттрибут через проводник тоже не дает. the win
      7. RET 16 янв 2018
        А скомпилить пробовали хо тя бы? Объясню чем натив отличается от API обычных - там нет проверок всяких, поэтому он во первых быстрей, во вторых - практически все API идут туда, за исключением шадова. То что у вас не воркед - значит повышайте права до админа.
      8. zerodawn 16 янв 2018
        А если так? И твой код у меня не работает =)

        Код (C++):
        1. UINT MakeNoRemoveDirectory(LPWSTR lpDirPathName)
        2. {
        3.     if (CreateDirectoryW(lpDirPathName, 0))
        4.         return (UINT)SetFileAttributesW(lpDirPathName, GetFileAttributesW(lpDirPathName) | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_READONLY);
        5.     else
        6.         return -1;
        7. }
      9. Fail 12 янв 2018
        Поддерживаю, нужна инфа, иначе народ до "корней" точно не докопает:)
        ratibor4212 нравится это.
      10. TermoSINteZ 9 янв 2018
        Хм, а где сама статья? Где объяснение теории для новичков и тех кому интересно?
        ratibor4212, pipe, Mikl___ и ещё 1-му нравится это.