Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Критическая служба [D7, WinXP]


Страницы:   1 2

Alex870 ©   (2005-10-03 10:46:00) 

Здравствуйте!
Подскажите пожалуста, как сделать, чтобы процесс моей службы невозможно было завершить (например как csrss.exe, а ещё лучше как system или хотябы как касперского). Следящий процесс не подходит, так как работа службы не дожна прерываться. Зарание спасибо.


Alex870   (2005-10-04 17:32:00) [1]

Спасибо. Дальше я думаю сам разберусь.


chili   (2005-10-04 17:30:00) [2]

извини полностью не могу привести пример всей библиотеки это будет off topic, могут прогнать с форума :)


chili   (2005-10-04 17:27:00) [3]

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;


Alex870   (2005-10-04 17:23:00) [4]


> chili   (04.10.05 17:17) [32]

Эффектно, но тут я не понял главного, что такое OldCode, far_jmp и как происходит восстановление старых функций


chili   (2005-10-04 17:22:00) [5]

Я решал подобную задачу, тоже было много советов, но не одного практического рещения... Так что рад был помочь :)


Alex870   (2005-10-04 17:18:00) [6]


> chili   (04.10.05 17:12) [31]

Спасибо, пока не разобрался, но основную суть понял. Вот только ToolHelp под XP кривовато работает, но для таких задач прокатит. Еще раз спасибо.


chili   (2005-10-04 17:17:00) [7]

или можно из самой библиотеки:

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.


chili   (2005-10-04 17:12:00) [8]

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;


Alex870   (2005-10-04 17:08:00) [9]


> chili

А как внедрить библиотеку в Winlogon (только)? Я подозреваю что это можно, но я не нашел у него таких функций (может плохо искал). За HSHELL_WINDOWCREATEDспасибо, плохо MSDN читал, ну наверное окно есть у большенства процессов, однако вот топлевел мне немного не понятно, речь идет о главном окне процесса? Если так, то возникают некоторые трудности, но меня больше интересует ответ на первый вопрос. Спасибо.


chili   (2005-10-04 17:00:00) [10]

Alex870   (04.10.05 14:45) [17]

Внедряй свою библиотеку в WINLOGON пусть от туда мониторит запускаемые процессы, а таймер советую убрать создай отдельный поток который будет следить за возникновением события HSHELL_WINDOWCREATED и убивать запрешенные процессы


Alex870   (2005-10-04 16:48:00) [11]


> Digitman ©

Единственно, где признаю свою ошибку, так это в слое "сечь", да язык нужно знать!
А вот на счет всего остального, хотя бы объяснили... А так можно над любой фразой посмеяться.


Digitman   (2005-10-04 16:42:00) [12]


> Alex870   (04.10.05 16:33) [25]


> она кастрирована

Да, кастрирована..
После чего осталась ее суть, заключающаяся в галиматье вида "события вызываются процессами" ... что как было галиматьей, так ей и останется, ВНЕ зависимости от "кастрирования" чего-то там.

Прежде чем излагать мысль - думаем головой, сверяемся со справочниками, терминологией и т.д. и.т.п. .. вопрос-то - далеко за пределами "батонокидательства" ..


> тут уже такие вещи обсуждались


не знаю уж, где там это "тут", но это - ОЧЕВИДНОЕ решение


> свечь


учим русский язык.
" ь", смею заметить,  погано смотрится на фоне имперскогол размаха задач.


Alex870   (2005-10-04 16:37:00) [13]


> Игорь Шевченко ©

> Извини, но консультировать в подробностях или решать чужую
> проблему у меня нет ни времени ни желания.

Извиняюсь погорячился. Попробую чего нибудь поковырять в этом направлении, всеже спасибо за ответ. Просто моя задача похоже привратилась в академическую пока решал узнал много нового про API.


Alex870   (2005-10-04 16:33:00) [14]


> да и нечего там "читать" даже !
>
> "события .. вызываются .. процессами" - цитата из ТВОЕЙ
> фразы ? не возражаешь, надеюсь ?

Не возражаю, но она кастрирована. На самом деле было написано:
Так как библиотека подключена ко всем процессам, а в ней работает таймер, события таймера вызываются сразу несколькими процессами...
И это бредом я не считаю (см. приведенный код).
А вот на счет драйвера режима ядра скажу следующее: тут уже такие вещи обсуждались, написание их достаточно сложное (игра не стоит свечь). Так что говорить: достаточно будет написать и инсталлировать драйвер режима ядраэто может мне кернел переписать посоветуете ради такой задачи, а совет близок к этому.


Игорь Шевченко   (2005-10-04 16:32:00) [15]


> Вы к сожалению не ответили мне о подробностях этих приемов


К счастью, кроме меня еще существуют такие службы, как Яндекс и Google.

Я к тому, что достаточно указать нужное направление, а дальнейшие действия остаются свободой автора вопроса.

Извини, но консультировать в подробностях или решать чужую проблему у меня нет ни времени ни желания.


Digitman   (2005-10-04 16:20:00) [16]


> Alex870   (04.10.05 15:04) [19]


> на счет полного бреда это Вы погорячились неразобравшись
> (невнимательно читая)


да и нечего там "читать" даже !

"события .. вызываются .. процессами" - цитата из ТВОЕЙ фразы ? не возражаешь, надеюсь ?

вот она и есть бред.

а по сабжу в целом - ерундистикой ты занялся, со своими "таймерами" и "внедрениями".

достаточно будет написать и инсталлировать драйвер режима ядра, следящий за стартом процессов и уничтожающий нежелательные процессы уже на этом этапе.


Alex870   (2005-10-04 16:14:00) [17]


> Игорь Шевченко ©

Предыдущий пост относится не к Вам, просто пока я писал вы послали свой.
> В EventLog не судьба писать, аудит не судьба включить

Вы к сожалению не ответили мне о подробностях этих приемов


Alex870   (2005-10-04 16:11:00) [18]

Для тех кто до сих пор не понял привожу примерный код:
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 и всё


Игорь Шевченко   (2005-10-04 16:06:00) [19]

Странно это все. В EventLog не судьба писать, аудит не судьба включить, обязательно хочется удалять гланды нетрадиционным способом.


Alex870   (2005-10-04 15:04:00) [20]


> Digitman ©

Ну может я неверно выразился, я прописал свою библиотеку в InitAppDLLs в реестр, а следовательно все запущенные процессы проецируют её в свое адресное пространство. При инициализации библиотека запускает таймер, по которому проверяет список процессов, но т.к. инициализируется она во всех процессах, таймеров тоже получается несколько, и они все работают параллельно, т.е. если в процедуре таймера произошло опр. событие, а таких процедур несколько, то и реакций на одно и тоже событие несколько (столько сколько процессов, к которым подключилась моя библиотека).
А вот на счет полного бреда это Вы погорячились неразобравшись (невнимательно читая)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо