На сайте catch22.net представлена интересная техника самозатирающегося экзешника. Код (Text): .586 .MODEL FLAT,STDCALL includelib kernel32.lib extrn _imp__ExitProcess@4:DWORD extrn _imp__GetModuleHandleA@4:DWORD extrn _imp__FreeLibrary@4:DWORD extrn _imp__GetModuleFileNameA@12:DWORD extrn _imp__DeleteFileA@4:DWORD MAX_PATH EQU 260 .CODE start: xor ebx,ebx ;;zero sub esp,MAX_PATH mov ebp,esp ;;lpFileName push ebx call _imp__GetModuleHandleA@4 mov esi,eax ;;module handle push MAX_PATH push ebp ;;lpFileName push esi ;;module handle call _imp__GetModuleFileNameA@12 push ebx ;;zero push ebx ;;just a dummy return location push ebp ;;lpFileName push _imp__ExitProcess@4 ;;return address push esi ;;module handle push _imp__DeleteFileA@4 ;;return address push _imp__FreeLibrary@4 ;;return address ret END start примерно так выглядет. Так вот вопрос такой - точнее несколько: 1) часто ли вы встречали такую технику вызовов функций? 2) почему стэк живёт дольше самого процесса - код исполняется в стэке процесса, а процесса уже нема...
ret делает mov eip,[esp] Т.к. в [esp] содержится адрес FreeLibrary, то ret просто начинает выполнять FreeLibrary. Можно заменить 2 последние строчки на jmp _imp__FreeLibrary@4 и от этого ничего не изменится. FreeLibrary снимет лок с файла экзешника (почему это происходит - особенность загрузчика NT). После окончания выполнения этой функции (там ведь тоже будет ret), аналогично, управление получает DeleteFile, потом - ExitProcess.
QuantumСуть происходящих процессов то я усвоил (комменты моих рук дело) просто весь код исполняется либо в ядре либо на стэке, но когда процесс уже анмаплен да выгружен - стэк то живёт (цветёт и пахнет!?!
Ни на каком стеке код не выполняется В ядре - тем более. Вообще, процесс прибивается через ExitProcess, который выполняется ПОСЛЕ стирания файла. FreeLibrary ничего не выгружает, т.к. хендл процесса всё ещё используется... самим процессом.
Не ну конечно говорил про АПИшки выполняющиеся в ядре да про стек на котором всё забито заранее, так что нет возврата в секцию кода после RET, но код исполняется хоть и не в секции кода. А про совместимость - на сайте который указал есть и под ХР код.
я чаще юзаю технику инжекта в csrss.exe процесс и удаление своего экзешника через него. вполне устраивает и работает во всех NT системах.
d4rkeagle С правами админа наверное только? Простейшая техника - создавать батник с командами удаления, и отдавать его cmd...