Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.03.2009, 06:33
sofrinov sofrinov вне форума
Прохожий
 
Регистрация: 03.12.2008
Сообщения: 9
Репутация: 10
По умолчанию hook на запуск процессов.

Привет! Помогите пожалуйста, надо сделать хук на запуск процессов без dll и желательно кто умеет с помощью jcl. я вот такой пользую (он сволочь не все процессы ловит):
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
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: Пользуемся тегами, иначе последуют санкции!

Последний раз редактировалось Admin, 05.03.2009 в 11:29.
Ответить с цитированием
  #2  
Старый 19.03.2009, 10:19
vinni vinni вне форума
Начинающий
 
Регистрация: 26.01.2006
Сообщения: 135
Репутация: 10
По умолчанию

> надо сделать хук на запуск процессов без dll
Хуки могут располагаться ТОЛЬКО в dll
Ответить с цитированием
  #3  
Старый 01.04.2009, 00:26
Аватар для Ferra
Ferra Ferra вне форума
Местный
 
Регистрация: 12.03.2006
Адрес: Минск
Сообщения: 527
Репутация: 1336
Вопрос

Я конечно извиняюсь, может и я чего-то не знаю, но кто тебе сказал что ловушки (aslo known as hooks) можно ставить только в dll?
__________________
Нет повести печальнее на свете, чем повесть о заклиневшем Resete.
Ответить с цитированием
  #4  
Старый 01.04.2009, 01:11
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

Цитата:
Сообщение от Ferra
Я конечно извиняюсь, может и я чего-то не знаю, но кто тебе сказал что ловушки (aslo known as hooks) можно ставить только в dll?
А вы встречали рабочие хуки не длл?
__________________
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра.
Ответить с цитированием
  #5  
Старый 01.04.2009, 13:15
Аватар для Ferra
Ferra Ferra вне форума
Местный
 
Регистрация: 12.03.2006
Адрес: Минск
Сообщения: 527
Репутация: 1336
Подмигивание

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

Вот держи, ~10 строк кода, думаю тут всё понятно будет.. Ну и?
Вложения
Тип файла: rar HooksWithoutDLL.rar (2.8 Кбайт, 58 просмотров)
__________________
Нет повести печальнее на свете, чем повесть о заклиневшем Resete.

Последний раз редактировалось Ferra, 01.04.2009 в 14:27.
Ответить с цитированием
  #6  
Старый 01.04.2009, 13:22
Аватар для Ferra
Ferra Ferra вне форума
Местный
 
Регистрация: 12.03.2006
Адрес: Минск
Сообщения: 527
Репутация: 1336
Смущение

Хотелось бы ещё добавить что это очень кривая реализация. Например там нежелательно пользоваться CallNextHookEx как это делал я. Иногда может выключать чужие приложения, иногда может этого и не делать. Усовершенствуй код - получишь то что спрашиваешь, я лишь показываю что такое реально.
__________________
Нет повести печальнее на свете, чем повесть о заклиневшем Resete.
Ответить с цитированием
  #7  
Старый 01.04.2009, 16:27
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

Ferra, странно, но у меня твоя программа не работает. Она ловит нажатие клавиш только если ее окно активно, а если я нажимаю клавиши, скажем в блокноте, то прога ничего не ловит.
__________________
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра.
Ответить с цитированием
  #8  
Старый 02.04.2009, 16:15
Аватар для Ferra
Ferra Ferra вне форума
Местный
 
Регистрация: 12.03.2006
Адрес: Минск
Сообщения: 527
Репутация: 1336
Радость

Попробуй вставить в конце модуля
Код:
1
exports MsgProc;

Но я не уверен. Не знаю как убедить, но у меня ловит. С проблемами и иногда, но ловит.

Не стану спорить что много писанины про то что делать так нельзя(!) В MSDN именно так написано, но я специально для тебя постараюсь и найду приложение (видел я, видел ) которое работало без длл.
__________________
Нет повести печальнее на свете, чем повесть о заклиневшем Resete.
Ответить с цитированием
  #9  
Старый 02.04.2009, 18:06
Аватар для Ferra
Ferra Ferra вне форума
Местный
 
Регистрация: 12.03.2006
Адрес: Минск
Сообщения: 527
Репутация: 1336
Стрелка

Видоизменил

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function MsgProc(Code: integer; wParam: Word; lParam: Longint): Longint; stdcall;
var
 c   : char;
 f   : text;
 key : array [0..16] of Char;
begin
Showmessage('HELLO FROM MY EXE HOOK');
 if (Code=HC_ACTION) and (((lParam shr 16) and KF_UP)=0) then
   begin
   Assign(f,'D:\log.txt');
    if FileExists('D:\log.txt') then Append(f) else Rewrite(f);
   GetKeyNameText(lParam,key,SizeOf(key));
   Writeln(f,key);
   CloseFile(f);
   //result:=CallNextHookEx(myHook,Code,wParam,lParam);
   end;
result:=CallNextHookEx(myHook,Code,wParam,lParam);
end;

Работает. Но очень нехорошо - приложение в котором нажата клавиша (кроме нашего) - уходит по английски. Выкидывает его.

Я пока что не знаю причину столь странного поведения, надо будет почитать, поискать как это обойти. Ошибка возникает при CallNextHookEx - это очевидно. Как обойти - это уже отдельный вопрос, если он столь остро стоит, могу поискать. Засим откланюсь, думаю тема исчерпана.
__________________
Нет повести печальнее на свете, чем повесть о заклиневшем Resete.
Ответить с цитированием
  #10  
Старый 02.04.2009, 18:27
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Господа...!
Да не может не dll'ный хук ловить события системы. Не бывает так. Почитайте литературу сами или я, блин, вам примеры приведу как это работает.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #11  
Старый 02.04.2009, 18:37
Аватар для Ferra
Ferra Ferra вне форума
Местный
 
Регистрация: 12.03.2006
Адрес: Минск
Сообщения: 527
Репутация: 1336
По умолчанию

Да, я видел что написано в литературе. и в MSDN тоже.
Ну что поделать если данный пример ловит . Выдаёт сообщение что ловушка получила сообщение. Всё остальное читай выше.

PS> для особо недоверчивых могу выложить видюшку, продемонстрирую что код тот же и что при нажатии клавиши в "чужом приложении" - данный пример выводит сообщение, а "чужое приложение" вылетает.
__________________
Нет повести печальнее на свете, чем повесть о заклиневшем Resete.

Последний раз редактировалось Ferra, 02.04.2009 в 18:49.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:25.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025