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