Нашел интересный метод самоудаления запущенного ехе https://github.com/LloydLabs/delete-self-poc (спасибо Rel ). Но - не работает на ХР. Сначала подумал, что из-за импорта SetFileInformationByHandle (апи доступна только с висты). Ладно, переписал на натив. Код (ASM): 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; все равно не работает на ХР (на других ОС работает). Интересно, почему так? Как бы эта ХР и даром не нужна, просто в который раз убеждаюсь, что современная NT - это, по факту, Виста и выше. То, что раньше - отличалось очень сильно.
Подождите, а как оно вообще работает? Код (C): // set our FileNameLength and FileName to DS_STREAM_RENAME LPWSTR lpwStream = DS_STREAM_RENAME; fRename.FileNameLength = sizeof(lpwStream); RtlCopyMemory(fRename.FileName, lpwStream, sizeof(lpwStream)); Длина имени файла = размер указателя (4), потом в буфер размером 1 копируем 4 байта из имени (портим стек? или удачно попадаем в выравнивание?). Подобные баги часто и проявляются на другой ОС. Так и есть, современная NT версии 6 (10-ке назначили номер 10 на вырост), а ХР была 5, ее пора отправить на покой.
darkdevel, так в оригинале было, см. ссылку. Я тоже не особо понимаю , что значит WCHAR FileName[1]; Т.е имя файла с 1 символа чтоли, или (вероятнее) 1 указатель на имя.
С именем файла как раз все понятно: 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; не получится. А на каком этапе возникает ошибка и какая?
на ХР возникает на NtSetInformationFile (rename), - access_denied. Тут нюанс в том, что под отладчиком особо не отладишь - там не работает, т.к. видимо отладчик не дает открыть файл с правами DELETE. Я ставил DebugBreak после вызовов и подключался.
rmn, Indy_, вы бы хоть в взглянули на poc, о котором идет речь FILE_RENAME_INFO там объявлен в стеке (и этот момент надо исправить), а файл открывается с dwDesiredAccess == DELETE. M0rg0t, если ошибка access_denied, может попробовать открыть с полными правами? Во времена хр так было еще можно.
Пожалуйста. Я особо сам не тестил и не смотрел рос, но просто предположу, может, раз там идет речь о потоках, то имеется ввиду ntfs, а xp возможно установлена на fat. Просто ванганул, не разбираясь, так что не хейтите.
Rel, да не, вроде ntfs стоит. Ладно, это лирика все, поддержка хрюшки мне не нужна, просто решил посмотреть. Надо на других ОС тестить, пока есть мысли юзать это как антидебаг (но нужны тесты). к слову, похожая техника юзалась давным давно https://m.habr.com/ru/post/77818/ , но тут все таки концепт в разы интересней.