Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Keyhook und Vista... (https://www.delphipraxis.net/107144-keyhook-und-vista.html)

moshhc 23. Jan 2008 00:30


Keyhook und Vista...
 
Hallo Leute...

Kleines Problem..

Folgendes.. Ich habe einen Keyhook den ich systemweit setzte (funktionierte unter XP wunderbar) warte auf ein bestimmtes wort, was irgendwo eingeben werden kann (z.B.: unter Ausführen) dann kommt das Fenster in den Vordergrund.. Soweit verstanden? jetzt kommt mein GELIEBTES VISTA!!! :evil:
Ich starte die Exe datei im "normalen" Modus... also nix Admin.. alles Funktioniert!!! Jetzt kommt es!! Wenn ich die exe ALS ADMIN STARTE, dann kann ich nur die Keys abfangen die ich innerhalb meines Fensters schreibe... NICHT SYSTEMWEIT...

Hier der quellcode der dll.. ich denke denn werdet ihr schon mal gesehen haben...

Delphi-Quellcode:
library HookLib;



uses
  Windows,
  Messages,
  SysUtils;

type
  PHookRec = ^THookRec;
  THookRec = record
    AppHnd: Integer;
    MemoHnd: Integer;
  end;

var
  Hooked: Boolean;
  hKeyHook, hMemo, hMemFile, hApp: HWND;
  PHookRec1: PHookRec;

function KeyHookFunc(Code, VirtualKey, KeyStroke: Integer): LRESULT; stdcall;
var
  KeyState1: TKeyBoardState;
  AryChar: array[0..1] of Char;
  Count: Integer;
begin
  Result := 0;
  if Code = HC_NOREMOVE then Exit;
  Result := CallNextHookEx(hKeyHook, Code, VirtualKey, KeyStroke);
  if Code < 0 then
    Exit;

  if Code = HC_ACTION then
  begin
    if ((KeyStroke and (1 shl 30)) <> 0) then
      if not IsWindow(hMemo) then
      begin
        hMemFile := OpenFileMapping(FILE_MAP_WRITE, False, 'Global7v9k');
        PHookRec1 := MapViewOfFile(hMemFile, FILE_MAP_WRITE, 0, 0, 0);
        if PHookRec1 <> nil then
        begin
          hMemo := PHookRec1.MemoHnd;
          hApp := PHookRec1.AppHnd;
        end;
      end;
    if ((KeyStroke and (1 shl 30)) <> 0) then
    begin
      GetKeyboardState(KeyState1);
      Count := ToAscii(VirtualKey, KeyStroke, KeyState1, AryChar, 0);
      if Count = 1 then
      begin
        SendMessage(hMemo, WM_CHAR, Ord(AryChar[0]), 0);
        PostMessage(hApp, WM_USER + 1678, Ord(AryChar[0]), 0);
      end;
    end;
  end;
end;


function StartHook(MemoHandle, AppHandle: HWND): Byte; export;
begin
  Result := 0;
  if Hooked then
  begin
    Result := 1;
    Exit;
  end;
  if not IsWindow(MemoHandle) then
  begin
    Result := 4;
    Exit;
  end;
  hKeyHook := SetWindowsHookEx(WH_KEYBOARD, KeyHookFunc, hInstance, 0);
  if hKeyHook > 0 then
  begin
    hMemFile := CreateFileMapping($FFFFFFFF, // $FFFFFFFF gets a page memory file
      nil,               // no security attributes
      PAGE_READWRITE,    // read/write access
      0,                 // size: high 32-bits
      SizeOf(THookRec),  // size: low 32-bits
      //SizeOf(Integer),
      'Global7v9k');   // name of map object
    PHookRec1 := MapViewOfFile(hMemFile, FILE_MAP_WRITE, 0, 0, 0);
    hMemo := MemoHandle;
    PHookRec1.MemoHnd := MemoHandle;
    hApp := AppHandle;
    PHookRec1.AppHnd := AppHandle;
    {set the Memo and App handles to the mapped file}
    Hooked := True;
  end
  else
    Result := 2;
end;

function StopHook: Boolean; export;
begin
  if PHookRec1 <> nil then
  begin
    UnmapViewOfFile(PHookRec1);
    CloseHandle(hMemFile);
    PHookRec1 := nil;
  end;
  if Hooked then
    Result := UnhookWindowsHookEx(hKeyHook)
  else
    Result := True;
  Hooked := False;
end;

procedure EntryProc(dwReason: DWORD);
begin
  if (dwReason = Dll_Process_Detach) then
  begin
    if PHookRec1 <> nil then
    begin
      UnmapViewOfFile(PHookRec1);
      CloseHandle(hMemFile);
    end;
    UnhookWindowsHookEx(hKeyHook);
  end;
end;

exports
  StartHook,
  StopHook;

begin
  PHookRec1 := nil;
  Hooked := False;
  hKeyHook := 0;
  hMemo := 0;
  DLLProc := @EntryProc;
  EntryProc(Dll_Process_Attach);
end.
Danke euch schonmal im Voraus..

Euer Moshi

Bernhard Geyer 23. Jan 2008 06:11

Re: Keyhook und Vista...
 
Zitat:

Zitat von moshhc
Ich starte die Exe datei im "normalen" Modus... also nix Admin.. alles Funktioniert!!! Jetzt kommt es!! Wenn ich die exe ALS ADMIN STARTE, dann kann ich nur die Keys abfangen die ich innerhalb meines Fensters schreibe... NICHT SYSTEMWEIT..

"As Designed" um eine beliebte Angriffsfläche von nicht Priviligierten (z.B. IE) auf Systemprogramme (wie Firewall) nicht zu ermöglichen ist z.B. auch DDE (z.B. Drag&Drop von Dateien aus dem Windows Explorer auf das Editfenster einer als Admin laufenden Anwendung nicht möglich).

moshhc 23. Jan 2008 12:05

Re: Keyhook und Vista...
 
Jetzt mal im ernst, wenn es doch umgekehrt nicht funktionieren würde, dann wäre das ja logisch, aber als Admin ausgeführte exe nicht - das eröffnet doch viren und anderen zeugs doch tür und tor, wenn ich mit einer normal ausgeführten exe systemweit die Tastatur auslesen kann und als Admin-exe nicht!!!

Habe sogar der dll, die ich nutze, ein vista manifest gegeben.. aber PUSTEKUCHEN...

:pale:

Luckie 23. Jan 2008 12:17

Re: Keyhook und Vista...
 
Melde dich mal als Admin an und probiere es dann noch mal.

Aber das ist schon richtig. Du kannst unter Vista nicht mehr auf Prozesse zugreifen, die in einem anderen Benutzerkontext laufen.

Bernhard Geyer 23. Jan 2008 12:18

Re: Keyhook und Vista...
 
Zitat:

Zitat von moshhc
Jetzt mal im ernst, wenn es doch umgekehrt nicht funktionieren würde, dann wäre das ja logisch, aber als Admin ausgeführte exe nicht - das eröffnet doch viren und anderen zeugs doch tür und tor, wenn ich mit einer normal ausgeführten exe systemweit die Tastatur auslesen kann und als Admin-exe nicht!!!

Kannst du mit dem Hook mit normalen Rechten eine als Admin gestartete App hooken?

Aber es könnte auch sein das dieser Teil der Abschottung der Eingabe (primär wegen DRM) wieder aus Vista wegen "Wir schaffen es nicht bis 2010 und den Code kann keiner verstehen" gestrichen wurde :gruebel:

moshhc 23. Jan 2008 12:30

Re: Keyhook und Vista...
 
Ich bin als admin user angemeldet... Also nochmal..

Ich klick zwei mal auf meine EXE... Dann klapt es mit dem Hook systemweit..
Ich klicke rechts auf die EXE sage "Als Administrator starten" und siehe da nix mehr systemweit...

Das problem an der ganzen sache ist ja, das mein Programm als Adminausgeführt laufen muss.. sonst kann es gewisse einträge in der Registry und dateizugriffe nicht machen..

RavenIV 23. Jan 2008 12:43

Re: Keyhook und Vista...
 
Zitat:

Zitat von moshhc
Ich bin als admin user angemeldet... Also nochmal..

Ich klick zwei mal auf meine EXE... Dann klapt es mit dem Hook systemweit..
Ich klicke rechts auf die EXE sage "Als Administrator starten" und siehe da nix mehr systemweit...

Das kann ich mir so erklären:
Wenn Du als Admin angemeldet bist, kannst Du auf das ganze System zugreifen. Ist ja klar.
Als Benutzer angemeldet und das Programm mit "Run as Admin" ausgeführt, ist das anderst.
Dann gibt es zwei getrennte Benutzerkontexte. Und der "Run as Admin"-Prozess kann eben nur auf seinen gekapselten Kontext zugreifen. Also nicht systemweit.

moshhc 23. Jan 2008 12:59

Re: Keyhook und Vista...
 
Das klingt ja schonmal logisch.. nur leider ist der User voll-Admin, also ist das ja wiederum unlogisch oder muss ich da bei vista noch irgendwas lustiges beachten.. Mittlerweile habe ich keine lust mehr, für Vista was zu entwickeln... das ist ja wie mit nem Trabi übern Acker fahren...

Bernhard Geyer 23. Jan 2008 13:29

Re: Keyhook und Vista...
 
Zitat:

Zitat von moshhc
Das klingt ja schonmal logisch.. nur leider ist der User voll-Admin, also ist das ja wiederum unlogisch oder muss ich da bei vista noch irgendwas lustiges beachten..

Ja. Prozesse werden auch beim Admin mit aktiven UAC standardmäßig ohne Adminrechte gestartet. Erst wenn man den entsprechenden UAC-Dialog bestätigt bekommt der Prozess beim Start Adminrechte.

RavenIV 23. Jan 2008 13:30

Re: Keyhook und Vista...
 
Zitat:

Zitat von moshhc
Das klingt ja schonmal logisch.. nur leider ist der User voll-Admin, also ist das ja wiederum unlogisch oder muss ich da bei vista noch irgendwas lustiges beachten..

Das ist doch egal.
Es existieren durch das "Run as" zwei Benutzerkontexte.
Und keiner der beiden Kontexte kann auf den anderen zugreifen.

Zitat:

Zitat von moshhc
Mittlerweile habe ich keine lust mehr, für Vista was zu entwickeln... das ist ja wie mit nem Trabi übern Acker fahren...

/offtopic
Ist eher, als ob man mit einem aktuellen übertechnologosierten Auto einen HotWeel-Start hinlegen möchte. Das geht auch nicht, weil die Elektronik das Durchdrehen der Räder verhindert. Man kann auch nicht auf einer verschneiten Strasse eine Schlitterfahrt machen wegen der Elektronik.
Das bringt die Modernisierung halt so mit sich. :-(


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:05 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz