Modification OCX

moreau_l Messages postés 35 Date d'inscription mercredi 8 octobre 2003 Statut Membre Dernière intervention 7 septembre 2007 - 17 avril 2004 à 21:01
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 - 20 avril 2004 à 09:31
Bonjour,

J'ai un petit soucis. Je dispose d'un programme qui accède à l'Active X de Flash Player 6. C'est un OCX (Flash.ocx).
Je n'ai pas accès au code source du programme qui appelle cet librairie, et pourtant je voudrais avoir accès aux données qui y transitent appel à deux fonctions de la librairie notamment (getAttribute et setAttribute ...).

Je voudrais savoir si il y a un moyen de se substituer à la vraie libraire Flash.ocx, et "capter" au vol les appels de fonctions avec leur attributs (ca pourrais aussi servir pour une version de debug !)

Merci de vos réponse ;-)
Luc.

7 réponses

ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
18 avril 2004 à 11:28
salut

il daut pour cela utiliser un méthode de hooking : tu remplaces dans l'Import Address Table de l'ocx, l'adresse des 2 fonctions en question par l'adresse de 2 fonctions de ton code ayant les mêmes paramètres et la même valeur de retour. Dans ces fonctions, tu récupères ce que tu veux et tu termine par un appel à la fonction d'origine déclarée avec Declare dans ton code VB.

La fonction pour remplacer dans l'IAT est la suivante (elle provient d'un code source de J. Chamberlain et je l'ai modifié aussi) :

'permet de hooker une fonction d'une DLL
Public Function HookDLLImport(sImportingModuleName As String, sExportingModuleName As String, sCallName As String, bHook As Boolean, lpfnHook As Long, ByRef lpOriginalAddress As Long, ByRef sError As String) As Boolean

Dim lpImportingModuleHandle As Long, lpExportingModuleHandle As Long, lpProcAddress As Long
Dim vectorIAT As Long, lenIAT As Long, lpEndIAT As Long, lpIATCallAddress As Long
Dim lpflOldProtect As Long, lpflOldProtect2 As Long
Dim lpPEHeader As Long, pImportDesc As Long, pImportSection As IMAGE_SECTION_HEADER
Dim ulSize As Long

On Error GoTo EH

'On vérifie si l'adresse de la procédure Hook est valide If lpfnHook 0 Then sError "Addresse de fonction Hook invalide": Exit Function

'Obtient le handle (adresse) du module d'import
lpImportingModuleHandle = GetModuleHandle(sImportingModuleName) If lpImportingModuleHandle 0 Then sError "Impossible d'obtenir le handle du module d'import """ & sImportingModuleName & """.": Exit Function

'Obtient le handle (adresse) du module d'export
lpExportingModuleHandle = GetModuleHandle(sExportingModuleName) If lpExportingModuleHandle 0 Then sError "Impossible d'obtenir le handle du module d'export """ & sExportingModuleName & """.": Exit Function

'Get the proc address of the IAT entry to be changed
If bHook Then
'Obtient l'addresse de la fonction originale
lpProcAddress = GetProcAddress(lpExportingModuleHandle, sCallName) If lpProcAddress 0 Then sError "Impossible d'obtenir l'adresse de la fonction """ & sCallName & """.": Exit Function

Else
lpProcAddress = lpfnHook 'on restaure une fonction hookée
End If

pImportDesc = ImageDirectoryEntryToDataEx(lpExportingModuleHandle, 1&, 1, ulSize, ByVal 0&)
CopyMemory pImportSection, ByVal pImportDesc, Len(pImportSection)

vectorIAT = lpImportingModuleHandle + pImportSection.VirtualAddress

lpEndIAT = lpImportingModuleHandle + pImportSection.VirtualAddress + pImportSection.VirtualSize
Do
If vectorIAT > lpEndIAT Then 'on a atteint la fin de la table
sError = "Adresse de fonction " & Hex(lpProcAddress) & " non trouvée dans la Table d'import de """ & sImportingModuleName & """."
Exit Function
Else
CopyMemory lpIATCallAddress, ByVal vectorIAT, 4
If lpIATCallAddress = lpProcAddress Then 'on a trouvé l'entrée
Exit Do
Else
vectorIAT = vectorIAT + 4 'essaye l'entrée suivante
End If
End If
Loop

'Change l'adresse originale avec l'adresse de notre fonction
'On doit mettre la mémoire en ecriture pour pouvoir changer l'adresse
If VirtualProtect(ByVal vectorIAT, 4, PAGE_EXECUTE_READWRITE, lpflOldProtect) = 0 Then
sError = "Impossible de changer l'IAT en execute/read/write."
Exit Function
Else
If bHook Then
CopyMemory lpOriginalAddress, ByVal vectorIAT, 4 'sauvegarde l'adresse originale
CopyMemory ByVal vectorIAT, lpfnHook, 4 'change l'adresse de la procédure avec la notre
Else
CopyMemory ByVal vectorIAT, lpOriginalAddress, 4 'change l'adresse de la procédure avec la notre
End If
VirtualProtect ByVal vectorIAT, 4, lpflOldProtect, lpflOldProtect2 'restaure la protection mémoire
End If

HookDLLImport = True 'mission accomplished

Exit Function

EH:
sError = "Erreur inattendue : " & Err.Description
End Function

au début de ton prog, il faut utiliser HookDLLImport avec :
'prem param = le nom de ton ocx
'2nd param = le nom de la dll qui contient getAttribute et setAttribute
'3 param = le nom de la fonction à hooké
'4 param : true pour hook'4 param = un addressof de ta fonction remplacante
'5 param = stocke l'adresse originale
'6 param = texte d'erreur

et à la fin :
'prem param = le nom de ton ocx
'2nd param = le nom de la dll qui contient getAttribute et setAttribute
'3 param = le nom de la fonction à déhooké
'4 param : false pour déhook
'4 param = l'adresse originale
'5 param = stocke l'adresse originale
'6 param = texte d'erreur

voilà

ShareVB
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
18 avril 2004 à 11:32
j'ai oublié que :

il faut que tu trouves un moyen de charger ton prog avec le prog dont tu n'as pas le code avec les apis de Debug

(j'avais mal compris la question)
dans le message précédent ce n'est pas :
'prem param = le nom de ton ocx
'2nd param = le nom de la dll qui contient getAttribute et setAttribute

mais

'prem param = le nom du prog exe dont tu n'as pas le code
'2nd param = le nom de l'ocx

voilà

ShareVB
0
moreau_l Messages postés 35 Date d'inscription mercredi 8 octobre 2003 Statut Membre Dernière intervention 7 septembre 2007
19 avril 2004 à 14:04
Merci beacuoup pour ta réponse rapide et très complète ShareVB.

Cependant, 2 choses me tracassent :
- L'appel à l'OCX se fait par une dll et non par un exe (evidement, c'est un exe qui appelle cette dll mais ce n'est pas l'exe qui appelle directement les fonctions de l'OCX).
est ce possible d'utiliser une dll plutot qu'un exe ?

- Comment déclarer les fonctions get et setVaraible ?
Public Declare Function GetVariableOri Lib "Flash.ocx" Alias "GetVariable" (name as String) as String
et
Public Declare Function SetVariableOri Lib "Flash.ocx" Alias "SetVariable" (name as String, value as String)

et puis je crée mes fonctions ensuite. Est ce bien celà ?

Merci,
Luc.
0
moreau_l Messages postés 35 Date d'inscription mercredi 8 octobre 2003 Statut Membre Dernière intervention 7 septembre 2007
19 avril 2004 à 15:30
Encore une chose, j'ai un petit soucis avec le code, il ne connait pas :
- IMAGE_SECTION_HEADER
- GetModuleHandle
- GetProcAddress
- ImageDirectoryEntryToDataEx
- ImportDesc
- CopyMemory
- VirualProtect

Où donc se situe tout celà ?

Merci encore,
Luc.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
19 avril 2004 à 16:41
salut

si c'est une dll qui appelle l'ocx alors sImportingModuleName devra être le nom de cette dll. Alors est-ce ton exe qui appelle la dll ?

tu déclares les fonctions comme tu l'as fait : je suppose que ceux sont des fonctions C/C++ et non des méthodes d'un objet exporté par l'ocx. setVariables et getVaraibles sont elles des méthodes d'un objet ou des fonctions exportées directement ?

enfin toutes ces éléments se trouvent dans l'APIViewer 2003 :
http://www.activevb.de/rubriken/apiviewer/index-apiviewereng.html

voilà

ShareVB
0
moreau_l Messages postés 35 Date d'inscription mercredi 8 octobre 2003 Statut Membre Dernière intervention 7 septembre 2007
19 avril 2004 à 20:20
Les fonctions se trouvent dans un ocx. Je ne sais pas de quel type sont ces fonctions. C'est le fichier Flash.ocx qui se trouve dans le flash player 6 Active X Control (Flash Player 6A X.exe).

Et pour ce qui est de mes fonctions inconnues, une idée ?

Merci,
Luc
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
20 avril 2004 à 09:31
salut

je viens de trouver la même dll sur mon PC et je me suis apercu que setVariable et getVariable sont des fonctions d'un interface exposé par la dll ACTIVEX. La méthode que je t'ai donnée ne marche pas pour ce type de fonctions et je ne suis pas sûre qu'il existe un moyen de hooker une interface COM/OLE...

voilà

ShareVB
0
Rejoignez-nous