Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.04;
Скачать: CL | DM;

Вниз

Критическая служба   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2005.12.04;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.04 c
1-1131051613
Toxa_ua
2005-11-04 00:00
2005.12.04
ComponentCount в TEdit


2-1130822835
flatron84
2005-11-01 08:27
2005.12.04
Асемблер и Delphi


14-1131977181
Ильичев С.А.
2005-11-14 17:06
2005.12.04
Данные в анкете


2-1132068213
PAI
2005-11-15 18:23
2005.12.04
Довольно большая программа понемногу, но "подъедает" память.


14-1131801241
Kerk
2005-11-12 16:14
2005.12.04
Купил FIFA Manager 2006