Hook sans dll, c'est possible , mais comment ? [Résolu]

jace1975 84 Messages postés mardi 31 mai 2005Date d'inscription 12 octobre 2007 Dernière intervention - 3 nov. 2005 à 20:34 - Dernière réponse : jace1975 84 Messages postés mardi 31 mai 2005Date d'inscription 12 octobre 2007 Dernière intervention
- 5 nov. 2005 à 15:34
salut à tous

je travaille actuellement sur une application, pour me permettre notamment de killer immédiatement le processus en cours via un raccourci clavier (genre shift F4 et le jeu auquel vous jouez se ferme immédiatement juste quand le boss rentre dans le bureau )

Je m'inspire en fait d'une application qu'un collègue m'as passé et qui se revèle indispensable très rapidement(Si vous souhaitez l'avoir demander moi par mail) , auquel je voudrais rajouter quelques fonctionnalités (que j'ai dejà dvlpé mais il me manque le principal )
Deux problèmes pour le développement :

- J'aimerais, à l'instar de l'appli que je cite briévement, me passer de toutes dll (après de longues recherche sur internet je n'ai pas réussi à trouver le début d'une piste pour m'en passer). si quelqu'un a une idée je suis preneur

- je n'arrive pas à récupérer le processus de l'application en cours, la procédure que j'utilise me renvoie systématiquement mon programme à cause je pense du hook et de son implémentation dans mon pgm. Si quelqu'un c'est faire ça, qu'il n'hésites pas à répondre , je galère depuis un bout de temps.

Thxs par avance
Afficher la suite 

5 réponses

Répondre au sujet
WhiteHippo 1270 Messages postés samedi 14 août 2004Date d'inscription 5 avril 2012 Dernière intervention - 4 nov. 2005 à 00:15
+3
Utile
Après quelques tests rapides, voilà ce à quoi j'ai abouti :

type
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT ;
KBDLLHOOKSTRUCT = record
vkCode : DWORD ;
scanCode : DWORD ;
flags : DWORD ;
time : DWORD ;
dwExtraInfo : PULONG ;
end ;


var
HookClavier : HHOOK ;


function MonGestionnaireClavier(code: Integer; w: WPARAM; l: LPARAM):LRESULT; stdcall ;
var
infos : PKBDLLHOOKSTRUCT ;
begin
infos := PKBDLLHOOKSTRUCT(L) ;
if ( Code>=0) then
begin
// ici ton code de gestion du clavier
// Par exemple : Form1.Memo1.Text := inttostr(infos^.vkCode);
end ;
Result:= CallNextHookEx(HookClavier, Code, w, l);
end ;


function InstallationDuHook : HHOOK ;
const
WH_KEYBOARD_LL = 13 ;
begin
Result := SetWindowsHookEx ( WH_KEYBOARD_LL, @MonGestionnaireClavier, GetModuleHandle(NIL), 0 ) ;
end ;


procedure RetraitDuHook ( Hook : HHOOK ) ;
begin
UnhookWindowsHookEx( Hook ) ;
end ;


// Exemple d'appel pour l'installation du hook :
// HookClavier := InstallationDuHook ;
//
// Exemple d'appel pour le retrait du hook :
// RetraitDuHook ( HookClavier ) ;


Ceci n'est qu'une ébauche, facilement extensible en fonction de tes besoins.

N.B. La structure KBDLLHOOKSTRUCT est détaillée ici :

=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookstructures/kbdllhookstruct.asp http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookstructures/kbdllhookstruct.asp

Cordialement.



<HR>



Il existe 10 catégories de personne. Ceux qui connaissent le binaire et les autres...
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de WhiteHippo
Abadianet 50 Messages postés mercredi 2 novembre 2005Date d'inscription 19 juin 2006 Dernière intervention - 4 nov. 2005 à 00:18
+3
Utile
Tu as 2 liens utiles sur les Hook

http://phidels.com/php/index.php3?page=../php/hook/hooks.htm&id=181

http://tcharles.developpez.com/simul/?delphi=1

Peut-être tu y trouveras une solution

Pour la récupération du processus, voici une fonction que j'utilise pour vérifier si un processus tourne, tu devrais en tirer quelque chose

function ProcessEnCours(ProgName: String): Boolean;
{ Cette fonction vérifie qu'un process fournit en paramétre (ex : outlook.exe) est en cours }
var Snaph: thandle;
Proc : tprocessentry32;
PId : cardinal;
begin
PId := 0;
Proc.dwSize := sizeof(Proc);
Snaph := createtoolhelp32snapshot(TH32CS_SNAPALL, 0); // récupere une capture de process
process32first(Snaph, Proc); // premier process de la list
if AnsiUpperCase(extractfilename(Proc.szExeFile)) = AnsiUpperCase(ProgName) then // test pour savoir si le process correspond
PId := Proc.th32ProcessID // récupere l'id du process
else
begin
while process32next(Snaph,Proc) do //dans le cas contraire on continue à cherche le process en question
begin
if AnsiUpperCase(extractfilename(Proc.szExeFile)) = AnsiUpperCase(ProgName) then
PId := Proc.th32ProcessID;
end;
end;
Closehandle(Snaph);
result := (PId <> 0);
end;

Bon courage
Abadiane
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Abadianet
Abadianet 50 Messages postés mercredi 2 novembre 2005Date d'inscription 19 juin 2006 Dernière intervention - 4 nov. 2005 à 00:21
+3
Utile
Je refais le message, que j'espère plus lisible

Pour les hook, 2 adresses :

http://tcharles.developpez.com/simul/?delphi=1
http://phidels.com/php/index.php3?page=../php/hook/hooks.htm&id=181

Pour la récupération du processus, voici une fonction que j'utilise pour vérifier si un processus tourne, tu devrais en tirer quelque chose :

function ProcessEnCours(ProgName: String): Boolean;
{ Cette fonction vérifie qu'un process fournit en paramétre (ex : outlook.exe) est en cours }
var Snaph: thandle;
Proc : tprocessentry32;
PId : cardinal;
begin
PId := 0;
Proc.dwSize := sizeof(Proc);
Snaph := createtoolhelp32snapshot(TH32CS_SNAPALL, 0); // récupere une capture de process
process32first(Snaph, Proc); // premier process de la list
if AnsiUpperCase(extractfilename(Proc.szExeFile)) = AnsiUpperCase(ProgName) then // test pour savoir si le process correspond
PId := Proc.th32ProcessID // récupere l'id du process
else
begin
while process32next(Snaph,Proc) do //dans le cas contraire on continue à cherche le process en question
begin
if AnsiUpperCase(extractfilename(Proc.szExeFile)) = AnsiUpperCase(ProgName) then
PId := Proc.th32ProcessID;
end;
end;
Closehandle(Snaph);
result := (PId <> 0);
end;

Abadiane
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Abadianet
jace1975 84 Messages postés mardi 31 mai 2005Date d'inscription 12 octobre 2007 Dernière intervention - 5 nov. 2005 à 15:34
+3
Utile
finalement la solution suivante pour mon deuxième pb (le code est ce qu'il est, à optimiser évidemment) :

type
Tcodepid = record
num_proc:integer;
numthread:integer;
end;

function EnumProcess: Tcodepid; stdcall;
var
dwPid, dwParent: DWORD;
resultat:tcodepid;
begin
dwParent := GetWindowThreadProcessId( GetForegroundWindow , dwPid); //on obtien le PID de hHandle, la fonction renvoye le PID du thread qui l'a crée
resultat.num_proc:=dwPid;
resultat.numthread:=dwparent;
result:=resultat;
end;

et dans le gestionnaire

....
if infos^.vkCode=115 then
begin
if form1.ProgEnCours( ExtractFileName(application.ExeName)) <>EnumProcess.num_proc then
begin
if form1.ProgEnCours( 'Explorer.exe') <>EnumProcess.num_proc then
begin
TOKILL:=EnumProcess.num_proc;
codea:= Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE,BOOL(0),TOKILL),0));
end;
end;
end;
....

ca marche très bien( après avoir compris le role de infos^.flags !!!). j'ai modifié par contre la fonction de abadianet pour que les comparaisons se fassent sur de l'uppercase.

petite explication supplémentaire, je filtre pour ne pas killer ni mon pgm (ramener systematiquement par enumprocess) , ni explorer.exe, ce qui peut se révéler gênant.

merci encore pour votre précieuse aide
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de jace1975
jace1975 84 Messages postés mardi 31 mai 2005Date d'inscription 12 octobre 2007 Dernière intervention - 4 nov. 2005 à 18:16
0
Utile
Merci pour le hook whitehippo, ca marche nickel chrome tout bien comme il faut.

De plus j'ai constaté que l'exécution est plus rapide qu'en passant par une dll. Par contre je dois remapper toutes les touches car le resultat de vkCode différe de ce que j'obtenais précédemment (pas pour toutes les touches d'ailleurs), mais bon ca c'est mon problème.

Résultat je vais me plonger plus attentivement dans msdn !!!

Concernant l'autre problème merci abianet pour le code mais j'ai déjà exploré cette piste. ce qui m'intéresse en fait c'est le processus en cours d'execution (on ne compte pas mon pgm et on ne connait pas son nom), qui ne marchait pas sans doute à cause du HOOK avec dll. Dès que j'ai trouvé le code, je le poste.

Merci encore une fois pour vos réponses rapides et fructueuses.
Commenter la réponse de jace1975

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.