Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.037 c
2-1132312364
Timon777
2005-11-18 14:12
2005.12.04
ShellExecute и фокус нового окна


14-1131280874
Вадя
2005-11-06 15:41
2005.12.04
asm &amp; AMD64


10-1108642942
Карелин Артем
2005-02-17 15:22
2005.12.04
Авторизация для вызова удаленного com-интерфейса. Как?


4-1127991575
Rule
2005-09-29 14:59
2005.12.04
Проблемма при открытии СОМ порта посредством функции CreateFile


2-1132257447
illy
2005-11-17 22:57
2005.12.04
Реестр API





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский