IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Problème exécutable : hook et fonctions exportées


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Freelance
    Inscrit en
    Avril 2003
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Avril 2003
    Messages : 393
    Par défaut Problème exécutable : hook et fonctions exportées
    Bonjour à tous,

    Je vous explique mon problème:

    J'ai un executable qui possède une fonction exportée. Nommons la exe_fn1.
    J'ai une DLL qui possède une fonction exportée dll_fn1.

    - exe_fn1 ne fait qu'ajouter bêtement un texte dans une listeBox de l'executable..
    - dll_fn1 initialise un hook WH_CBT

    Il n'y aucun problème au niveau du hook, je récupère bien les messages.

    Par contre, je galère pour faire communiquer ma DLL et mon executable dans le sens DLL -> executable.

    Pour cela, ma DLL, à l'initialisation du Hook, recupere l'adresse de exe_fn1.

    Dans la fonction callback du hook WH_CBT, à chaque message recu, je veux appeler exe_fn1 pour qu'un texte s'affiche sur la listeBox.
    Sauf que dès lors que exe_fn1 est appelée, cela fige direct le programme, plante mon explorer, ..., enfin bref la galère.
    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    static LRESULT CALLBACK CBTCallback(int code, WPARAM wparam, LPARAM lparam)
    {
    	if (code >= 0)
    	{
    		UINT msg = 0;
    
    		if (code == HCBT_ACTIVATE)
    			exe_fn1 (); // crash
            }
            return CallNextHookEx(hookCbt, code, wparam, lparam);
    }
    Si vous avez une idée, faites moi signe

    PS: Selon vous, quel est le meilleur moyen pour faire communiquer une DLL et un executable pour passer des structures par exemple. J'ai choisi les fonctions exportees, mais ce n'est peut etre pas la meilleur methode.

    Merci.

    Vince

    http://vroy1.free.fr/wpfr/

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 470
    Par défaut
    Votre dll sera injectée dans tous les exécutables, le votre qui à la fonction exe_fn1 mais aussi les autres qui ne l'ont pas.

    Déjà, réussir à linker statiquement une dll à un exe, c'est chercher un peu les emmerdes. Je ne savais pas que cela était facilement réalisable.

    C'est toute à fais illogique d'avoir une dll qui dépend d'un exécutable.

    Si votre dll doit communiquer avec votre exécutable, utilisez n'importe quel IPC (mémoire mappé, socket, pipe ....) pour qu'ils communiquent de manière sûre.

  3. #3
    Membre chevronné
    Profil pro
    Freelance
    Inscrit en
    Avril 2003
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Avril 2003
    Messages : 393
    Par défaut
    Bonjour,

    Tout d'abord merci pour votre réponse.

    Je veux préciser un point important quand même. La fonction exe_fn1 fonctionne très bien en dehors de la procédure callback CBTCallback.

    Donc je ne vois pas pourquoi cela ne fonctionne pas dans la procédure CBTCallback.

    Merci.

    Vincent.

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 470
    Par défaut
    je recapépète, la procédure callback CBTCallback est appelée dans le contexte d'autres exécutables, via injection de dll dans les espaces mémoires de tous les exécutables. Oui le hooking est un peu intrusif, juste un peu/
    Les autres fonctions de la dll sont aussi injectées mais pas appelées dans l'espace mémoire d'un autre programme, CBTCallback si.

    Si vous appelez CBTCallback directement depuis votre programme, ça marchera aussi, puisque vous n'avez pas changé d'espace mémoire (c'est celui du programme appelant).

    Il faudrait penser à vérifier ce qu'est un espace mémoire et de l'injection de dll.

  5. #5
    Membre chevronné
    Profil pro
    Freelance
    Inscrit en
    Avril 2003
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Avril 2003
    Messages : 393
    Par défaut
    Bonjour Bacelar,

    Merci pour tes conseils. J'ai finalement opté pour l'API SendNotifyMessage qui fonctionne très bien.

    Sinon j'aurais une autre question. Je voudrais détecter et récupérer chaque modification d'un champ de saisie (chaque fois que l'utilisateur saisi quelque chose). Je sais que je peux récupérer ca avec les messages keyboard, mais je me demandais s'il n'y avait pas un message windows spécifique.

    Merci.

    Vincent

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 470
    Par défaut
    Je tenterais le subclassing de la fenêtre.

    http://msdn.microsoft.com/en-us/libr...69(VS.85).aspx

    Attention, si vous êtes dans de l'injection de dll, les adresses dans le code (les pointeurs de fonction par exemple) peuvent varier d'un exécutable à l'autre. Il faut les calculer pour chaque programme.

Discussions similaires

  1. Problème d'exécution d'une fonction
    Par Jiyuu dans le forum Tkinter
    Réponses: 14
    Dernier message: 04/09/2008, 23h36
  2. [SSH2] problème d'exécution avec la fonction ssh2_exec
    Par boriskov dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 07/08/2008, 17h18
  3. problème avec l'exécution d'une fonction
    Par b_reda31 dans le forum Images
    Réponses: 2
    Dernier message: 31/05/2008, 13h50
  4. Réponses: 1
    Dernier message: 13/12/2006, 14h18
  5. [PHP-JS] Problème exécution fonction php avec js
    Par cokilulu dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 15/03/2006, 21h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo