Интересный РоС самоудаления и Windows XP

Тема в разделе "WASM.WIN32", создана пользователем M0rg0t, 27 янв 2021.

  1. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Нашел интересный метод самоудаления запущенного ехе
    https://github.com/LloydLabs/delete-self-poc (спасибо Rel ). Но - не работает на ХР. Сначала подумал, что из-за импорта SetFileInformationByHandle (апи доступна только с висты). Ладно, переписал на натив.

    Код (ASM):
    1. IO_STATUS_BLOCK IoStatusBlock;
    2.  
    3.     if(NT_SUCCESS(NtSetInformationFile(hHandle, &IoStatusBlock, &fRename, sizeof(fRename) + sizeof(lpwStream),FileRenameInformation)))
    4.         return TRUE;
    5.     else
    6.         return FALSE;
    7.  
    8.    if(NT_SUCCESS(NtSetInformationFile(hHandle, &IoStatusBlock, &fDelete, sizeof(fDelete),FileDispositionInformation)))
    9.      return TRUE;
    10.    else
    11.      return FALSE;
    все равно не работает на ХР (на других ОС работает). Интересно, почему так? Как бы эта ХР и даром не нужна, просто в который раз убеждаюсь, что современная NT - это, по факту, Виста и выше. То, что раньше - отличалось очень сильно.
     
    Thetrik и Aiks нравится это.
  2. darkdevel

    darkdevel New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2017
    Сообщения:
    17
    Подождите, а как оно вообще работает?
    Код (C):
    1.     // set our FileNameLength and FileName to DS_STREAM_RENAME
    2.     LPWSTR lpwStream = DS_STREAM_RENAME;
    3.     fRename.FileNameLength = sizeof(lpwStream);
    4.     RtlCopyMemory(fRename.FileName, lpwStream, sizeof(lpwStream));
    Длина имени файла = размер указателя (4), потом в буфер размером 1 копируем 4 байта из имени (портим стек? или удачно попадаем в выравнивание?). Подобные баги часто и проявляются на другой ОС.

    Так и есть, современная NT версии 6 (10-ке назначили номер 10 на вырост), а ХР была 5, ее пора отправить на покой.
     
  3. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    darkdevel, так в оригинале было, см. ссылку. Я тоже не особо понимаю , что значит WCHAR FileName[1]; Т.е имя файла с 1 символа чтоли, или (вероятнее) 1 указатель на имя.
     
  4. darkdevel

    darkdevel New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2017
    Сообщения:
    17
    С именем файла как раз все понятно:
    FileName
    The first character of a wide-character string containing the new name for the file. This is followed in memory by the remainder of the string.
    Так во всех WinAPI обозначаются строки переменной длины, которые надо разместить в структуре. Память для структуры надо выделить заранее с запасом для самой строки. Просто объявить FILE_RENAME_INFO fRename; не получится.

    А на каком этапе возникает ошибка и какая?
     
  5. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Код (C):
    1. union
    2. {
    3.     FILE_RENAME_INFO fRename;
    4.     BYTE buffer[512];
    5. };
     
  6. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    на ХР возникает на NtSetInformationFile (rename), - access_denied.

    Тут нюанс в том, что под отладчиком особо не отладишь - там не работает, т.к. видимо отладчик не дает открыть файл с правами DELETE. Я ставил DebugBreak после вызовов и подключался.
     
  7. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    M0rg0t,

     

    Вложения:

    • io.doc
      Размер файла:
      608,5 КБ
      Просмотров:
      310
  8. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Indy_, но почему тогда на ОС выше ХРюши работает?
     
  9. darkdevel

    darkdevel New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2017
    Сообщения:
    17
    rmn, Indy_, вы бы хоть в взглянули на poc, о котором идет речь ;)
    FILE_RENAME_INFO там объявлен в стеке (и этот момент надо исправить), а файл открывается с dwDesiredAccess == DELETE.

    M0rg0t, если ошибка access_denied, может попробовать открыть с полными правами? Во времена хр так было еще можно.
     
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Пожалуйста.

    Я особо сам не тестил и не смотрел рос, но просто предположу, может, раз там идет речь о потоках, то имеется ввиду ntfs, а xp возможно установлена на fat. Просто ванганул, не разбираясь, так что не хейтите.
     
  11. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    darkdevel,

    Вся рабочая область в стеке и что с того, там как положено статусные проверки.
     
  12. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Rel, да не, вроде ntfs стоит.
    Ладно, это лирика все, поддержка хрюшки мне не нужна, просто решил посмотреть. Надо на других ОС тестить, пока есть мысли юзать это как антидебаг (но нужны тесты).
    к слову, похожая техника юзалась давным давно https://m.habr.com/ru/post/77818/ , но тут все таки концепт в разы интересней.