[Nasm - Alink - WIn32] Probleme avec SetWindowsHookEx

Messages postés
449
Date d'inscription
jeudi 26 août 2004
Statut
Membre
Dernière intervention
5 mars 2009
- - Dernière réponse : cs_jean84
Messages postés
449
Date d'inscription
jeudi 26 août 2004
Statut
Membre
Dernière intervention
5 mars 2009
- 4 déc. 2007 à 19:15
Salut à tous ;)
Je me permet de poser une chtite question car après avoir passé du temps à chercher la réponse à mon problème, bah j'ai toujours pas trouvé...
Alors voila : je code un programme afin de mieux comprendre les hooks. J'ai un programme en 2 parties : une partie dll écrite en ASM (assemblée avec nasm) et l'autre écrite en C (même si pour l'instant le programme de test est en ASM en fait).
A l'assemblage et au linkage, tout va bien. Mais à l'éxécution, j'ai une splendide erreur du style "Le point d'entrée de procédure SetWindowsHookEx est introuvable dans la bibliothèque de liaisons dynamique USER32.dll"

Voici le code en question (tout est simplifie, je veux juste faire appelle à la fonction donc il manque encore pas mal de choses) :

; Section externes
[EXTERN MessageBoxA]
[EXTERN SetWindowsHookEx]

; Section des imports
[IMPORT MessageBoxA user32.dll]
[IMPORT SetWindowsHookEx user32.dll]

; Section des exportations des fonctions presentes dans la dll
[GLOBAL TestFunc]
[GLOBAL SetHook]
[EXPORT TestFunc]
[EXPORT SetHook]

[SEGMENT CODE USE32 CLASS=CODE]
    ..start
        mov eax, 1
        ret 12

    ; Fonction de test
    TestFunc
        push dword 0
        push dword MsgTitle
        push dword MsgText
        push dword 0
        call [MessageBoxA]
        ret
       
    ; Mise en place du crochet clavier
    SetHook:
        push dword 0
        push dword KeyboardHookProc
        push dword 2 ; WH_KEYBOARD = 2
        call [SetWindowsHookEx]
       
        ; Verification
        cmp eax, 0
            jmp __HOOK_FAILED__
        jmp __HOOK_SUCCESS__
       
        __HOOK_FAILED__:
            push dword 0
            push dword MsgFailed
            push dword MsgTitle
            push dword 0
            jmp __END__
           
        __HOOK_SUCCESS__:
            push dword 0
            push dword MsgGood
            push dword MsgTitle
            push dword 0
            mov dword [HandleHook], eax
            jmp __END__
           
        __END__:
        ret
       
    ; Fonction CallBack
    KeyboardHookProc:   
        ret
       
[SEGMENT DATA USE32 CLASS=DATA]
    MsgTitle    db    "DLL", 0
    MsgText        db    "En bref voici du texte a l'interieur de ma DLL", 10, 13, "Ici je saute une ligne ;-)", 0
    MsgFailed    db    "Echec de la mise en place du hook", 0
    MsgGood        db  "Hook En place ;-)", 0

[SEGMENT BSS USE32 CLASS=BSS]
    HandleHook    resd    1

Pour info, la fonction Test marche impec' et il semble que SetHook également mais à l'appel de la fonction SetWindowsHookEx(), tout foire :s

Si quelqu'un pouvait m'aider sa serait super

Merki ++
Afficher la suite 

3 réponses

Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
0
Merci
Bonjour jean84,

Ne serait-ce pas parce que le nom de la fonction de hook devrait être SetWindowsHookExA ou SetWindowsHookExW.
Tels sont les deux noms exportés de user32.dll (Win2000).


A+
Commenter la réponse de cs_Nasman
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
0
Merci
>jean84,
Aussi une chose: Tu utilises SetWindowsHookEx(AouW) avec 3 paramètres seulement. Si cette fonction marche avec 3 paramètres (ce dont je doute) tu auras tôt ou tard un plantage du type violation privilège.

Après il y aura quelques optimisations possibles du code...

A+
Commenter la réponse de cs_Nasman
Messages postés
449
Date d'inscription
jeudi 26 août 2004
Statut
Membre
Dernière intervention
5 mars 2009
0
Merci
Hello

Bon pour le A ou W, ça ne fonctionne pas, alink me renvoi une erreur de type "unresolved SetWindowsHookEx". J'ai bien essayé de changer le prototype de la fonction dans la section import mais ça n'a rien changé...
Pour les paramètres je vais voir, c'est peut être ça qui foire (j'en doute mes bons).

Pour les optimisations du code, je sais c'est moche mais la je bidouille le code. Une fois que tout fonctionnera comme je le souhaite, je reprendrai totu depuis le début ;)

Merci d'avoir répondu :)
Commenter la réponse de cs_jean84