· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Удалить самого себя (экзешник)

. 1 . 2 . >>

Посл.отвђт Сообщен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.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.065