Интересный РоС самоудаления и Windows XP
От: morgot  
Дата: 07.07.21 13:30
Оценка: 15 (2)
Нашел интересный метод самоудаления запущенного ехе
https://github.com/LloydLabs/delete-self-poc Но — не работает на ХР. Сначала подумал, что из-за импорта SetFileInformationByHandle (апи доступна только с висты). Ладно, переписал на натив. все равно не работает на ХР (на других ОС работает). Интересно, почему так? Как бы эта ХР и даром не нужна, просто в который раз убеждаюсь, что современная NT — это, по факту, Виста и выше. То, что раньше — отличалось очень сильно.
IO_STATUS_BLOCK IoStatusBlock;
 
    if(NT_SUCCESS(NtSetInformationFile(hHandle, &IoStatusBlock, &fRename, sizeof(fRename) + sizeof(lpwStream),FileRenameInformation)))
        return TRUE;
    else
        return FALSE;
 
   if(NT_SUCCESS(NtSetInformationFile(hHandle, &IoStatusBlock, &fDelete, sizeof(fDelete),FileDispositionInformation)))
     return TRUE;
   else
     return FALSE;
windows native api
Re: Интересный РоС самоудаления и Windows XP
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 07.07.21 13:53
Оценка: +2
Здравствуйте, morgot, Вы писали:

M>Нашел интересный метод самоудаления запущенного ехе


Главная проблема всех подобных методов — со временем они перестают работать. Единственный корректный вариант — через FILE_FLAG_DELETE_ON_CLOSE, если бы все системы нормально поддерживали его для EXE-файлов.
Re: Интересный РоС самоудаления и Windows XP
От: ononim  
Дата: 07.07.21 13:54
Оценка:
M>Нашел интересный метод самоудаления запущенного ехе
M>https://github.com/LloydLabs/delete-self-poc Но — не работает на ХР. Сначала подумал, что из-за импорта SetFileInformationByHandle (апи доступна

Довольно стремное решение, юзает какой то баг фс. Если файл реально удаляется и его место подчищается и становится доступным для записи — то процесс после такого удаления может совершенно внезапно свалится, если система затребует подкачать страницу с кодом/данными из ехешника, а ее содержимое окажется перетерто или вообще окажется что FILE_OBJECT сдох, хотя последнего не должно быть, по идее. Во избежании таких проблем стоит подстраховаться, и пробежаться по всем страницам имажа сделав их все dirty таким образом -> VirtualProtect(page, RWX) -> *(volatile int *)page = *(volatile int *)page; -> VirtualProtect(page, orig_protection);
Как много веселых ребят, и все делают велосипед...
Отредактировано 07.07.2021 13:55 ononim . Предыдущая версия .
Re[2]: Интересный РоС самоудаления и Windows XP
От: morgot  
Дата: 07.07.21 15:29
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Главная проблема всех подобных методов — со временем они перестают работать.


Я понимаю, что это андок и нестабильность, интересно только с чисто исследовательской стороны. Почему там работает , а там нет?

Здравствуйте, ononim, Вы писали:

O>Довольно стремное решение, юзает какой то баг фс. Если файл реально удаляется и его место подчищается и становится доступным для записи — то процесс после такого удаления может совершенно внезапно свалится


Может, но врядли это где-то нужно в продакшне, разве что деинсталляторы удалять.

Вообще, мне просто стало интересно, почему не работает на ХР — ведь по факту это NT. Подобный баг (в плане, что работало на висте+ , но не ХР) встречал еще с WinSec, конкретно с правами на хендлы. Все таки , видимо, серьезно поменяли там ядро..

p.s. уже ради чистоты эксперимента попробовал не натив, а это http://hex.pp.ua/fileextd.php — такая же ошибка, на переименовании. Короче говоря, задача в NT5 решения не имеет.
Re[3]: Интересный РоС самоудаления и Windows XP
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 07.07.21 15:38
Оценка:
Здравствуйте, morgot, Вы писали:

M>Почему там работает , а там нет?


Ну вот почему во всех виндах до десятки можно удалить файл с образом загруженного драйвера ядра, а в десятке — нет?

M>врядли это где-то нужно в продакшне, разве что деинсталляторы удалять.


В продакшене, подозреваю, это — единственная цель честная применения технологии. Все остальные — малварные.
Re[3]: Интересный РоС самоудаления и Windows XP
От: ononim  
Дата: 07.07.21 16:02
Оценка:
M>Вообще, мне просто стало интересно, почему не работает на ХР — ведь по факту это NT. Подобный баг (в плане, что работало на висте+ , но не ХР) встречал еще с WinSec, конкретно с правами на хендлы. Все таки , видимо, серьезно поменяли там ядро..
Тут скорее драйвер нтфс замешан
Как много веселых ребят, и все делают велосипед...
Re[2]: Интересный РоС самоудаления и Windows XP
От: Quebecois Канада https://www.canada.ca/
Дата: 07.07.21 16:18
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, morgot, Вы писали:


M>>Нашел интересный метод самоудаления запущенного ехе


ЕМ>Главная проблема всех подобных методов — со временем они перестают работать. Единственный корректный вариант — через FILE_FLAG_DELETE_ON_CLOSE, если бы все системы нормально поддерживали его для EXE-файлов.

Самый беспроблемный вариант MoveFileEx(xxx, NULL, MOVEFILE_DELAY_UNTIL_REBOOT).
Re[3]: Интересный РоС самоудаления и Windows XP
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 07.07.21 16:53
Оценка:
Здравствуйте, Quebecois, Вы писали:

Q>Самый беспроблемный вариант MoveFileEx(xxx, NULL, MOVEFILE_DELAY_UNTIL_REBOOT).


Только если EXE предварительно скопирован во временный каталог и запущен оттуда, а процесс из основного экземпляра завершился. Вся эта машинерия не то, чтобы очень проста для надежной реализации.

Они могли бы, кстати, среди великого обилия своих мало кому нужных служб сделать поддержку технологии, подобной MOVEFILE_DELAY_UNTIL_REBOOT, но без перезагрузки. Всего-то делов — раз в несколько секунд проверять состояние файлов/каталогов из списка, и удалять освободившиеся. А еще лучше — сделать нормальную поддержку FILE_FLAG_DELETE_ON_CLOSE для чего угодно.
Re: Интересный РоС самоудаления и Windows XP
От: Bill Baklushi СССР  
Дата: 07.07.21 17:00
Оценка: 3 (1) +1
morgot:

M>Нашел интересный метод самоудаления запущенного ехе

В старые добрые времена процесс воздавал батник, а батник ожидал окончания процесса-папы, а потом прибивал и его и себя.
Надёжный способ.
Объединяйтесь, либералы, для рытья каналов!
Re[2]: Интересный РоС самоудаления и Windows XP
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 07.07.21 17:06
Оценка:
Здравствуйте, Bill Baklushi, Вы писали:

BB>В старые добрые времена процесс воздавал батник, а батник ожидал окончания процесса-папы, а потом прибивал и его и себя.


В батнике нет способа ждать именно завершения процесса. Проще всего тупо циклить на попытках удаления файла.

BB>Надёжный способ.


Единственный надежный.
Re: Интересный РоС самоудаления и Windows XP
От: Alexander G Украина  
Дата: 08.07.21 08:19
Оценка:
Здравствуйте, morgot, Вы писали:

M>Нашел интересный метод самоудаления запущенного ехе


Такое себе. Что если ехе запущен с флешки, а на флешке FAT?
Re[2]: Интересный РоС самоудаления и Windows XP
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 08.07.21 09:07
Оценка: +1
Здравствуйте, Alexander G, Вы писали:

AG>Что если ехе запущен с флешки, а на флешке FAT?


Почему именно на флешке? На HDD/SSD тоже может быть FAT.
Re: Интересный РоС самоудаления и Windows XP
От: Bjorn Skalpe Земля  
Дата: 08.07.21 09:45
Оценка:
Попробуй написать загрузчик, который будет в качестве данных в себе содержать другой исполняемый код. Он будет грузить эти данные в память, а потом запускать процесс, а сам исполняемый файл загрузчика по завершению удаляться этим процессом. В результате в памяти существует процесс без файла.
Re[3]: Интересный РоС самоудаления и Windows XP
От: qaz77  
Дата: 08.07.21 10:35
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>В батнике нет способа ждать именно завершения процесса.

Чо?!
Просто строчка my.exe запускает с ожиданием завершения, а через errorlevel можно код выхода проверять.
Чтобы без ожидания надо start использовать.
Re[2]: Интересный РоС самоудаления и Windows XP
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 08.07.21 10:49
Оценка: +1
Здравствуйте, Bjorn Skalpe, Вы писали:

BS>Попробуй написать загрузчик, который будет в качестве данных в себе содержать другой исполняемый код. Он будет грузить эти данные в память, а потом запускать процесс


И на него будут ругаться чуть более, чем все антивирусы.
Re[4]: Интересный РоС самоудаления и Windows XP
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 08.07.21 11:16
Оценка:
Здравствуйте, qaz77, Вы писали:

ЕМ>>В батнике нет способа ждать именно завершения процесса.


Q>Просто строчка my.exe запускает с ожиданием завершения


Запускать-то она запускает. Только вот при реализации всего этого в совокупности, сперва таки запускается EXE-деинсталлятор из установочного каталога. Если она запустит свою копию через батник — на экране будет висеть черное консольное окно, его придется искать и прятать. Далее, этой копии нужно передать параметры — в частности, путь установочного каталога. Этот путь, внезапно, может оказаться на японском или хинди, а корректной обработки юникода cmd.exe не обещает. По факту оно вроде бы работает, но закладываться на это я бы не стал — придется кодировать/раскодировать строки. Городить все это только для того, чтобы использовать ожидание завершения процесса, запущенного из батника? Гораздо правильнее создать батник уже в процессе-копии, и запустить параллельно перед самым завершением.
Re[5]: Интересный РоС самоудаления и Windows XP
От: morgot  
Дата: 08.07.21 11:41
Оценка:
Ну малварь почти вся использует именно батники, если уж на то пошло.. еще , наверное , можно юзать WSH как замену оного.
для продакшна всегда использовал MoveFile после ребута, а этот способ просто интересно выглядит.
Re[2]: Интересный РоС самоудаления и Windows XP
От: ononim  
Дата: 08.07.21 11:48
Оценка:
BS>Попробуй написать загрузчик, который будет в качестве данных в себе содержать другой исполняемый код. Он будет грузить эти данные в память, а потом запускать процесс, а сам исполняемый файл загрузчика по завершению удаляться этим процессом. В результате в памяти существует процесс без файла.
Побаяню: http://rsdn.org/forum/winapi/3651105.1
Автор: ononim
Дата: 24.12.09

Правда хз, будет ли работать код as is в десятке, проверять лень.
Как много веселых ребят, и все делают велосипед...
Re[5]: Интересный РоС самоудаления и Windows XP
От: qaz77  
Дата: 08.07.21 12:58
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Только вот при реализации всего этого в совокупности, сперва таки запускается EXE-деинсталлятор из установочного каталога.
Никто не мешает в UninstallString записать запуск именно батника, а батник уже будет exe запускать.
Re[6]: Интересный РоС самоудаления и Windows XP
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 08.07.21 14:38
Оценка:
Здравствуйте, qaz77, Вы писали:

Q>Никто не мешает в UninstallString записать запуск именно батника, а батник уже будет exe запускать.


Раз не мешает — делайте. Будете объяснять пользователям, что за странное черное окно мелькает при запуске, что за левая кнопка висит все это время на панели задач, и почему после обновления системы вдруг перестал удаляться установочный каталог, в котором все это лежит.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.