Entwickler-Ecke

Windows API - Tasten Blockieren


N47R0N - Mo 06.06.05 18:09
Titel: Tasten Blockieren
Ich möchte gerne wissen wie man bestimmte tastenkombinationen auserkraft setzen kann wie z.B ( ALT + F4 )

Danke


Moderiert von user profile iconChristian S.: Topic aus Sonstiges verschoben am Mo 06.06.2005 um 18:17


AG - Mo 06.06.05 18:57

ich würde denken, indem du selbst mit einer Methode darauf reagierst (OnKeyPressed mit Abfrage der gedrückten Tasten); die müßte dann aber wahrscheinlich allen deinen Komponenten zugeordnet werden...
Wenn es dir aber darauf ankommt, speziell das Schließen des Programms zu verhindern, kannst du ja bei OnClose das Schließen verhindern oder Abbrechen oder z.B. eine Paßwortabfrage einbinden - Schließen per Taskmanager geht dann aber trotzdem noch.


F34r0fTh3D4rk - Fr 10.06.05 13:35

es muss aber ne möglichkeit geben das auch per taskman zu verhindern, bei hdguard kommt zb ne fehler meldung :?


Delete - Fr 10.06.05 13:50

Forensuche!

Und was heißt "per Taskmanager verhindern"?


F34r0fTh3D4rk - Fr 10.06.05 13:51

ja den prozess unkillbar machen 8)


retnyg - Fr 10.06.05 13:53

user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
ja den prozess unkillbar machen 8)

ApiHook auf TerminateProcess und bei eigenem programm nicht zulassen


WeBsPaCe - Fr 10.06.05 13:53

user profile iconAG hat folgendes geschrieben:
Wenn es dir aber darauf ankommt, speziell das Schließen des Programms zu verhindern, kannst du ja bei OnClose das Schließen verhindern oder Abbrechen oder z.B. eine Paßwortabfrage einbinden - Schließen per Taskmanager geht dann aber trotzdem noch.

So

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caNone;
end;

oder so

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := False;
end;

;)


F34r0fTh3D4rk - Fr 10.06.05 13:55

user profile iconretnyg hat folgendes geschrieben:
user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
ja den prozess unkillbar machen 8)

ApiHook auf TerminateProcess und bei eigenem programm nicht zulassen


stimmt, sollte machbar sein, aber ich muss des doch nichmal global machen, sondern nur in den taskman reinladen, wenn der gerade gestartet ist, oder ?


retnyg - Fr 10.06.05 14:00

user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
user profile iconretnyg hat folgendes geschrieben:
user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
ja den prozess unkillbar machen 8)

ApiHook auf TerminateProcess und bei eigenem programm nicht zulassen


stimmt, sollte machbar sein, aber ich muss des doch nichmal global machen, sondern nur in den taskman reinladen, wenn der gerade gestartet ist, oder ?

dieser hook kann auch lokal sein, sprich muss gar nicht in andere prozesse injiziert werden, es reicht also wenn du es so machst wie bei uall@ogc's messagebox beispiel.


F34r0fTh3D4rk - Fr 10.06.05 14:06

ich hatte das beispiel mal, aber ich find des net wieder, wo gabs des ?


retnyg - Fr 10.06.05 14:09

user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
ich hatte das beispiel mal, aber ich find des net wieder, wo gabs des ?

ist bei der uallcollection dabei


F34r0fTh3D4rk - Fr 10.06.05 14:15

wie kriege ich denn die parameter von terminateprocess heraus ?


retnyg - Fr 10.06.05 14:19

user profile iconF34r0fTh3D4rk hat folgendes geschrieben:
wie kriege ich denn die parameter von terminateprocess heraus ?

indem du bei msdn suchst, oder dir das windows platform sdk von microsoft runterlädst.
Suche im MSDN TERMINATEPROCESS


retnyg - Fr 10.06.05 14:21

user profile iconretnyg hat folgendes geschrieben:

dieser hook kann auch lokal sein, sprich muss gar nicht in andere prozesse injiziert werden, es reicht also wenn du es so machst wie bei uall@ogc's messagebox beispiel.

wenn ich genauer drüber nachdenke, wird das wohl eher nicht gehen, da ja der fremde prozess den API-Call auf TerminateProcess macht. In deinem fall wirst du also in taskmgr.exe injizieren müssen ^^


F34r0fTh3D4rk - Fr 10.06.05 15:14

hatte ich ja doch recht :D


Delete - Fr 10.06.05 15:18

Was soll denn das eigentlich werden, wenn es fertig ist? :roll:


F34r0fTh3D4rk - Fr 10.06.05 15:43

kA, aber scheint net recht zu funzen, hab mir bissl code von uall zusammengeklaut ^^
hm "hook erfolgreich" wird ausgegeben, aber auch n fehler :shock:


Delphi-Quelltext
1:
form1.caption := 'test'//nur so nebenbei                    



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
//hook'n
procedure TForm1.Button1Click(Sender: TObject);
var
  pid: integer;
begin
  pid := uallProcess.FindProcess('taskmgr.exe');
  if pid = 0 then
    MessageBox(0'Prozess nicht gefunden!'nil0else
  begin
    if uallHook.InjectLibrary(pid, pchar(uallUtil.GetExeDirectory + 'hook.dll')) <> nil then
      MessageBox(0'Erfolgreich gehookt!'nil0else
        MessageBox(0'Hook fehlgeschlagen!'nil0);
  end;
end;


Delphi-Quelltext
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:
//Hook DLL
library hook;

uses
  windows;

{$R *.res}

var
  oldTerminateProcess: function(hProcess: THandle; UExitCode: UInt): boolean; stdcall;
  dll: integer;

function myTerminateProcess(hProcess: THandle; UExitCode: UInt): boolean;
begin
  if hProcess <> findwindow(nil'test'then
    oldTerminateProcess(hProcess, UExitCode); 
end;

procedure Phook(fromaddr, toaddr: pointer);
var
  b: ^byte;
  c: ^cardinal;
  old: cardinal;
begin
  virtualprotect(fromaddr, 5, PAGE_EXECUTE_READWRITE, old);
  b := fromaddr;
  b^ := $E9;
  c := pointer(cardinal(b) + 1);
  c^ := cardinal(toaddr) - 5 - cardinal(b);
  virtualprotect(fromaddr, 5, old, old);
end;

procedure memcopy(a,b: pointer; l: cardinal);
var old1, old2, i: cardinal;
    b1, b2: ^byte;
begin
  virtualprotect(a, l, PAGE_EXECUTE_READWRITE, old1);
  virtualprotect(b, l, PAGE_EXECUTE_READWRITE, old2);
  for i := 0 to l - 1 do
  begin
    b1 := pointer(cardinal(a) + i);
    b2 := pointer(cardinal(b) + i);
    b2^ := b1^;
  end;
  virtualprotect(a, l, old1, old1);
  virtualprotect(b, l, old2, old2);
end;

begin
  dll := getmodulehandle('Kernel32.dll');
  memcopy(getprocaddress(dll, 'TerminateProcess'), @oldTerminateProcess, 30);
  Phook(getprocaddress(dll, 'TerminateProcess'), @myTerminateProcess);
end.


retnyg - Fr 10.06.05 15:46

damit der hook funktioniert muss taskmgr.exe natürlich zur injektionszeit schon gestartet sein.
also machst du entweder nen timer der alle paar sek. prüft ob taskmgr.exe läuft und dann injizierst, oder du injizierst nen CreateProcess hook in alle laufenden prozesse, so dass du benachrichtigt wirst wenn ein neuer prozess gestartet wird. dort musst du dann natürlich dann auch wieder injizieren...


Delete - Fr 10.06.05 15:48

Ich frage noch mal, was soll das ganze? :roll:


F34r0fTh3D4rk - Fr 10.06.05 16:39

user profile iconretnyg hat folgendes geschrieben:
damit der hook funktioniert muss taskmgr.exe natürlich zur injektionszeit schon gestartet sein.
also machst du entweder nen timer der alle paar sek. prüft ob taskmgr.exe läuft und dann injizierst, oder du injizierst nen CreateProcess hook in alle laufenden prozesse, so dass du benachrichtigt wirst wenn ein neuer prozess gestartet wird. dort musst du dann natürlich dann auch wieder injizieren...

Zitat:

"hook erfolgreich" wird ausgegeben


user profile iconLuckie hat folgendes geschrieben:
Ich frage noch mal, was soll das ganze? :roll:


Zitat:
kA

ich hab das gestern bei hdguard gesehen und möchte das auch versuchen hinzubekommen, einfach nur so
Zitat:

es muss aber ne möglichkeit geben das auch per taskman zu verhindern, bei hdguard kommt zb ne fehler meldung


F34r0fTh3D4rk - Fr 10.06.05 19:33

so gehts:

Delphi-Quelltext
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:
library hook;

uses
  windows,
  uallHook in '..\..\source\uallHook.pas',
  sysutils;

var
  oldTerminateProcess, nextTerminateProcess: function(hProcess: THandle; UExitCode: UInt): BOOL; stdcall;

function myTerminateProcess(hProcess: THandle; UExitCode: UInt): boolean;
begin
  if hProcess <> findwindow(nil'test'then
    oldTerminateProcess(hProcess, UExitCode); 
end;

procedure injectmain;
var h: integer;
begin
  h :=  GetModuleHandle('kernel32.dll');
  if h > 0 then
  begin
    @oldTerminateProcess := GetProcAddress(h, 'TerminateProcess');
    if @oldTerminateProcess <> nil then
      uallHook.HookCode(@oldTerminateProcess, @myTerminateProcess, @nextTerminateProcess);
  end;
end;

procedure uninjectmain;
begin
  uallHook.UnhookCode(@nextTerminateProcess);
end;

procedure dllmain(dwReason: integer);
begin
  case dwreason of
    DLL_PROCESS_ATTACH:
      injectmain;
    DLL_PROCESS_DETACH:
      uninjectmain;
  end;
end;

begin
  DLLProc := @DLLMain;
  DLLMain(1);
end.

Der Taskman killt sich dann selbst aber der Prozess bleibt stehen :mrgreen: