Форум: "WinAPI";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];
ВнизКритическая служба Найти похожие ветки
← →
Alex870 (2005-10-03 10:46) [0]Здравствуйте!
Подскажите пожалуста, как сделать, чтобы процесс моей службы невозможно было завершить (например как csrss.exe, а ещё лучше как system или хотябы как касперского). Следящий процесс не подходит, так как работа службы не дожна прерываться. Зарание спасибо.
← →
BiN © (2005-10-03 11:01) [1]Это троян?
← →
Alex870 (2005-10-03 11:55) [2]Абсолютно нет!
Просто борюсь с хитрыми подчиненными, которые вместо работы играют. Мозгов у них хватает, только вот не туда направлены. А служба просто закрывает неразрешенные процессы. И еще они должны работать с админскими правами.
← →
BiN © (2005-10-03 12:03) [3]Эта проблема обсуждалась уже много раз.
Или права урезай или решай организационно-репрессивными методами.
← →
Игорь Шевченко © (2005-10-03 12:17) [4]
> И еще они должны работать с админскими правами
Нафига ?
← →
Alex870 (2005-10-03 12:32) [5]Но ведь Касперский как-то это сделал, хотя его процесс я пробовал (удачно) закрывать, открыв его в DEBUG моде. Еще что-то слышал про winlogon authentication...
← →
Alex870 (2005-10-03 12:32) [6]
> Нафига ?
Они сисадмины
← →
Игорь Шевченко © (2005-10-03 12:37) [7]Alex870 (03.10.05 12:32) [6]
Против сисадминов приемов нет - не мучайся. Как с простыми пользователями бороться - тебя уже научили в [3]
← →
xShadow © (2005-10-03 12:40) [8]Касперский много чего делает. В частности можно OpenProcess перехватить.
← →
Alex870 (2005-10-03 12:40) [9]
> > Нафига ?
>
> Они сисадмины
Т.е. на своем компе они пусть играют сколько угодно, но они играют по сети с операторами, которым нужно работать. Службу написал я, но так как они сисадмина, а ведь может чего и слететь у операторов, я сделал возможность её останавливать из под "Админа", ну вот они и останавливают. А вот для этого я хочу написать другую службу, которая бы фиксировала остановки первой и не позволяла себя завершать, пусть потом отчитываются для чего они на 2 часа останавливали её.
← →
Игорь Шевченко © (2005-10-03 12:42) [10]Alex870 (03.10.05 12:40) [9]
Пиши в EventLog, анализируй его потом, ничего дополнительного тебе не нужно
← →
Alex870 (2005-10-03 12:44) [11]На счет перехвата OpenProcess - мысль хорошая. С перехватом API функций я разобрался (гемор правда), да и ещё знать надо с помощью каких функций может происходить завершение процесса (я имею в виду полный список).
← →
Alex870 (2005-10-03 12:54) [12]
> Пиши в EventLog, анализируй его потом, ничего дополнительного
> тебе не нужно
Вы имеете в виду EventLog service (т.е. Windows event). Если не трудно немного по подробнее.
← →
xShadow © (2005-10-03 12:56) [13]При таком раскладе... Игорь Шевченко дело говорит, всё не перехватишь.
← →
Alex870 (2005-10-03 13:32) [14]
> При таком раскладе... Игорь Шевченко дело говорит, всё не
> перехватишь.
А я и не говорю, что мне всё перехватывать надо, а вот уважаемый Игорь Шевченко кажется знает решение конкретно моей задачи, но вот пока молчит с подробностями...
← →
alexbou (2005-10-03 18:30) [15]обычный "Просмотр событий" + настройка полиси безопасности (ведение всех событий безопасности (в том числе и запуск процессов))
Если же они захотят потереть - то это не скроешь - пуская они объясняют зачем терли
← →
alpet © (2005-10-04 14:25) [16]Любопытно, а они еще не догадались переименовывать процессы, или даже запускать их (в случае малой ресурсоемкости) под VMWare. Имхо самое просто - написать процесс который подключается как отладчик к процессу winlogon, после чего его принудительное завершение приведет к сбою в системе. Но даже в этом случае можно будет банально приостановить его потоки (дабы "висел", но не ничем зловредным не занимался). Так что в целом тебе правильную мысль внушают - урезать надо у пользователей права так или иначе.
← →
Alex870 (2005-10-04 14:45) [17]
> alpet ©
Мысли очень правелные! Я уже над этим задумался и написал библиотеку, которая подключается ко всем процессам в системе (в т.ч. и winlogon). Ограничения на запуск процессов я настроил в реестре, но в этом случае они именно и начали переименовывать, а мой код получает список процессов, сравнивает с файлом политик, где прописаны пути к программам, их имена и размер, так что переименование не удастся. VMWare не актуально из-за специфики работы (подробно объяснять не буду) они ведь еще и работать должны.
В общем все работает, и остановить практически нереально (из серии "проще купить чем сломать"). Вот только есть еще одна маленькая проблема: Так как библиотека подключена ко всем процессам, а в ней работает таймер, события таймера вызываются сразу несколькими процессами, как реакция на одно событие и я пока не знаю, как сделать так, чтобы если один процесс среагировал, то реакция всех остальных процессов игнорировалась. Я думаю такая тема для Вас будет поинтереснее.
← →
Digitman © (2005-10-04 14:53) [18]
> библиотека подключена ко всем процессам, а в ней работает
> таймер, события таймера вызываются сразу несколькими процессами,
> как реакция на одно событие и я пока не знаю, как сделать
> так, чтобы если один процесс среагировал, то реакция всех
> остальных процессов игнорировалась
галиматья какая-то ...
особенно
> события таймера вызываются сразу несколькими процессами
..
"события .. вызываются .. процессами" - полный бред ...
← →
Alex870 (2005-10-04 15:04) [19]
> Digitman ©
Ну может я неверно выразился, я прописал свою библиотеку в InitAppDLLs в реестр, а следовательно все запущенные процессы проецируют её в свое адресное пространство. При инициализации библиотека запускает таймер, по которому проверяет список процессов, но т.к. инициализируется она во всех процессах, таймеров тоже получается несколько, и они все работают параллельно, т.е. если в процедуре таймера произошло опр. событие, а таких процедур несколько, то и реакций на одно и тоже событие несколько (столько сколько процессов, к которым подключилась моя библиотека).
А вот на счет полного бреда это Вы погорячились неразобравшись (невнимательно читая)
← →
Игорь Шевченко © (2005-10-04 16:06) [20]Странно это все. В EventLog не судьба писать, аудит не судьба включить, обязательно хочется удалять гланды нетрадиционным способом.
← →
Alex870 (2005-10-04 16:11) [21]Для тех кто до сих пор не понял привожу примерный код:
library MyLib;
uses
Windows;
procedure TimerFunc(HWND: Cardinal;msg: tagMSG;idEvent,SysTime: cardinal);
var
Error : DWORD;
begin
Error := GetLastError();
//Анализ исполняемых процессов, если процесс не разрешен убивать
//код не сложный, но длинный
SetLastError(Error);
end;
procedure _Run;
begin
T := SetTimer(0,0,500,@TimerFunc);
end;
begin
_Run;
end.
После этого библиотека прописывается в InitAppDLLs и всё
← →
Alex870 (2005-10-04 16:14) [22]
> Игорь Шевченко ©
Предыдущий пост относится не к Вам, просто пока я писал вы послали свой.
> В EventLog не судьба писать, аудит не судьба включить
Вы к сожалению не ответили мне о подробностях этих приемов
← →
Digitman © (2005-10-04 16:20) [23]
> Alex870 (04.10.05 15:04) [19]
> на счет полного бреда это Вы погорячились неразобравшись
> (невнимательно читая)
да и нечего там "читать" даже !
"события .. вызываются .. процессами" - цитата из ТВОЕЙ фразы ? не возражаешь, надеюсь ?
вот она и есть бред.
а по сабжу в целом - ерундистикой ты занялся, со своими "таймерами" и "внедрениями".
достаточно будет написать и инсталлировать драйвер режима ядра, следящий за стартом процессов и уничтожающий нежелательные процессы уже на этом этапе.
← →
Игорь Шевченко © (2005-10-04 16:32) [24]
> Вы к сожалению не ответили мне о подробностях этих приемов
К счастью, кроме меня еще существуют такие службы, как Яндекс и Google.
Я к тому, что достаточно указать нужное направление, а дальнейшие действия остаются свободой автора вопроса.
Извини, но консультировать в подробностях или решать чужую проблему у меня нет ни времени ни желания.
← →
Alex870 (2005-10-04 16:33) [25]
> да и нечего там "читать" даже !
>
> "события .. вызываются .. процессами" - цитата из ТВОЕЙ
> фразы ? не возражаешь, надеюсь ?
Не возражаю, но она кастрирована. На самом деле было написано:
Так как библиотека подключена ко всем процессам, а в ней работает таймер, события таймера вызываются сразу несколькими процессами...
И это бредом я не считаю (см. приведенный код).
А вот на счет драйвера режима ядра скажу следующее: тут уже такие вещи обсуждались, написание их достаточно сложное (игра не стоит свечь). Так что говорить: достаточно будет написать и инсталлировать драйвер режима ядра это может мне кернел переписать посоветуете ради такой задачи, а совет близок к этому.
← →
Alex870 (2005-10-04 16:37) [26]
> Игорь Шевченко ©
> Извини, но консультировать в подробностях или решать чужую
> проблему у меня нет ни времени ни желания.
Извиняюсь погорячился. Попробую чего нибудь поковырять в этом направлении, всеже спасибо за ответ. Просто моя задача похоже привратилась в академическую пока решал узнал много нового про API.
← →
Digitman © (2005-10-04 16:42) [27]
> Alex870 (04.10.05 16:33) [25]
> она кастрирована
Да, кастрирована..
После чего осталась ее суть, заключающаяся в галиматье вида "события вызываются процессами" ... что как было галиматьей, так ей и останется, ВНЕ зависимости от "кастрирования" чего-то там.
Прежде чем излагать мысль - думаем головой, сверяемся со справочниками, терминологией и т.д. и.т.п. .. вопрос-то - далеко за пределами "батонокидательства" ..
> тут уже такие вещи обсуждались
не знаю уж, где там это "тут", но это - ОЧЕВИДНОЕ решение
> свечь
учим русский язык.
"ь", смею заметить, погано смотрится на фоне имперскогол размаха задач.
← →
Alex870 (2005-10-04 16:48) [28]
> Digitman ©
Единственно, где признаю свою ошибку, так это в слое "сечь", да язык нужно знать!
А вот на счет всего остального, хотя бы объяснили... А так можно над любой фразой посмеяться.
← →
chili (2005-10-04 17:00) [29]Alex870 (04.10.05 14:45) [17]
Внедряй свою библиотеку в WINLOGON пусть от туда мониторит запускаемые процессы, а таймер советую убрать создай отдельный поток который будет следить за возникновением события HSHELL_WINDOWCREATED и убивать запрешенные процессы
← →
Alex870 (2005-10-04 17:08) [30]
> chili
А как внедрить библиотеку в Winlogon (только)? Я подозреваю что это можно, но я не нашел у него таких функций (может плохо искал). За HSHELL_WINDOWCREATED спасибо, плохо MSDN читал, ну наверное окно есть у большенства процессов, однако вот топлевел мне немного не понятно, речь идет о главном окне процесса? Если так, то возникают некоторые трудности, но меня больше интересует ответ на первый вопрос. Спасибо.
← →
chili (2005-10-04 17:12) [31]Alex870 (04.10.05 17:08) [30]
к примеру так:function SetDebugPriv: Boolean;
var
Token: THandle;
tkp: TTokenPrivileges;
begin
Result := false;
if OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token) then
begin
if LookupPrivilegeValue(nil, PChar("SeDebugPrivilege"), tkp.Privileges[0].Luid) then
begin
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
Result := AdjustTokenPrivileges(Token, false, tkp, 0, PTokenPrivileges(nil)^, PDWord(nil)^);
end;
end;
end;
function Start(ProcessID: Cardinal; DllFileName: string): Boolean;
var
hProcess, hTh: THandle;
BytesWritten, ThreadID, DllNameLen: Cardinal;
LoadLibraryProc, MemPtr: Pointer;
ExitCode: DWord;
begin
Result := false;
SetDebugPriv();
hProcess := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE,true, ProcessID);
if hProcess <> 0 then
begin
DllNameLen := Length(DllFileName) + 1;
MemPtr := VirtualAllocEx(hProcess, nil, DllNameLen, MEM_COMMIT, PAGE_READWRITE);
if MemPtr <> nil then
begin
if WriteProcessMemory(hProcess, MemPtr, PChar(DllFileName), DllNameLen, BytesWritten) then
begin
LoadLibraryProc := GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
hTh := CreateRemoteThread(hProcess, nil, 0, LoadLibraryProc, MemPtr, 0, ThreadID);
if hTh <> 0 then
begin
if (WaitForSingleObject(hTh, INFINITE) = WAIT_OBJECT_0) and
GetExitCodeThread(hTh, ExitCode) then
Result := ExitCode <> 0;
CloseHandle(hTh);
end;
end;
VirtualFreeEx(hProcess, MemPtr, 0, MEM_RELEASE);
end;
CloseHandle(hProcess);
end;
end;
var
ProcessID: Cardinal;
DllName,ppp: string;
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
ProcessID:=0;
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
While integer(ContinueLoop) <> 0 do
begin
ppp:=FProcessEntry32.szExeFile;
if (pos("WINLOGON",UpperCase(ppp))>0) then ProcessID:=FProcessEntry32.th32ProcessID;
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
DllName:="твоя длл";
if ProcessID <> 0 then begin
Start(ProcessID, DllName);
end;
← →
chili (2005-10-04 17:17) [32]или можно из самой библиотеки:
begin
GetModuleFileName(Hinstance, CurrentModule, MAX_PATH);
GetSystemDirectory(SystemPath, MAX_PATH);
//определение адресов перехватываемых функций
AdwapiHandle := GetModuleHandle("advapi32.dll");
AdrCreateProcessWithLogonW := GetProcAddress(AdwapiHandle, "CreateProcessWithLogonW");
AdrLogonUserW := GetProcAddress(AdwapiHandle, "LogonUserW");
AdrLogonUserA := GetProcAddress(AdwapiHandle, "LogonUserA");
//остановка побочных потоков
StopThreads();
if GetCurrentProcessName = "WINLOGON.EXE" then
begin //нужно перехватить WlxLoggedOutSAS из msgina.dll
GinaHandle := LoadLibrary("msgina.dll");
AdrWlxLoggedOutSAS := GetProcAddress(GinaHandle, "WlxLoggedOutSAS");
WlxLoggedOutSAS := AdrWlxLoggedOutSAS;
StubWlxLoggedOutSAS.PuhsOp := $68;
StubWlxLoggedOutSAS.PushArg := @NewWlxLoggedOutSAS;
StubWlxLoggedOutSAS.RetOp := $C3;
ReadProcessMemory(GetCurrentProcess, AdrWlxLoggedOutSAS,
@OldWlxLoggedOutSAS, SizeOf(OldCode), bw);
WriteProcessMemory(GetCurrentProcess, AdrWlxLoggedOutSAS,
@StubWlxLoggedOutSAS, SizeOf(far_jmp), bw);
end else
begin //нужно перехватить CreateProcessWithLogonW, LogonUserA и LogonUserW
//нинциализация структур перехвата
StubCrWintLogon.PuhsOp := $68;
StubCrWintLogon.PushArg := @NewCreateProcessWithLogonW;
StubCrWintLogon.RetOp :=$C3;
//
StubLogonUserW.PuhsOp := $68;
StubLogonUserW.PushArg := @NewLogonUserW;
StubLogonUserW.RetOp := $C3;
//
StubLogonUserA.PuhsOp := $68;
StubLogonUserA.PushArg := @NewLogonUserA;
StubLogonUserA.RetOp := $C3;
//сохранение начальных байт функций
ReadProcessMemory(GetCurrentProcess, AdrCreateProcessWithLogonW,
@OldCrWintLogon, SizeOf(OldCode), bw);
ReadProcessMemory(GetCurrentProcess, AdrLogonUserW,
@OldLogonUserW,SizeOf(OldCode), bw);
ReadProcessMemory(GetCurrentProcess, AdrLogonUserA,
@OldLogonUserA, SizeOf(OldCode), bw);
//внедрение кода перехватчика
WriteProcessMemory(GetCurrentProcess, AdrCreateProcessWithLogonW,
@StubCrWintLogon, SizeOf(far_jmp), bw);
WriteProcessMemory(GetCurrentProcess, AdrLogonUserW,
@StubLogonUserW, SizeOf(far_jmp), bw);
WriteProcessMemory(GetCurrentProcess, AdrLogonUserA,
@StubLogonUserA, SizeOf(far_jmp), bw);
end;
//запуск остановленных потоков
RunThreads();
end.
← →
Alex870 (2005-10-04 17:18) [33]
> chili (04.10.05 17:12) [31]
Спасибо, пока не разобрался, но основную суть понял. Вот только ToolHelp под XP кривовато работает, но для таких задач прокатит. Еще раз спасибо.
← →
chili (2005-10-04 17:22) [34]Я решал подобную задачу, тоже было много советов, но не одного практического рещения... Так что рад был помочь :)
← →
Alex870 (2005-10-04 17:23) [35]
> chili (04.10.05 17:17) [32]
Эффектно, но тут я не понял главного, что такое OldCode, far_jmp и как происходит восстановление старых функций
← →
chili (2005-10-04 17:27) [36]Alex870 (04.10.05 17:23) [35]
сорри забыл
type
OldCode = packed record
One: dword;
two: word;
end;
far_jmp = packed record
PuhsOp: byte;
PushArg: pointer;
RetOp: byte;
end;
← →
chili (2005-10-04 17:30) [37]извини полностью не могу привести пример всей библиотеки это будет off topic, могут прогнать с форума :)
← →
Alex870 (2005-10-04 17:32) [38]Спасибо. Дальше я думаю сам разберусь.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.029 c