Я тут программку написал (на fasm'е), как ее теперь убить? Код (Text): ;================ MACRO DEFINITIONS ===================== ;High-level-like imported api calls macro. ;Lite version with procedure calls and string constants with "\n" support. macro IMPORTS [dll,funclist] { common data import forward dd 0,0,0,rva a#dll, rva v#dll common dd 0,0,0,0,0 end data forward v#dll: irp func,funclist \{ p\#func dd rva a\#func macro func [line*] \\{common match (arglist)tail,line* \\\{ push_r arglist \\\} call [p\#func] \\} \} dd 0 forward a#dll db `dll#".dll",0 irp func,funclist \{a\#func db 0,0,\`func,0\} } macro push_r [arg] { reverse if arg eqtype "" call @f local str str db arg,0 @@: fix_str str,$-str else pushd arg end if } macro fix_str pStr,nLen { repeat nLen-1 load w word from pStr+%-1 if w="\n" store word 0x0D0A at pStr+%-1 end if end repeat } ;********************* PROGPAM CODE ************************************************** format PE GUI 4.0 section 'AllInOne' code readable executable writeable IMPORTS KERNEL32,<CreateMutexA,WaitForSingleObject,CreateProcessA,ExitProcess,GetModuleFileNameA>,\ USER32,<MessageBoxA> entry $ CreateMutexA(0,1,"Mmmutexxx") WaitForSingleObject(eax,-1) GetModuleFileNameA(0,name,0x100) CreateProcessA(name,0, 0,0, 0,0, 0,0,_SI,_PI) MessageBoxA(0,"Close Me","Phoenix",0) ExitProcess(0) ;_____________________________________________ ;Uninitialized data. Must be at end of section name db 0x100 dup (?) _SI db 0x200 dup (?) _PI db 0x200 dup (?)
upd: заменил CreateProcessA("phoenix.exe"... на GetModuleFileNameA() ... upd2: убрал флаг нового консольного окна в CreateProcessA(... 0x00000010,...), осталось от его консольного предка, атавизм однако...
Итак в 1м посте была альфа версия, с очевидным багом - если ждущую копию убить в процесс эксплорере, активная копия закрывается без проблем. В следующей версии это было исправлено: Код (Text): ;================ MACRO DEFINITIONS ===================== ;High-level-like imported api calls macro. ;Lite version with procedure calls and string constants. macro IMPORTS [dll,funclist] { common data import forward dd 0,0,0,rva a#dll, rva v#dll common dd 0,0,0,0,0 end data forward v#dll: irp func,funclist \{ p\#func dd rva a\#func macro func [line*] \\{common match (arglist)tail,line* \\\{ push_r arglist \\\} call [p\#func] \\} \} dd 0 forward a#dll db `dll#".dll",0 irp func,funclist \{a\#func db 0,0,\`func,0\} } macro push_r [arg] { reverse if arg eqtype "" call @f db arg,0 @@: else pushd arg end if } ;********************* PROGPAM CODE ************************************************** format PE GUI 4.0 section 'AllInOne' code readable executable writeable IMPORTS KERNEL32,<CreateMutexA,WaitForSingleObject,CreateProcessA,ExitProcess,GetModuleFileNameA,CreateThread,OpenProcess,GetLastError>,\ USER32,<MessageBoxA> entry $ CreateMutexA(0,1,"Mmmutexxx") WaitForSingleObject(eax,-1) CreateThread(0,0,Raising,0,0,0) MessageBoxA(0,"Close Me","Phoenix",0) ExitProcess(0) ;===================== Raising: GetModuleFileNameA(0,name,0x100) Raise: CreateProcessA(name,0, 0,0, 0,0, 0,0,_SI,_PI) WaitForSingleObject([_PI.hProcess],-1) jmp Raise ;_____________________________________________ ;Uninitialized data. Must be at end of section name db 0x100 dup (?) _SI db 0x200 dup (?) struc PROCESS_INFORMATION { .hProcess dd ? .hThread dd ? .dwProcessId dd ? .dwThreadId dd ? } _PI PROCESS_INFORMATION
GoldFinch как ее теперь убить? Убей сибя ап стену! Ладно, это шутка Просто не сдержался, а использование тобой фасма очень интересное, можно сказать браво, за новые импорты (не стандартно), и за новые вызовы API. По поводу программы ничего сказать не могу, кроме разве что, переименования EXE.
ого! а я не знал что выполняющийся модуль можно переименовать =\ но его нельзя удалить, значит можно вместо GetModuleFileNameA искать себя в папке...
GoldFinch Старая песня. Его можно не только переименовать, но и переместить куда угодно в пределах логического диска. Так что поиска себя в папке недостаточно. К тому же неизвестно, что искать. Ну и как альтернативный способ: берём любой таск менеджер, позволяющий множественное завершение процессов. Ждущий поток просто не успеет запустить процесс повторно, т.к. не успеет получить управление. Бессмысленная затея. Aspire Слегка опоздал.
ну значит дампить образ памяти во временный файл и запускать "берём любой таск менеджер, позволяющий множественное завершение процессов" - это какой например?
Код (Text): include 'win32a.inc' ;================ MACRO DEFINITIONS ===================== ;High-level-like imported api calls macro. ;Lite version with procedure calls and string constants. macro IMPORTS [dll,funclist] { common data import forward dd 0,0,0,rva a#dll, rva v#dll common dd 0,0,0,0,0 end data forward v#dll: irp func,funclist \{ p\#func dd rva a\#func macro func [line*] \\{common match (arglist)tail,line* \\\{ push_r arglist \\\} call [p\#func] \\} \} dd 0 forward a#dll db `dll#".dll",0 irp func,funclist \{a\#func db 0,0,\`func,0\} } macro push_r [arg] { reverse if arg eqtype "" call @f db arg,0 @@: else pushd arg end if } ;********************* PROGPAM CODE ************************************************** format PE GUI 4.0 section 'AllInOne' code readable executable writeable IMPORTS KERNEL32,<CreateFileA, CreateMutexA,WaitForSingleObject,CreateProcessA,ExitProcess,GetModuleFileNameA,CreateThread,OpenProcess,GetLastError>,\ USER32,<MessageBoxA> entry $ GetModuleFileNameA(0,name,0x100) CreateFileA(name, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) CreateMutexA(0,1,"Mmmutexxx") WaitForSingleObject(eax,-1) CreateThread(0,0,Raise,0,0,0) MessageBoxA(0,"Close Me","Phoenix",0) ExitProcess(0) ;===================== Raise: CreateProcessA(name, 0, 0,0, 0,0, 0,0,_SI,_PI) WaitForSingleObject([_PI.hProcess],-1) jmp Raise ;_____________________________________________ ;Uninitialized data. Must be at end of section name db 0x100 dup (?) _SI db 0x200 dup (?) struc PROCESS_INFORMATION { .hProcess dd ? .hThread dd ? .dwProcessId dd ? .dwThreadId dd ? } _PI PROCESS_INFORMATION У?
GoldFinch Хотя бы даже ProcessExplorer от Sysinternals (Kill Process Tree). Да и самому написать - пять минут делов. И вообще: аттачусь Olly к обоим процессам и закрываю обе инстанси Olly. KeSqueer А что мне помешает закрыть этот хэндл?
KeSqueer, оно) Вобщем как я понимаю, без сторонних утилит такую штуку не убить?) Я кстате убиваю ее avz'ом запрещая запуск новых процессов.
GoldFinch Элементарно: taskkill /F /T /IM [имя процесса] Или taskkill - это типа тоже сторонняя утилита?
А все же метод неплох тем что прост и способен подействовать на подавляющее большинство пользователей. Шаблон феникса с полезной нагрузкой: Код (Text): ;================ MACRO DEFINITIONS ===================== ;High-level-like imported api calls macro. Very lite version. macro IMPORTS [dll,funclist] { forward dd 0,0,0,rva a#dll, rva v#dll common dd 0,0,0,0,0 forward v#dll: irp func,funclist \{ p\#func dd rva a\#func macro func [line*] \\{common match (arglist),line \\\{ irp arg,arglist \\\\{reverse pushd arg \\\\} \\\} call [p\#func] \\} \} dd 0 forward a#dll db `dll#".dll",0 irp func,funclist \{a\#func db 0,0,\`func,0\} } ;********************* PROGPAM CODE ************************************************** format PE GUI 4.0 section '.import' import readable writeable IMPORTS KERNEL32,< CreateFileA, CreateMutexA,WaitForSingleObject,CreateProcessA,\ ExitProcess,GetModuleFileNameA,CreateThread>,\ USER32,<MessageBoxA,wsprintfA> section '.code' code readable executable start: inc [dwCounter] wsprintfA(szMessageBuf,aReincarnation,[dwCounter]) MessageBoxA(0,szMessageBuf,aPhoenix,0) ExitProcess(0) ;------------------ aPhoenix db "Phoenix",0 aReincarnation db "Reincarnation #%d",0 section '.data' data readable writeable shareable dwCounter dd ? szMessageBuf db 0x100 dup (?) section '.phoenix' code readable executable writeable entry $ GetModuleFileNameA(0,name,0x100) CreateFileA(name, 0x80000000, 1, 0,3, 0x80, 0) CreateMutexA(0,1,aMmmutexxx) WaitForSingleObject(eax,-1) CreateThread(0,0,Raise,0,0,0) jmp start ;------------------ Raise: CreateProcessA(name, 0, 0,0, 0,0, 0,0,_SI,_PI) WaitForSingleObject([_PI.hProcess],-1) jmp Raise ;------------------ aMmmutexxx db "Mmmutexxx",0 ;_____________________________________________ name db 0x100 dup (?) _SI db 0x200 dup (?) struc PROCESS_INFORMATION { .hProcess dd ? .hThread dd ? .dwProcessId dd ? .dwThreadId dd ? } _PI PROCESS_INFORMATION
Вот еще вариант наркоманской проги Код (Text): int main(int argc, char* argv[]) { system(argv[0]); system(argv[0]); return 0; }