|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Окт 9, 2003 19:28:55 Тема давно обсасывалась тут, и есть несколько вариантов самоудаления - самый простой - через батник, который в цикле пытается экзешник и себя удалить. А теперь усложняем задачу - кто-нибудь пробовал удалить самого себя во время работы ( чтоб процесс висел, но экзешника небыло ) - необходимо для того, чтоб экзешник был удален с компа если вырубят свет во время работы оного. Я раскопал несколько вариантов: 1) флаги Run from swap - не помогает. Он все равно не позволяет удалить файл во время существования процесса ( ни если это запущено с нетворка ни если это запущено с removable device) 2) использовать Pending File rename operations - (ака MoveFileEx) в общем-то идея неплоха, но имеет большущий минус - на НТ-системах нужны права администратора. 3)использовать инжектирование в чужой процесс. Наверное самый правильный вариант из тех, что мне пришли в голову на данный момент. Но он имеет один недостаток - код писан на С, и поэтому нужно для него ещё распаковщик писать, либо PIC-код писать, а это на С уже не получится. Может быть у уважаемых посетителей форума есть идеи насчет манипуляции API-ми чтоб удалить все-таки самого себя? |
|
|
Дата: Окт 9, 2003 21:02:08 У меня похожая задача, только надо не удалить самого себя, а дописать себе чего-нибудь в середину (чтоб конфиги не плодить, храню все данные прямо внутри). |
|
|
Дата: Окт 9, 2003 23:28:20 дык... а эта самое - BeginUpdateResource не спасает? |
|
|
Дата: Окт 10, 2003 04:13:29 где-то в английских сайтах посвещенных асму видел такой прием под Win9x: CloseHandle на самого себя, а потом делать с собой что угодно... под WinNT: чего-то там и потом опять CloseHandle.... сам не пробовал, но люди знающие писали.... поищи... если не найдешь - могу у себя дома посмотреть, где-то лежало... |
|
|
Дата: Окт 10, 2003 04:41:35 |
|
|
Дата: Окт 10, 2003 17:25:48 zalexf - CloseHandle на что конкретно? CloseHandle(GetCurrentProcess());?? Дело в том , что на ХР как раз я вообще не нашел в области процесса ни секций экзещника ни файлов ничего. Похоже это в дебри ядра вынесено. |
|
|
Дата: Окт 10, 2003 17:59:06 rst Для файла создается объект "секция" на строне ядра. Секции PE-файла описываются структурами SUBSECTION, идущими после CONTOL_AREA. Я немного упоминаю об этом в статье, Four-F разбирается в этом лучше, чем я. |
|
|
Дата: Окт 10, 2003 18:17:58 volodya - и естественно закрыть его из юзермода никак. правильно? |
|
|
Дата: Окт 10, 2003 18:36:13 Здравствуйте ! Да, тема действительно обсуждалась не раз. На сегодняшний день существует несколько достаточно изящных способов решения этой задачи, предложенных различными авторами (J.Richter, G.Nebbett и др.) . Ниже приведу пример, который я написал, руководствуясь этими способами. Работоспособность этой программки была проверена мной на Windows 98, 2000, Millenium, XP. ---------------------------------------------------------- .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\shell32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\shell32.lib .data szComspec db "Comspec",0 szAction db "Open",0 szDelete_Head db "/c del ",0 szDelete_Tail db " > nul",0 szComspec_Path db MAX_PATH dup (0) szParameters db MAX_PATH dup (0) szModuleName db MAX_PATH dup (0) dwExitCode dd 0 ShellExecuteInfo SHELLEXECUTEINFO <0> .code Begin: ; ; Firstly, make a string like this : '/c del FULL_NAME_OF_SELFDEL.EXE > nul' ; mov esi, offset szParameters invoke lstrcpy, esi, addr szDelete_Head invoke GetModuleFileName, NULL, addr szModuleName, sizeof szModuleName add esi, sizeof szDelete_Head-1 invoke GetShortPathName, addr szModuleName, esi, MAX_PATH-sizeof szDelete_Head invoke lstrcat, addr szParameters, addr szDelete_Tail invoke GetEnvironmentVariable, addr szComspec, addr szComspec_Path, sizeof szComspec_Path ; ; Secondly, fill the structure SHELLEXECUTEINFO ; mov [ShellExecuteInfo.cbSize], sizeof ShellExecuteInfo mov [ShellExecuteInfo.fMask], SEE_MASK_NOCLOSEPROCESS mov [ShellExecuteInfo.hwnd], NULL mov [ShellExecuteInfo.lpVerb], offset szAction mov [ShellExecuteInfo.lpFile], offset szComspec_Path mov [ShellExecuteInfo.lpParameters], offset szParameters invoke ShellExecuteEx, addr ShellExecuteInfo test eax, eax jz Game_Over ; ; Finally, several operations with Process and Thread priority ; mov eax, [ShellExecuteInfo.hProcess] invoke SetPriorityClass, eax, IDLE_PRIORITY_CLASS invoke GetCurrentProcess invoke SetPriorityClass, eax, HIGH_PRIORITY_CLASS invoke GetCurrentThread invoke SetThreadPriority, eax, THREAD_BASE_PRIORITY_MAX mov eax, [ShellExecuteInfo.hProcess] invoke GetExitCodeProcess, eax, addr dwExitCode test eax, eax jz Game_Over cmp dwExitCode, STILL_ACTIVE jnz Game_Over invoke SHChangeNotify, SHCNE_DELETE, SHCNF_PATHA, addr szModuleName, NULL Game_Over: invoke ExitProcess, NULL end Begin |
|
|
Дата: Окт 10, 2003 18:41:55 rst ну, почему же... Есть последовательность NtCreateSection NtClose - которая вполне грохнет это все дело... Словом, тема забавная, только времени нет ковырять... Кроме того, еще ShellExecuteEx-решение было только что предложено :) Необычный подход. |
|
|
Дата: Окт 10, 2003 19:08:48 VetabetA, насколько я понял - создается cmd.exe который пытается постоянно удалить файл. т.е. что-то типа : :1 del file.exe if EXISTS file.exe goto 1 del %0 Это не поможет в случае если ты во время работы проги вырубишь комп. Т.к. файл удалится только после заверщения процесса. Volodya - нихрена не верю. т.к. NTCreateSection будет оперировать хэндлами процесса, а NTClose закроет хэндл процесса. А если секция в ядре открывается - то хэндлы будут принадлежать ядру, и таблица хэндлов ядра не пересекается с таблицой хэндлов процесса. Поправь меня если я не прав. |
|
|
Дата: Окт 10, 2003 23:37:11 · Поправил: volodya Ты не прав. Надо просто закрыть хендл файла и хендл секции. Никаких Unmap* нам не надо! |
|
|
Дата: Окт 10, 2003 23:40:41 · Поправил: volodya Дело в том , что на ХР как раз я вообще не нашел в области процесса ни секций экзещника ни файлов ничего Слушай, мы не туда уходим. Читай: [url=http://www.catch22.org.uk/tuts/selfdel.asp ]http://www.catch22.org.uk/tuts/selfdel.asp [/url] После того как прочел - знай, мы можем скатить это к нативному приложению - т.е. использовать ntdll напрямую. Без вызова WinAPI. |
|
|
Дата: Окт 10, 2003 23:45:35 Дело в том , что на ХР как раз я вообще не нашел в области процесса ни секций экзещника ни файлов ничего Еще раз на бис. Область процесса - я не понимаю термина. Если ты говоришь о PEB/TEB/TIB - то их никто никуда не прятал, только многое ты через них с файлом не сделашь. Можно как антиотладку использовать, что я описываю, но не более. Файл ты так не удалишь, насколько я себе думаю. Секции экзешника. Тоже не понятно. Что значит - не нашел? Это вообще бред - они проецируются на юзерное пространство выше ImageBase, если ты не знал :))))) А если ты говоришь о структурах, которые описывают секции экзешника - то такие есть и в кольце 0 и в кольце 3. Для кольца-0 - это SUBSECTION, которая описывает файл на уровне PTE, а для кольца -3 - это LDR_DATA_TABLE_ENTRY. |
|
|
Дата: Окт 11, 2003 01:04:53 Господа, по урлу присланому - вроде все понятно, но одно НО. - нужно чтоб процесс крутился, а экзешника уже небыло. По поводу SelfDelete - там во всех случаях происходит Delete On Exit. Дело в том, что нужно - Delete After Start, and continue run. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.065 |