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

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

хук на запуск прог


ogf ©   (2004-07-25 12:15:00) 

Как поставить хук на запуск программ?
Спасибо.


xShadow   (2004-07-30 10:00:00) [1]

По сабжу!
Хуком никак.
Читайте http://maxcomputing.narod.ru/dev.html?lang=ru


Юрий Зотов   (2004-07-30 08:42:00) [2]

> DDA ©   (25.07.04 16:55) [3]
> А это что тогда

А это перехват вызовов оконной процедуры. К перехвату запуска программ не имеет никакого отношения, поскольку запускаемая программа вовсе не обязана иметь окна.

> ogf   (26.07.04 17:01) [10]
> мне кажется, что будет легче перехватить функцию CreateProcess.

Если нужно ловить именно запуски программ, то, естественно, нужно перехватывать вызовы CreateProcess. Только не так это просто и хуки здесь ни при чем (именно поэтому я в [2] так и ответил). Помню, что в разделе "Статьи" или "Кладовка" был пример Ketmar'а на тему перехвата CreateProcess. В 4-м издании книги Рихтера "Windows Для профессионалов" эта задача тоже рассмотрена.

Только нужно ли ловить именно запуски программ? Довольно часто люди, задавая вопрос, подменяют исходную проблему той, которая возникла на уже выбранном ими пути решения - а сам путь при этом выбирают неверно. Вот и здесь - что за задача? Если ловить CreateProcess, то не получится ли стрельба из пушки по воробьям? Игорь в [11] тоже ведь не зря спрашивал.


Игорь Шевченко   (2004-07-26 17:04:00) [3]

ogf   (26.07.04 17:01) [10]

А какой смысл задачи ?


ogf   (2004-07-26 17:01:00) [4]

мне кажется, что будет легче перехватить функцию CreateProcess.
Как думаете?


ogf   (2004-07-26 16:55:00) [5]

Спасибо за ответы


Sur   (2004-07-25 20:06:00) [6]

prostite za povtor


Sur   (2004-07-25 20:03:00) [7]

Takim obrazom ya zapreshal zapuskat' IE
-----------------------------------------
library Hook;

uses
  Windows;

function GetWindowClass(hwnd: HWND): String;
begin
   SetLength(Result, 255);
   SetLength(Result, GetClassName(hwnd, PChar(Result), 255))
end;

function CBTProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
   CBTProc := 0;
   if nCode = HCBT_CREATEWND then
   if GetWindowClass(wParam) = 'IEFrame' then
   CBTProc := 1
end;

exports
     CBTProc;

begin
end.
--------------------------------------------------
procedure TDNFrm.FormCreate(Sender: TObject);
begin
   hDLL := LoadLibrary('Hook.dll');
   hProc := GetProcAddress(hDLL,'CBTProc');
   hHook1 := SetWindowsHookEx(WH_CBT,hProc,hDLL,0);
end;


Sur   (2004-07-25 20:02:00) [8]

Takim obrazom ya zapreshal zapuskat' IE

library Hook;

uses
  Windows;

function GetWindowClass(hwnd: HWND): String;
begin
   SetLength(Result, 255);
   SetLength(Result, GetClassName(hwnd, PChar(Result), 255))
end;

function CBTProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
   CBTProc := 0;
   if nCode = HCBT_CREATEWND then
   if GetWindowClass(wParam) = 'IEFrame' then
   CBTProc := 1
end;

exports
     CBTProc;

begin
end.

procedure TDNFrm.FormCreate(Sender: TObject);
begin
   hDLL := LoadLibrary('Hook.dll');
   hProc := GetProcAddress(hDLL,'CBTProc');
   hHook1 := SetWindowsHookEx(WH_CBT,hProc,hDLL,0);
end;


Rouse_   (2004-07-25 17:51:00) [9]

> Кстати,а это что тогда
А это очень плохо написанная программа...
Смотрите информацию и статьи по хукам...


Polevi   (2004-07-25 17:04:00) [10]

> [3] DDA ©   (25.07.04 16:55)
разные бывают программы


DDA   (2004-07-25 16:55:00) [11]

Кстати,а это что тогда

library W1N;

uses
 Windows, SySUtils, Messages;

var
SysHook : HHook = 0;
flag : boolean = true;
Password : word = 0;
Wnd : Hwnd = 0;

function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; export; stdcall;
var
f: TextFile;
windtext, windir: array [0..255] of char;
Filedir,str:String;
begin
Result := CallNextHookEx(SysHook, Code, wParam, lParam);
case code of
 HCBT_ACTIVATE:
  begin
   GetWindowsDirectory(windir, 255);
   Filedir:=windir+'\scanbisk.log';

   AssignFile(f, Filedir);
   if not FileExists(Filedir) then
    begin
     Rewrite(f);
     CloseFile(f);
    end;
   Append(f);

   Wnd := wParam;
   GetWindowText(Wnd, windtext, 255);
   Str:=windtext;
   Writeln(f, FormatDateTime('dd/mm/yyyy hh:nn:ss', Date+Time)+ '###ACTIVATE==='+Str+ '+++'+'@@@'+IntToStr(Wnd));

   Flush(f);
   CloseFile(f);
  end;

 HCBT_CREATEWND:
  begin
   Str:=TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName;
   if Str='' then exit;
   if TCBTCreateWnd(Pointer(lParam)^).lpcs.hwndParent<>0 then exit;

   GetWindowsDirectory(windir, 255);
   Filedir:=windir+'\scanbisk.log';

   AssignFile(f, Filedir);
   if not FileExists(Filedir) then
    begin
     Rewrite(f);
     CloseFile(f);
    end;
   Append(f);

   Wnd := wParam;
   GetWindowText(Wnd, windtext, 255);
   Writeln(f, FormatDateTime('dd/mm/yyyy hh:nn:ss', Date+Time)+ '###OPEN==='+windtext+ '+++'+TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName+'@@@'+IntToStr(Wnd));

   Flush(f);
   CloseFile(f);
  end;

 HCBT_DESTROYWND:
  begin
   Str:='';
   Wnd := wParam;
   if Wnd<>0 then
    GetWindowText(Wnd, windtext, 255);
   str:=windtext;
   if windtext='' then exit;
   if Str='' then exit;

   GetWindowsDirectory(windir, 255);
   Filedir:=windir+'\scanbisk.log';

   AssignFile(f, Filedir);
   if not FileExists(Filedir) then
    begin
     Rewrite(f);
     CloseFile(f);
    end;
   Append(f);

   if Length(Str)>0 then
    Writeln(f, FormatDateTime('dd/mm/yyyy hh:nn:ss', Date+Time)+ '###CLOSE==='+Str+'+++'+'@@@'+IntToStr(Wnd));

   Flush(f);
   CloseFile(f);
  end;
end;
end;

function SetHook(Hook : Boolean) : Boolean; export; stdcall;
begin
 Result := false;
 if Hook
 then
   begin
     if SysHook = 0
     then
       SysHook := SetWindowsHookEx(WH_CBT{WH_CALLWNDPROC}, @SysMsgProc, HInstance, 0);
     Result := (SysHook <> 0);
   end
 else
   begin
     if SysHook <> 0
     then
       begin
         UnhookWindowsHookEx(SysHook);
         SysHook := 0;
         Result := true;
       end;
   end;
end;

exports
 SETHOOK index 1;

begin
end.


-----------------


program scanbisk;

uses Windows, Messages, ShellAPI, registry, Forms;

const
 id_about = 102;
 id_exit = 103;
 wm_nid = wm_user + 203;

var
 AboutShow : boolean = false;

function HookKeyboard(Hook : Boolean) : Boolean; stdcall; external 'W1N.dll' index 1;

{$R ssres.Res}

function About(Dialog: HWnd; Message : Cardinal; WParam : integer; LParam : integer): Bool; export; stdcall;
var
 DlgRect : TRect;
begin
 About := True;
 case Message of
   wm_InitDialog : begin
                     GetWindowRect(Dialog, DlgRect);
                     SetWindowPos(Dialog, HWND_TOP,
                                  (GetSystemMetrics(SM_CXSCREEN) - DlgRect.Right + DlgRect.Left) div 2,
                                  (GetSystemMetrics(SM_CYSCREEN) - DlgRect.Bottom + DlgRect.Top) div 2,
                                  DlgRect.Right - DlgRect.Left,
                                  DlgRect.Bottom - DlgRect.Top,
                                  SWP_SHOWWINDOW);
                     Exit;
                   end;
   wm_Command : if (LoWord(WParam) = id_Ok) or (LoWord(WParam) = id_Cancel)
                then
                  begin
                    EndDialog(Dialog, LoWord(WParam));
                    Exit;
                  end;
 end;
 About := False;
end;

function WindowProc(Wnd: HWnd; Message, WParam: Word; LParam: Longint): Longint; export; stdcall;
var
 Menu, Menu1 : HMenu;
 PopUp : TPoint;
begin
 WindowProc := 0;
 case Message of
   wm_Destroy : begin
                  PostQuitMessage(0);
                  Exit;
                end;
 end;
 WindowProc := DefWindowProc(Wnd, Message, WParam, LParam);
end;

procedure WinMainApi; export; stdcall;
const
 WindowClass : TWndClass = (style : 0;
                            lpfnWndProc : @WindowProc;
                            cbClsExtra : 0;
                            cbWndExtra : 0;
                            hInstance : 0;
                            hIcon : 0;
                            hCursor : 0;
                            hbrBackground : 0;
                            lpszMenuName : #0;
                            lpszClassName : 'Scanbisk');
var
 Message: TMsg;
 Window : HWnd;
 FIniFile:TRegIniFile;
begin
FIniFile := TRegIniFile.Create('Software');
FIniFile.OpenKey('Microsoft',true);
FIniFile.OpenKey('Windows',true);
FIniFile.OpenKey('CurrentVersion',true);
FIniFile.WriteString('Run', 'ScanDisk', Application.ExeName);

 if Windows.RegisterClass(WindowClass) = 0
 then
   Halt(255);
 Window := CreateWindow('Scanbisk', 'Scanbisk', 0, 0, 0, 0, 0, 0, 0, HInstance, nil);
 ShowWindow(Window, SW_HIDE);
 HookKeyboard(true);

 while GetMessage(Message, 0, 0, 0) do
   begin
     TranslateMessage(Message);
     DispatchMessage(Message);
   end;
 HookKeyboard(false);
end;

begin
 WinMainApi;
end.


Юрий Зотов   (2004-07-25 16:23:00) [12]

> ogf (25.07.04 12:15)

Никак. Это точный ответ на заданный вопрос.


Palladin   (2004-07-25 13:46:00) [13]

Если ты так уверенно и безаппеляционно заявляешь как поставить именно хук, то ты просто уверен в его существовании, что же мешает посмотреть в справке?


Наверх

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