[Résolu, solution utilisable pour tout type de fenêtre au final]
Bonjour à tous,
Je poste ce message pour savoir si il existe un moyen d'envoyer un texte dans une fenêtre, sans que le texte puisse être intercepté par un programme externe. Je me doute déjà de certaines réponses, mais
la fenêtre cible n'est pas une fenêtre classique, créée à partir de composants Windows. C'est un(e)
RIA (type Flash / Flex / Adobe Air / etc...), M2M-EasyPlanet pour ceux qui voient de quoi il s'agit.
Mes investigations m'ont obligé à utiliser un KeyLogger créé à partir des fonctions AutoIt internes (script que je ne fournirai pas, pour des raisons évidentes de sécurité), et j'ai remarqué que sur des fenêtres classiques comme le bloc-notes, les envois par Send étaient interceptés par le KL, mais pas ceux par ControlSend.
Mon but est donc de savoir comment utiliser les fonctionnalités du même type que ControlSend pour une fenêtre dont on ne peut pas connaitre les controlIds (tout simplement parce qu'elle n'en a pas). Un exemple sous la main?
Merci d'avance !
PS: En visitant les wikis et les sites en cheville avec MSDN, je suis déjà tombé sur les commandes SendInput. Je pense que ce sont déjà les fonctions qui sont utilisées dans Send et dans ControlSend, mais quelle différence permet de faire que le Send est interceptable mais pas le ControlSend?
EDIT: Solution envisageable ?
► Afficher le texteSecuredSend
Code : Tout sélectionner
; Commande "Send" sécurisée
Func SecuredSend($str)
; Initialisation
Local $type = ""
For $i = 1 To StringLen($str)
$type = $type _
& 'dword type;ushort wVk;ushort wScan;dword dwFlags;dword time;ulong_ptr dwExtraInfo;dword pad;dword pad;' _ ; Première structure pour l'appui
& 'dword type;ushort wVk;ushort wScan;dword dwFlags;dword time;ulong_ptr dwExtraInfo;dword pad;dword pad;' ; Seconde structure pour le relachement
Next
Local $struct = DllStructCreate($type)
; Structure
For $i = 0 To StringLen($str)-1
Local $char = AscW(StringMid($str, $i+1, 1)), $iPushed = 16*$i, $iReleased = 16*$i+8
; Appui
DllStructSetData($struct, $iPushed+1, 1) ; $INPUT_KEYBOARD = 1
DllStructSetData($struct, $iPushed+3, $char)
DllStructSetData($struct, $iPushed+4, 4) ; $KEYEVENTF_UNICODE = 4
; Relachement
DllStructSetData($struct, $iReleased+1, 1) ; $INPUT_KEYBOARD = 1
DllStructSetData($struct, $iReleased+3, $char)
DllStructSetData($struct, $iReleased+4, 4+2) ; $KEYEVENTF_UNICODE = 4 ; $KEYEVENTF_KEYUP = 2
Next
; Envoi des informations
Local $dll = DllOpen('user32.dll')
SecuredSend_MSDN_SendInput(2*StringLen($str), DllStructGetPtr($struct), 28, $dll) ; $iInputSize = 28
DllClose($dll)
EndFunc
; MSDN : http://msdn.microsoft.com/en-us/library/windows/desktop/ms646310(v=vs.85).aspx
Func SecuredSend_MSDN_SendInput($nInputs, $pInputs, $cbSize, $dll = 'user32.dll')
Local $result = DllCall($dll, 'uint', 'SendInput', 'uint', $nInputs, 'ptr', $pInputs, 'int', $cbSize)
SetError(@error, 0, Not (@error Or Not $result[0]))
EndFunc
EDIT2 : Correction pour les envois de caractères multiples 'aaaa'