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
Christian 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
F34r0fTh3D4rk 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
AG 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
retnyg hat folgendes geschrieben: |
F34r0fTh3D4rk 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
F34r0fTh3D4rk hat folgendes geschrieben: |
retnyg hat folgendes geschrieben: | F34r0fTh3D4rk 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
F34r0fTh3D4rk 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
F34r0fTh3D4rk 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.
TERMINATEPROCESS
retnyg - Fr 10.06.05 14:21
retnyg 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'; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.Button1Click(Sender: TObject); var pid: integer; begin pid := uallProcess.FindProcess('taskmgr.exe'); if pid = 0 then MessageBox(0, 'Prozess nicht gefunden!', nil, 0) else begin if uallHook.InjectLibrary(pid, pchar(uallUtil.GetExeDirectory + 'hook.dll')) <> nil then MessageBox(0, 'Erfolgreich gehookt!', nil, 0) else MessageBox(0, 'Hook fehlgeschlagen!', nil, 0); 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:
| 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
retnyg 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
|
Luckie hat folgendes geschrieben: |
| Ich frage noch mal, was soll das ganze? :roll: |
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:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!