![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() Привет! Помогите пожалуйста, надо сделать хук на запуск процессов без dll и желательно кто умеет с помощью jcl. я вот такой пользую (он сволочь не все процессы ловит):
Код:
procedure TForm1.WndProc(var Msg: TMessage); var I:INTEGER; I1:INTEGER; I2:INTEGER; I3:INTEGER; I4:INTEGER; I5:INTEGER; I6:INTEGER; f: TextFile; fName: String; buf: String; begin inherited; if (Msg.Msg = MHSHELL_WINDOWCREATED) then begin try if ch1.Checked = true then begin if chm.Checked = true then begin opvir.Clear; all.Items.Add('+'); fName := GetWndExePath(Msg.LParam); AssignFile(f, fName); {$I-} Reset(f); // открыть для чтения {$I+} if IOResult <> 0 then begin da1.MessageText:= 'Не удалось проверить объект: '#13#10+GetWndExePath(Msg.LParam)+#13#10'Объект заблокирован!'; da1.Execute; non.Items.Add(GetWndExePath(Msg.LParam)); procs32.KillProcess(ExtractFileName(GetWndExePath(Msg.LParam))); exit; end; while not EOF(f) do begin readln(f, buf); // прочитать строку из файла opvir.Lines.Add(buf); // добавить строку в поле Memo1 end; CloseFile(f); // закрыть файл FOR I:= 5 TO v1.Lines.Count-2 DO BEGIN IF opvir.Lines.Strings[0] = v1.Lines.Strings[i] THEN BEGIN viruss.Items.Add(GetWndExePath(Msg.LParam)); procs32.KillProcess(ExtractFileName(GetWndExePath(Msg.LParam))); END; END; FOR I1:= 0 TO v2.Lines.Count-2 DO BEGIN IF opvir.Lines.Strings[1] = v2.Lines.Strings[I1] THEN BEGIN viruss.Items.Add(GetWndExePath(Msg.LParam)); procs32.KillProcess(ExtractFileName(GetWndExePath(Msg.LParam))); END; END; FOR I2:= 0 TO v3.Lines.Count-2 DO BEGIN IF opvir.Lines.Strings[2] = v3.Lines.Strings[I2] THEN BEGIN viruss.Items.Add(GetWndExePath(Msg.LParam)); procs32.KillProcess(ExtractFileName(GetWndExePath(Msg.LParam))); END; END; FOR I3:= 0 TO v4.Lines.Count-2 DO BEGIN IF opvir.Lines.Strings[3] = v4.Lines.Strings[I3] THEN BEGIN viruss.Items.Add(GetWndExePath(Msg.LParam)); procs32.KillProcess(ExtractFileName(GetWndExePath(Msg.LParam))); end; end; for I4:= 0 TO v5.Lines.Count-2 do begin if opvir.Lines.Strings[4] = v5.Lines.Strings[I4] then begin viruss.Items.Add(GetWndExePath(Msg.LParam)); procs32.KillProcess(ExtractFileName(GetWndExePath(Msg.LParam))); end; end; for I5:= 0 TO v6.Lines.Count-2 do begin if opvir.Lines.Strings[5] = v6.Lines.Strings[I5] then begin viruss.Items.Add(GetWndExePath(Msg.LParam)); procs32.KillProcess(ExtractFileName(GetWndExePath(Msg.LParam))); end; end; for I6:= 0 TO v7.Lines.Count-2 do begin if opvir.Lines.Strings[6] = v7.Lines.Strings[I6] then begin viruss.Items.Add(GetWndExePath(Msg.LParam)); procs32.KillProcess(ExtractFileName(GetWndExePath(Msg.LParam))); end; end; if viruss.Items.Strings[viruss.Count-1] = viruss.Items.Strings[viruss.Count-2] then begin viruss.Items.Delete(viruss.Count-1); end; if viruss.Items.Strings[0] = '' then begin viruss.Items.Delete(0); end; end; end;except end; end; end; dll : library SHELLHook; uses SysUtils, Classes, Windows; const MMFName: PChar = 'MMF'; type PGlobalDLLData = ^TGlobalDLLData; TGlobalDLLData = packed record HookWnd: HWND; Wnd: HWND; end; var GlobalData: PGlobalDLLData; MMFHandle: THandle; MHSHELL_WINDOWACTIVATED: Cardinal; MHSHELL_WINDOWCREATED: Cardinal; MHSHELL_WINDOWDESTROYED: Cardinal; function ShellProc(Code: Integer; wParam: DWORD; lParam: DWORD): Longint; stdcall; begin Result:= CallNextHookEx(GlobalData.HookWnd, Code, wParam, lParam); if (Code = HSHELL_WINDOWACTIVATED) then SendMessage(GlobalData.Wnd, MHSHELL_WINDOWACTIVATED, 0, Integer(wParam)); if (Code = HSHELL_WINDOWCREATED) then SendMessage(GlobalData.Wnd, MHSHELL_WINDOWCREATED, 0, Integer(wParam)); if (Code = HSHELL_WINDOWDESTROYED) then SendMessage(GlobalData.Wnd, MHSHELL_WINDOWDESTROYED, 0, Integer(wParam)); end; function StartMouseHook(State: Boolean; Wnd: HWND): Boolean; export; stdcall; begin Result:= False; if State = True then begin GlobalData^.HookWnd:= SetWindowsHookEx(WH_SHELL, @ShellProc, hInstance, 0); GlobalData^.Wnd:= Wnd; if GlobalData^.HookWnd <> 0 then Result:= True; end else begin UnhookWindowsHookEx(GlobalData^.HookWnd); Result:= False; end; end; function StopMouseHook(): Boolean; export; stdcall; begin UnhookWindowsHookEx(GlobalData^.HookWnd); if GlobalData^.HookWnd = 0 then Result:= False else Result:= True; end; procedure OpenGlobalData(); begin MHSHELL_WINDOWACTIVATED:= RegisterWindowMessage('MHSHELL_WINDOWACTIVATED'); MHSHELL_WINDOWCREATED:= RegisterWindowMessage('MHSHELL_WINDOWCREATED'); MHSHELL_WINDOWDESTROYED:= RegisterWindowMessage('MHSHELL_WINDOWDESTROYED'); MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName); GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData)); if GlobalData = nil then CloseHandle(MMFHandle); end; procedure CloseGlobalData(); begin UnmapViewOfFile(GlobalData); CloseHandle(MMFHandle); end; procedure DLLEntryPoint(Reason: DWORD); begin case Reason of DLL_PROCESS_ATTACH: OpenGlobalData; DLL_PROCESS_DETACH: CloseGlobalData; end; end; exports StartMouseHook, StopMouseHook; begin DLLEntryPoint(DLL_PROCESS_ATTACH); end. Последний раз редактировалось Admin, 05.03.2009 в 11:29. |
#2
|
|||
|
|||
![]() > надо сделать хук на запуск процессов без dll
Хуки могут располагаться ТОЛЬКО в dll |
#3
|
||||
|
||||
![]() Я конечно извиняюсь, может и я чего-то не знаю, но кто тебе сказал что ловушки (aslo known as hooks) можно ставить только в dll?
![]() Нет повести печальнее на свете, чем повесть о заклиневшем Resete. ![]() |
#4
|
||||
|
||||
![]() Цитата:
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра. |
#5
|
||||
|
||||
![]() До чего ж необразованный народ то пошёл
![]() Сначала хотел убедить тебя статьями с инета, но там мало хорошего.. Потом хотел найти пример реализации, видел я такой.. потом плюнул и написал сам ![]() Вот держи, ~10 строк кода, думаю тут всё понятно будет.. Ну и? Нет повести печальнее на свете, чем повесть о заклиневшем Resete. ![]() Последний раз редактировалось Ferra, 01.04.2009 в 14:27. |
#6
|
||||
|
||||
![]() Хотелось бы ещё добавить что это очень кривая реализация. Например там нежелательно пользоваться CallNextHookEx как это делал я. Иногда может выключать чужие приложения, иногда может этого и не делать. Усовершенствуй код - получишь то что спрашиваешь, я лишь показываю что такое реально.
![]() Нет повести печальнее на свете, чем повесть о заклиневшем Resete. ![]() |