__declspec(dllexport) en PB ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

__declspec(dllexport) en PB ?

Message 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 +
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: __declspec(dllexport) en PB ?

Message 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é :?
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: __declspec(dllexport) en PB ?

Message 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!
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Re: __declspec(dllexport) en PB ?

Message 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 :/ .
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: __declspec(dllexport) en PB ?

Message par djes »

T'aurais pas ton code, j'ai la flemme (pour changer :mrgreen: )
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Re: __declspec(dllexport) en PB ?

Message 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.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: __declspec(dllexport) en PB ?

Message 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
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Re: __declspec(dllexport) en PB ?

Message 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)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: __declspec(dllexport) en PB ?

Message 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!
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: __declspec(dllexport) en PB ?

Message 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à :|
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: __declspec(dllexport) en PB ?

Message par Backup »

sous seven on peut désactiver l'UAC il me semble ,....peut etre l'a tu fais ..
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Re: __declspec(dllexport) en PB ?

Message 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 ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: __declspec(dllexport) en PB ?

Message 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

lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Re: __declspec(dllexport) en PB ?

Message par lepiaf31 »

Oui avec WH_KEYBOARD_LL ca marche mais pas avec WH_CALLWNDPROC :/
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: __declspec(dllexport) en PB ?

Message 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!
Répondre