this slowpoke moves

Shell Hook

Die Schnittstelle zum Betriebssystem wird als Shell bezeichnet. Die Shell ist die äußere Schicht des Betriebssystems. Shells besitzen eine Programmiersprache für die Steuerung von Prozessen und Dateien sowie für das Starten und Steuern anderer Programme.

Der Hook ist eine ausführbare Datei, die der Shell-Operator ausführt, wenn ein bestimmtes Ereignis eintritt . Es kann sich dabei um ein Skript oder ein kompiliertes Programm handeln, das in einer beliebigen Programmiersprache geschrieben ist.

Um diese Schnittstelle komplett zu überwachen, muss ein Programm erstellt werden, das beides miteinander verbindet und auswertet.

Das lässt sich einfach mit einem Hook-Treiber erledigen, der natürlich erstmal gebaut werden muss.

Schritt 1:
Legt einen neuen Ordner an und erstellt in dem Ordner die Datei "SHELLHook.dpr" und speichert es.

Schritt 2:
Nun kopiert ihr den folgenden Code in diese Datei und kompiliert ihn mit Delphi.
Es wird der Treiber "SHELLHook.dll" gebaut.

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. 
Schritt 3 : 
 Schließt Delphi und legt ein neues Projekt an, welches ihr im selben Ordner speichert.  

Schritt 4 : 
 Es wird auf der Form benötigt: 1xListview (vsReport), 2xButton, 1xImageList
uses ExtCtrls, ShlObj, ActiveX, ShellAPI, PsAPI, ImgList

protected
    procedure WndProc(var Msg: TMessage); override;
    
var
  Form1: TForm1;
  MHSHELL_WINDOWACTIVATED: Cardinal;
  MHSHELL_WINDOWCREATED: Cardinal;
  MHSHELL_WINDOWDESTROYED: Cardinal;
  HookEnable: Boolean = False;

  function StartMouseHook(State: Boolean; Wnd: HWND): Boolean; stdcall; external 'SHELLHook.dll';
  function StopMouseHook(): Boolean; stdcall; external 'SHELLHook.dll';
  
//

function GetIcon(const FileName: string):
  TIcon;
var
  FileInfo: TShFileInfo;
  ImageList: TImageList;
begin
  Result := TIcon.Create;
  ImageList := TImageList.Create(nil);
  FillChar(FileInfo, Sizeof(FileInfo), #0);
  ImageList.ShareImages := true;
  ImageList.Handle := SHGetFileInfo(
    PChar(FileName),
    SFGAO_SHARE,
    FileInfo,
    SizeOf(FileInfo),
    SHGFI_SMALLICON or SHGFI_SYSICONINDEX
    );
  ImageList.GetIcon(FileInfo.iIcon, Result);
  ImageList.Free;
end;

function GetWndClassName(Wnd: HWND): String;
var
  WndClassName: array[0..256] of Char;
begin
  if GetClassName(Wnd, WndClassName, 256) <> 0 then
    Result:= WndClassName
  else
    Result:= '';
end;

function GetWndExePath(Wnd: HWND): String;
var
  ProcessHandle: THANDLE;
  ProcessId: DWORD;
  ExePath: array[0..256] of Char;
begin
  GetWindowThreadProcessId(Wnd, ProcessId);
  ProcessHandle:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessId);
  if GetModuleFileNameEx(ProcessHandle, 0, ExePath, 256) <> 0 then
    Result:= ExePath
  else
    Result:= '';
end;

procedure TForm1.WndProc(var Msg: TMessage);
begin
  inherited;
  if (Msg.Msg = MHSHELL_WINDOWCREATED) then
  begin
    ImageList1.AddIcon(GetIcon(GetWndExePath(Msg.LParam)));
    with ListView1.Items.Insert(0) do
    begin
      Caption:= 'HSHELL_WINDOWCREATED';
      SubItems.Add(GetWndClassName(Msg.LParam));
      SubItems.Add(GetWndExePath(Msg.LParam));
      SubItems.Add(IntToStr(Msg.LParam));
      ImageIndex:= ImageList1.Count - 1;
      Data:= Pointer(clLime);
    end;
  end;
  if (Msg.Msg = MHSHELL_WINDOWDESTROYED) then
  begin
    ImageList1.AddIcon(GetIcon(GetWndExePath(Msg.LParam)));
    with ListView1.Items.Insert(0) do
    begin
      Caption:= 'HSHELL_WINDOWDESTROYED';
      SubItems.Add(GetWndClassName(Msg.LParam));
      SubItems.Add(GetWndExePath(Msg.LParam));
      SubItems.Add(IntToStr(Msg.LParam));
      ImageIndex:= ImageList1.Count - 1;
      Data:= Pointer(clRed);
    end;
  end;
  if (Msg.Msg = MHSHELL_WINDOWACTIVATED) then
  begin
    ImageList1.AddIcon(GetIcon(GetWndExePath(Msg.LParam)));
    with ListView1.Items.Insert(0) do
    begin
      Caption:= 'HSHELL_WINDOWACTIVATED';
      SubItems.Add(GetWndClassName(Msg.LParam));
      SubItems.Add(GetWndExePath(Msg.LParam));
      SubItems.Add(IntToStr(Msg.LParam));
      ImageIndex:= ImageList1.Count - 1;
      Data:= Pointer(RGB(240, 240, 240));
    end;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if HookEnable <> False then
    StopMouseHook;
end;

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  Sender.Canvas.Brush.Color := TColor(Item.Data);
end;
Hook Starten :
procedure TForm1.Button1Click(Sender: TObject);
begin
 if StartMouseHook(True, Handle) = True then
  begin
    HookEnable:= True;
    Button1.Enabled:= False;
    Button2.Enabled:= True;
  end;
end;
Hook Stoppen :
procedure TForm1.Button2Click(Sender: TObject);
begin
  if StopMouseHook = True then
  begin
    HookEnable:= False;
    Button1.Enabled:= True;
    Button2.Enabled:= False;
  end;
end;
Hook initialization :
initialization
  MHSHELL_WINDOWACTIVATED:= RegisterWindowMessage('MHSHELL_WINDOWACTIVATED');
  MHSHELL_WINDOWCREATED:= RegisterWindowMessage('MHSHELL_WINDOWCREATED');
  MHSHELL_WINDOWDESTROYED:= RegisterWindowMessage('MHSHELL_WINDOWDESTROYED');
end.

Keine Kommentare:

Kommentar veröffentlichen

Beliebte Posts

Translate