Завершение процесса по пути
Столкнулся с проблемой, в процессах два одноименных процесса один из них нужно убить не убивая второй, PID у этих процессов на разных ПК соответственно разный а путь один и тот же. Подскажите методы если кто знает.
Спасибо.
Если нет и вас устраивает просто завершить его тогда нужно перечислять процессы и в это время сравнивать название процесса и путь. Потом завершить его.
Там писали про недокументированные функции, я пока таких не знаю. Хотя и документированные работают удовлетворительно, я делал в таймере перебор процессов время было 1 милисекунда и тормозов из за этого особых не заметил.
procedure TForm1.Button1Click(Sender: TObject);
var
ProcessEntry: ProcessEntry32;
NextProcess: BOOL;
SnapProcess: CARDINAL;
Path: WIDECHAR;
begin
SnapProcess := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
ProcessEntry.dwSize := SizeOf(ProcessEntry);
NextProcess := Process32First(SnapProcess, ProcessEntry);
while NextProcess do
begin
if ProcessEntry.szExeFile = 'lsass.exe' then
begin
HProcess := OpenProcess(PROCESS_ALL_ACCESS, TRUE, ProcessEntry.th32ProcessID);
GetModuleFileNameEx(HProcess, 0, @Path, укажите размер чтоб принять всю строку);
if Path = 'ВАШ ПУТЬ К ЗЛОВРЕДНОМУ ВИРУСУ' then TerminateProcess(HProcess, тут почитайте нужно чё или 0 сойдёт);
CloseHandle(HProcess);
end;
NextProcess := Process32Next(SnapProcess, ProcessEntry);
end;
CloseHandle(SnapProcess);
end;
Сравнивать размеры не обязательно, он и так идентифицируется достаточно точно в вашей ситуации.
У себя проверил, lsass.exe пока слава богу один :)
Финальная версия, пытался оптимизмровать, и загнался. Вызывал GetModuleFileNameEx до того как получен HProcess
Но как ты отличишь один процесс от другого, даже зная id?
Почему бы просто не удалить вирус из системы?
Но как ты отличишь один процесс от другого, даже зная id?
ну так они же отличаются путем к exe-файлу? я честно говоря возможно не совсем понял в чем проблема?
Хотя ТС отличается упорством в поиске веревок достаточной длинны, что бы можно было выстрелить себе в голову. Почему просто не удалить вирус действительно?
Расписывай подробнее—ты ведь как-то определяешь,какой из процессов надо прибить.Может,я даже что-нибудь напишу для автоматизации
P.S.Это ж надо умудриться—заразить 40 распределённых групп машин одной и той же фигнёй…
Ну если вы настаиваете, тогда перечислите все процессы. Я использовал для этих целей тулхелр32, и код выкладывать не буду, т.к. вам это легче будет сделать через пс апи.
А потом в цикле проверить пути функцией GetModuleFileNameEx. Совпал путь с вашим, вызываем TerminateProcess.
Хотя по моему это кривой путь.
Вам бы лучше не с путями разбираться, а как там автостарт организован.
А вообще лучше попытаться удалить.
Вот, создать бы сигнатурку доверенных файлов, хэш там какой, а потом, при старте системы, проверять некоторые пути по базе хэшей, смотреть совпадение имён файлов и проверять хэш, вот. И, если хэши не совпали, то помечать подозрительный файл для удаления после перезагрузки и предлагать юзеру сохранить все изменения, а потом ребутнуть машину, ну или какие другие продвинутые способы удаления файлов использовать.
Вам бы лучше не с путями разбираться, а как там автостарт организован.
А толку? Большинство вирусни мониторят свои методы загрузки и восстанавливают их при малейшем чихе.
А вообще лучше попытаться удалить.
КЭП епт! Чтоб удалить нужно прибить процесс сначала.[/quote]
Подождите, чтоб мониторить нужно загрузиться сначала,.Я и имел в виду разобраться какие ещё процессы с этим связанны(возможно скрытые), и чтоб предотвратить запуск любого элемента в составе этого вируса.
А этот путь же написал что считаю кривым, я знаю что завершение этого процесса может ничего не дать, он может снова запуститься.
А удалить я имею в виду не только ехе который связан с процёссом, а всё что связанно с вирусом. Антивырусом каким
Особенно интересно увидеть коментарий автора вопроса, если это он.
Ответ не является ответом на этот вопрос?
Особенно интересно увидеть коментарий автора вопроса, если это он.
Ответ не является ответом на этот вопрос?
Нет минус не я ставил, по идее я считаю придется перебрать все процессы чтобы найти наш, затем сравнить их пути на предмет соответствия с указанным заранее( поскольку он одинаков на всех зараженных машинах). После чего можно удалить файл, и прописать в локальных групповых политиках запрет запуска exe файла по этому пути. Копаться и искать в реестре где он там прописался для автозапуска нет смысла скорее всего тело вируса запускает другое приложение. самое главное в ИТ это устранить симптомы)))).. торможение и черные cmdшные окна. можно конечно еще и размеры exeшника сравнить, размер сисемного то известен... хотя хз..
Кто плюс поставил? Разбираться будем :)
Жалко не прокоментировали, может научили бы чему. Может я и знаю мало, но полезные знания получить всегда рад.
В той части кода где открывается процесс когда будете переделывать на си организуйте проверку, действительно ли хендл его получен.
Возможно этого будет достаточно в вашей ситуации, напишите потом получилось чё или нет.
Но факт остаётся фактом. Например вот такие чудеса можно найти в интернете:
var
HToken, ReturnLength: CARDINAL;
SeDebugNameValue: Int64;
TkP: TOKEN_PRIVILEGES;
begin
Result := FALSE;
//Получаем токен нашего процесса
OpenProcessToken(INVALID_HANDLE_VALUE, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, HToken);
//Получаем LUID привилегии
if not LookupPrivilegeValue(NIL,'SeDebugPrivilege', SeDebugNameValue) then
begin
CloseHandle(HToken);
Exit;
end;
TkP.PrivilegeCount := 1;
TkP.Privileges[0].Luid := SeDebugNameValue;
TkP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
//Добавляем привилегию к процессу
AdjustTokenPrivileges(HToken, FALSE, TkP, SizeOf(TOKEN_PRIVILEGES), TkP, ReturnLength);
if GetLastError() <> ERROR_SUCCESS then Exit;
Result := TRUE;
end;
Я уверен в арсенале вирусописателей много всяких интересных фенек.
Так что ничему не удивляйтесь.
Проблем не будет, процесс будeт убит если путь который вы укажите совпадёт.
Я имел в виду прописать что если HProcess <> 0 тогда дальше выполняем.
Если 0, то процесс соответственно не убъётся и нужно чтото посерьёзней придумать.
И да,в Windows линейки NT есть одна такая замечательная особенность—запущенный файл можно просто взять и переместить/переименовать(с некоторыми ограничениями,но всё же).Так от немалого числа вирусни и избавляются
так что это будет бесконечным перетягиванием каната .