Есть сервисы которые при попытке их остановить вываливают ошибку 1052(типа сервис не поддерживает данную команду(SERVICE_STOPPED)).Как можно остановить такой сервис?
Сервис - это такой же процесс, но запущенный менеджером сервисов. Если убить все его потоки, то он сам и откинеться. Но это тема уже обсуждалась. И проблема решена Вашем покорным слугой! #include "stdafx.h" #include <tlhelp32.h> #include <winbase.h> #include <shellapi.h> DWORD GetProcess(LPSTR ExeName); bool SetDebugStatusForCurentProc(); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { SetDebugStatusForCurentProc(); HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,NULL); THREADENTRY32 th; th.dwSize=sizeof(THREADENTRY32); if (!Thread32First(hSnap,&th)) return 0; while (Thread32Next(hSnap,&th)) { if (th.th32OwnerProcessID==GetProcess("имя_сервиса.exe")) { BOOL d=PostThreadMessage(th.th32ThreadID,WM_QUIT,NULL,NULL); } } return 0; } DWORD GetProcess(LPSTR ExeName) { HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); PROCESSENTRY32 pe32; pe32.dwSize=sizeof(PROCESSENTRY32); if (Process32First(hSnap,&pe32)) while (Process32Next(hSnap,&pe32)) { if (!lstrcmp(ExeName,pe32.szExeFile)) return pe32.th32ProcessID; } return 0; } bool SetDebugStatusForCurentProc() { HANDLE hToken; LUID DebugValue; TOKEN_PRIVILEGES tkp; if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken)) { return false; } if (!LookupPrivilegeValue((LPSTR) NULL,SE_DEBUG_NAME,&DebugValue)) { return false; } tkp.PrivilegeCount = 1; tkp.Privileges[0].Luid = DebugValue; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(TOKEN_PRIVILEGES),(PTOKEN_PRIVILEGES) NULL,(PDWORD) NULL); if (GetLastError() != ERROR_SUCCESS) { return false; } return true; }
Может я чего то не догоняю, но привиденным выше исходником такой процесс не убить.В принципе как я понял его вообще невозможно прибить.
А ты попробуй с помощью Process Exporer by SysInternals убить все потоки процесса, тогда и поймешь можно его убить или нет. Но сервис Касперского, ранее неубиваемый, убивается
Вот это как раз нештатный способ убития любого(!) приложения, по крайней мере которое работает в ring 3.
Посмотри топик "Как противостоять TerminateProcess" от Апр 23, 2004, пост RobinFood: > А ты уверен, что он пытается убить отладчик с > помощью TerminateProcess? Вариантов куча - начиная > от CreateRemoteThread->ExitProcess, продолжая > SetWindowsHookEx->ExitProcess, и заканчивая > DebugActiveProcess->DebugSetProcessKillOnExit, > не говоря уже о всяких > SuspendThread/WriteProcessMemory/SetThreadContext...
Да, в каком-то смысле ты прав. Процесс "run time virus scan" - rtvscan.exe в пакете Norton Antivirus не хочет убиваться, ведь так? Но он убивается! Но даже после его убития остается такая штучка которая делает что-то типа хуков некоторых функций. Эта штучка и есть драйвер режима ядра - navap.sys и Navapel.sys. Хоть я и не написал ничего полезного, но у этой истории есть продолжение...
Спасибо VladimirZ. Убить сам процесс можно. Здесь вопрос такой как Выгрузить в RunTime драйвер режима ядра, написать свой драйвер ring 0
Да вообще интересно как стакими драйверами на уровне ялра работать.Bill_TPOC может доки какие есть интересные?
Bill_TPOC как Выгрузить в RunTime драйвер режима ядра, написать свой драйвер ring 0 думаю никак .. раз SoftICE неможет то и мы не в силах Даже если логически подумать - как можно выгрузить то что выполнятеться на самаом высоком уровне и имеет контроль над каким нибудь устройствои или он многоуровневый драйвер .. как виндовс узнает случиться ли что нибудь если этт драйвер выгрузить - а вдруг от этого выгрузится не только он но и еще штук 10 . например вдуг юзеру захочется с дуру выгрузить драйвер файловой системы... думаю вы представляете последствия
Помледствия представляю.Это кстати не для юзеров.Я уже понял что проблему надо решать по другому.Так сказать в другом разрезе.А на уровне ядра выгрузка чего-нибудь не гарантирует стаьильную работу системы, а это в первую очереть и требуется чтобы выгрузить и не чего не упало.Но как выяснилось это скорее всего не возможно.
если плохо выгружать, то мо_но приткнуть или вообще jump-ик в свой дривер..итд-итп.. тренируйте карроче извилины..
<font size=3>Прочитайте не слишком быстро...</font><!--size--> Что касается Norton Antivirus, то здесь есть одна возможность. Как правильно заметил linke проблему можно решать в другом разрезе. Процесс rtvscan.exe открывает udp-порт 2967 на локальном хосте. И этому не может помешать даже Agnitum Outpost. Из последнего предложения следует, что не rtvscan.exe открывает порт, а простите, как раз драйвер режима ядра. И через этот порт они общаются. Закрываем каким-либо образом порт и прыгаем от радости разнося заразу по всем органам компьютера. Они же должны как-то между собой связываться и чтобы не слишком напрягать извилины программеры из Symantec не стали сканировать например, таблицу процессов в операционной системе(как это провильно называется Вы узнаете в книге Руссиновича, а это мой слэнг). Просто решили использовать известные и что самой хорошее, документированные средства. Вот программеры поленились, и скоро вот на этом самом форуме Васма появиться сообщение - как полностью отключить Norton Antivirus в реальном времени и с помощью какого-то, казалось бы безправного приложения ring 3. Вот здесь как раз задевается вопрос о поиске уязвимостей в программах. Что бы этим хорошо владеть надо в тонкостях разбираться в деталях реализации конкретной операционной системы. Вот Руссинович я думая далеко бы пошел в этом направлении. С уважением, Bill/TPOC