Уважаемые Дзенствующие! Проконсультируйте по вот какому вопросу Как правильно убивать процесс? Я делаю, как и в нескольких примерах/туториалах/вирусах вот так: Код (Text): invoke OpenProcess, PROCESS_TERMINATE, 1, ID .IF eax push eax invoke TerminateProcess, eax, 0 call CloseHandle .ENDIF Процесс это конечно, вырубает. Но динамические библиотеки, которыми он пользовался, остаются занятыми, и их нельзя удалить (а мне как раз это надо сделать). В MSDN, собственно, так и говорится о функции TerminateProcess - мол, поведение используемых библиотек непредсказуемо. Тогда как же корректно удалять? ведь Task Manager как-то это делает корректно.... Поделитесь информацией, если кто знает. Спасибо
Ты все правильно написал по части кода. Но ты уверен что те библиотеки использует только убиенный процесс??? Скорее всего, их использует кто-то еще, ибо после убития процесса все открытые им хэндлы, в т.ч. и библиотеки, освобождаются (читай закрываются)!
Я уверен, что больше эту библиотеку ничего не использует. Во-первых, при обрубании процесса через диспетчер все проходит нормально Во-вторых, эту библиотеку получается расшарить простым LoadLibrary/FreeLibrary но на это уходит секунд 10-20, поэтому это не может служить рабочим вариантом В-третьих, вот, собственно, фрагмент MSDN, прямо говорящий о некорректности того что я делаю: Код (Text): The TerminateProcess function is used to unconditionally cause a process to exit. Use it only in extreme circumstances. The state of global data maintained by dynamic-link libraries (DLLs) may be compromised if TerminateProcess is used rather than ExitProcess. Можно ли процесс как-то ЗАВЕРШИТЬ, а не останавливать?
Тогда открываешь процесс на запись, выделяешь в нем память (VirtualAllocEx), копируешь туда код (WriteProcessMemory), который вызовет ExitProcess, и создаешь удаленный тред (CreateRemoteThread)
Попробовал вот так: Код (Text): KillProcess proc ID: DWORD LOCAL procHandle:HANDLE LOCAL procThread:HANDLE LOCAL fnExitProcess:DWORD LOCAL hKernel:HMODULE invoke OpenProcess, PROCESS_ALL_ACCESS, 0, ID .IF eax mov procHandle, eax .IF procHandle != INVALID_HANDLE_VALUE invoke GetModuleHandle, addr lpKernel mov hKernel, eax invoke GetProcAddress, hKernel, addr lpExitProcess .IF eax mov fnExitProcess, eax invoke CreateRemoteThread, procHandle, NULL, 0, fnExitProcess, 0, 0, NULL .IF eax mov procThread,eax invoke WaitForSingleObject, procThread, INFINITE invoke CloseHandle, procThread .ENDIF .ENDIF invoke CloseHandle, procHandle .ENDIF .ENDIF ret KillProcess endp но эффект не изменился...
дык ты ж адрес ExitProcess ищешь в своем адресном пространстве! тебе нужен адрес это апишки в искомом процессе! Если так действовать, то тебе надо будет читать и обрабатывать таблицу импорта и в ней искать эту функцию. Так таскменеджер явно не делает
Пиши так, как я говорил в ответе #6. Внутрь закрываемого процесса пиши такой код: Код (Text): push 07E9FAD36h; это число - хэш строки "ExitProcess" call GetAPI push 0 call eax GetAPI proc FHash:DWORD LOCAL VAOrdinalTable: DWORD LOCAL VANameTable: DWORD LOCAL VAAddressTable: DWORD ;Поиск таблиц имен, ординалов и адресов pushad assume fs:nothing mov eax,fs:[030h] ;eax => pointer to PEB mov eax,[eax+0Ch] ;eax => pointer to PEB_LDR_DATA mov eax,[eax+0Ch] ;eax => pointer to LDR_MODULE mov eax,[eax] ;ntdll LDR_MODULE mov eax,[eax] ;kernel LDR_MODULE mov eax,[eax+18h] ;kernel image base mov ebx,eax add eax,[eax+3Ch] mov eax,[eax+78h] add eax,ebx lea esi,[eax+1Ch] lea edi,VAAddressTable mov ecx,3 next_table: lodsd add eax,ebx stosd loop next_table ;Поиск адресов функций в таблице экспорта mov esi,VANameTable mov edx,-1 next_func: inc edx lodsd get_hash: pushad lea esi,[eax+ebx] ;функция получения хэша из строки xor ebx,ebx ;esi - указатель на строку xor edx,edx imul eax,edx,5 @@: ror eax,7 inc edx ror edx,7 add eax,edx xor ebx,eax lodsb test al,al jnz @B ;конец функции получения хэша; хэш в ebx mov [esp+7*4],ebx popad cmp FHash,eax jz hash_ok jmp next_func ;Получение и сохранение адреса функции hash_ok: shl edx,1 add edx,VAOrdinalTable movzx eax,word ptr [edx] shl eax,2 add eax,VAAddressTable mov eax,[eax] add eax,ebx mov [esp+7*4],eax popad ret GetAPI endp Извини, влом тестировать код. Посмотри, вроде бы должен работать
1) шо такое ньюбовский вопрос? 2) зачем тебе db? вставляй прямо в код. 3) если уж на то пошло, скомпилируй этот код и сделай его дамп. А для перевода файла в формат db (если я правильно понимаю, что это такое) есть спец. утилита в пакете масма. Ну или аттач смотри - там через ком. строку работает (просто укажи в ком. строке имя файла).
1) ньюбовский вопрос - это когда человек новичек. 2) а ведь действительно... 3) в db я умею переводить из бинарника, а не из исходника напрямую... код компилируется теперь осталось выжать из тебя код от VirtualAllocEx до CreateRemoteThread
Код (Text): invoke VirtualAllocEx,hProc,0,loader_size,MEM_COMMIT,PAGE_EXECUTE_READWRITE mov edi,eax test eax,eax jz _err invoke WriteProcessMemory,hProc,edi,offset code_to_insert,code_size,0 ;запись кода test eax,eax jz _err
реализовать этот вариант получилось. откомпилировать то есть. процесс умирает. но библиотека по-прежнему не расшаривается... уж готов подумать, что процесс/библиотека какие-то неправильные, но ведь как-то же их зараза диспетчер удаляет...
Значит так совпали звезды Как вариант, попробуй для них в этом же коде делать FreeLibrary. Или вааще юзай ZwDeleteFile - позволяет удалять даже занятые файлы. Или нет?
Таскманагер делает так: Проверяет системный ли процесс, если да то выходит. Выводит диалог пдотверждения. Проверяет процесс для VDM? Если да то VDMTerminateTaskWOW и exit. Ставит себе привелегию "SeDebugPrivilege". Открывает процесс с флагом PROCESS_TERMINATE. Терминирует его с dwExitCode == 1. Закрывает хендлы, освобождает ресурсы. Всё. По крайне мере так у меня в WinXP SP2.
из-зп чего вообще это все? из-за того, что dllки не сразу выгружаются? они и не должны сразу, где-то в реестре есть параметр, управляющий их выгрузкой из оперативки (в смысле, отмапливанием секции)