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