Page 1 sur 1
__declspec(dllexport) en PB ?
Publié : ven. 06/avr./2012 17:27
par lepiaf31
Bonsoir tout le monde !
Aujourd'hui que je trainais sur le net, j'ai trouvé quelque chose de (relativement) intéressant. J'ai trouvé une méthode pour utiliser les Hooks globaux sans passer par une DLL externe (pour en savoir plus à propos des Hooks:
http://www.purebasic.fr/french/viewtopic.php?f=6&t=9949). J'ai trouvé le code ici:
http://www.cppfrance.com/codes/HOOK-SAN ... 48043.aspx mais il est en C++ et il y a une chose que je ne sais pas faire en PB (et je ne sais pas si c'est faisable d'ailleurs), c'est ca:
Code : Tout sélectionner
__declspec(dllexport) LRESULT CALLBACK HookProc ( int nCode, WPARAM wParam, LPARAM lParam)
Ce __declspec(dllexport) permet, à priori, d'exporter la fonction sous forme de dll mais je n'arrive pas à faire la meme chose en PB (j'ai essayé de mettre ProcedureDLL mais sans succès).
Donc voilà si quelqu'un s'y connait à ce sujet
A +
Re: __declspec(dllexport) en PB ?
Publié : ven. 06/avr./2012 18:06
par djes
Ça ne m'a pas l'air d'être un hook "global", mais seulement de l'application lancée en paramètre... Sinon, le __declspec ne me semble ici d'aucune utilité

Re: __declspec(dllexport) en PB ?
Publié : ven. 06/avr./2012 19:00
par nico
J'ai trouvé une méthode pour utiliser les Hooks globaux sans passer par une DLL externe
Oui, enfin, ça fait lontemps qu'on les utilises !
Tu t'en serait aperçu si t'avait fait une recherche!
Re: __declspec(dllexport) en PB ?
Publié : ven. 06/avr./2012 19:28
par lepiaf31
Oui, enfin, ça fait lontemps qu'on les utilises !
Ah ben désolé, mais quand la doc me dis ca:
If the application installs a hook procedure for a thread of a different application, the procedure must be in a DLL.
Je me dis que je peux lui faire confiance donc effectivement je n'avais pas cherché à faire autrement (et puis à ce moment là les hooks je n'avais pas tellement besoin).
Ça ne m'a pas l'air d'être un hook "global"
Pourtant ils font pareil ici:
http://www.cppfrance.com/codes/HOOK-GLO ... 27169.aspx et le code à justement pour but de montrer un hook global sans dll.
Ceci dis, ca ne résous pas mon problème cette histoire :/ .
Re: __declspec(dllexport) en PB ?
Publié : ven. 06/avr./2012 20:08
par djes
T'aurais pas ton code, j'ai la flemme (pour changer

)
Re: __declspec(dllexport) en PB ?
Publié : ven. 06/avr./2012 20:13
par lepiaf31
Yep voilà un petit test avec un hook clavier:
la DLL:
Code : Tout sélectionner
ProcedureDLL HookKeyboard(code.l, wParam.l, lParam.l)
hMyWin = FindWindow_("WindowClass_0","RecupEvent")
If lParam<0 : type=0 : Else : type=1 : EndIf
PostMessage_(hMyWin,#WM_USER+5,wParam,type)
ProcedureReturn CallNextHookEx_(@HookKeyboard(), code, wParam, lParam)
EndProcedure
Le code:
Code : Tout sélectionner
OpenWindow(0, 0, 0, 550, 160,"RecupEvent", #PB_Window_SystemMenu|#PB_Window_Invisible)
SetWindowState(0,#PB_Window_Minimize)
;HideWindow(0, 1)
hDLL = OpenLibrary(0, "Hook.dll")
hmyHookHookKeyboard = SetWindowsHookEx_(#WH_KEYBOARD, GetProcAddress_(hDLL, "HookKeyboard"), hDLL, 0)
Repeat
Event=WaitWindowEvent()
Select Event
Case #WM_USER+5
Letter.s = ""
If EventlParam() = 0
wParam = EventwParam()
Debug wParam
EndIf
EndSelect
Until GetWindowState(0)<>#PB_Window_Minimize
UnhookWindowsHookEx_(hmyHookHookKeyboard)
CloseLibrary(0)
CloseWindow(0)
Le but serait donc de faire entrer le code de la DLL dans le code de base.
Re: __declspec(dllexport) en PB ?
Publié : ven. 06/avr./2012 20:42
par nico
Il faut que tu saches que:
- pour réaliser un hook global, on était obligé effectivement de le faire par une DLL
pour le hook clavier, on utilisait #WH_KEYBOARD
et pour le hook souris #WH_MOUSE
Le fonctionnement était le suivant, ta DLL était chargée dans tous les processus, ce qui posait des problèmes de sécurité, il fallait que ta dll soit très bien écrite pour pas faire planter les processus et ça facilitait grandement le hacking d'où le problème!
Ce qui fait que maintenant avec Vista et Seven, ta dll ne marchera pas et tu n'auras pas d'erreur en plus (elle sera tout simplement pas chargée dans les différents processus) , cependant elle fonctionnera si l'UAC est désactivé.
Alors Microsoft pour résoudre ce problème les a remplacé par:
pour le hook clavier #WH_KEYBOARD_LL
et pour le hook souris #WH_MOUSE_LL
Et tu n'as plus besoin de placer le code dans une DLL mais attention les procédures sont différentes
Re: __declspec(dllexport) en PB ?
Publié : ven. 06/avr./2012 21:04
par lepiaf31
Hum okay !
Mais du coup ce n'est pas possible de le faire avec WH_CALLWNDPROC ? (la constante WH_CALLWNDPROC_LL n'existe pas)
Re: __declspec(dllexport) en PB ?
Publié : ven. 06/avr./2012 21:35
par nico
Si mais il faut compiler le programme avec les droits administrateurs, ce qui signifie que sous vista et seven tu auras droit à la fenêtre UAC!
Re: __declspec(dllexport) en PB ?
Publié : ven. 06/avr./2012 23:12
par nico
C'est bizarre, je viens de faire des tests, avec seven, ça marche aussi même sans les droits admins, je comprend plus là

Re: __declspec(dllexport) en PB ?
Publié : sam. 07/avr./2012 9:13
par Backup
sous seven on peut désactiver l'UAC il me semble ,....peut etre l'a tu fais ..
Re: __declspec(dllexport) en PB ?
Publié : sam. 07/avr./2012 9:41
par lepiaf31
nico a écrit :C'est bizarre, je viens de faire des tests, avec seven, ça marche aussi même sans les droits admins, je comprend plus là

Quels tests as-tu fait ?
Je n'arrive pas à faire un hook global avec WH_CALLWNDPROC et sans DLL, est ce que tu y arrives ?
Re: __declspec(dllexport) en PB ?
Publié : sam. 07/avr./2012 9:50
par Backup
chez moi ce code fonctionne tel quel ( Win 7 )
(je ne sais pas de qui est ce code...)
Code : Tout sélectionner
Structure KBDLLHOOKSTRUCT
vkCode.i
scanCode.i
flags.i
Time.i
dwExtraInfo.i
EndStructure
Declare HookActionCallBack(nCode, wParam, lParam)
HookHandle=SetWindowsHookEx_(#WH_KEYBOARD_LL, @HookActionCallBack(), 0, 0)
OpenWindow(1, 10, 10, 10, 10, "", #PB_Window_SystemMenu)
StickyWindow(1, 1)
Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow
;On libére le Hook à l'aide de la fonction UnHookWindowsHookEx
UnhookWindowsHookEx_(HookHandle)
;Procédure qui devra être appelée lorsque circulera un message de type "Clavier"
Procedure HookActionCallBack(nCode, wParam, lParam)
Protected *keyBoard.KBDLLHOOKSTRUCT=lParam
Dim keyState.c (255)
If (nCode=#HC_ACTION) And (wParam = #WM_KEYDOWN)
GetKeyboardState_(@keyState())
Debug *keyBoard\vkCode
EndIf
ProcedureReturn CallNextHookEx_(HookHandle, nCode, wParam, lParam)
EndProcedure
;
; EPB
Re: __declspec(dllexport) en PB ?
Publié : sam. 07/avr./2012 10:13
par lepiaf31
Oui avec WH_KEYBOARD_LL ca marche mais pas avec WH_CALLWNDPROC :/
Re: __declspec(dllexport) en PB ?
Publié : mer. 11/avr./2012 20:49
par nico
Dobro a écrit :sous seven on peut désactiver l'UAC il me semble ,....peut etre l'a tu fais ..
Non, l'UAC est bien activé et à fond!
Le code de test:
http://www.purebasic.fr/french/viewtopic.php?p=8637
Si tu pouvais faire le test de ton coté, je pourrais vérifier si c'est normal!