Bonjour,
Je souhaiterais savoir s'il est possible (avec FreePascal) de récuperer d'une librairie dynamique (dll,.so, ...) le nom des fonctions contenues dans cette librairie pour ensuite les exécuter ?
Bonjour,
Je souhaiterais savoir s'il est possible (avec FreePascal) de récuperer d'une librairie dynamique (dll,.so, ...) le nom des fonctions contenues dans cette librairie pour ensuite les exécuter ?
Bonjour !
Pour ce qui est d'une DLL, tu peux sans problème récupérer l'adresse d'une fonction qui y est contenue à l'aide de la fonction GetProcAddress :
http://msdn2.microsoft.com/fr-fr/lib...y5(VS.80).aspx
Mais il faut connaître le nom de la fonction à récupérer.
Si le but du jeu est de déterminer la liste des fonctions de la DLL, il faut passer par la fonction MapDebugInformation de l'unité jwaImageHlp.
Voici un exemple (en Delphi - l'unité jwaImageHlp s'appelle ImageHlp tout court) :
Sinon, des utilitaires comme PEExplorer peuvent te permettre de lister les fonctions d'une librairie.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 // by Dmitry Streblechenko uses Forms, Classes, SysUtils, Dialogs, ImageHlp, // routines to access debug information Windows; procedure ListDLLFunctions(DLLName: String; List: TStrings); type chararr = array [0..$FFFFFF] of Char; var H: THandle; I, fc: integer; st: string; arr: Pointer; ImageDebugInformation: PImageDebugInformation; begin List.Clear; DLLName := ExpandFileName(DLLName); if FileExists(DLLName) then begin H := CreateFile(PChar(DLLName), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if H<>INVALID_HANDLE_VALUE then try ImageDebugInformation := MapDebugInformation(H, PChar(DLLName), nil, 0); if ImageDebugInformation<>nil then try arr := ImageDebugInformation^.ExportedNames; fc := 0; for I := 0 to ImageDebugInformation^.ExportedNamesSize - 1 do if chararr(arr^)[I]=#0 then begin st := PChar(@chararr(arr^)[fc]); if Length(st)>0 then List.Add(st); if (I>0) and (chararr(arr^)[I-1]=#0) then Break; fc := I + 1 end finally UnmapDebugInformation(ImageDebugInformation) end finally CloseHandle(H) end end end;
![]()
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager