![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Критическая служба [D7, WinXP]
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 в реестр, а следовательно все запущенные процессы проецируют её в свое адресное пространство. При инициализации библиотека запускает таймер, по которому проверяет список процессов, но т.к. инициализируется она во всех процессах, таймеров тоже получается несколько, и они все работают параллельно, т.е. если в процедуре таймера произошло опр. событие, а таких процедур несколько, то и реакций на одно и тоже событие несколько (столько сколько процессов, к которым подключилась моя библиотека).
А вот на счет полного бреда это Вы погорячились неразобравшись (невнимательно читая)