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;
![]()
Règles du forum
Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
Mes tutoriels et sources Pascal
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]
Partager