IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

enumeration contenu DLL via API win32


Sujet :

Windows

  1. #1
    Membre à l'essai
    Profil pro
    E/C
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : E/C

    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Points : 22
    Points
    22
    Par défaut enumeration contenu DLL via API win32
    Bonjour,

    Je débute avec l'utilisation de DLL, mais suis au point en C/C++.

    Question 1
    Je cherche à savoir si l'API Win32 contient une fonction permettant d'énumérer les fonctions contenues dans une DLL
    Sur MSDN, on à la fonction LoadLibrary, qui permet de charger une DLL
    (voir http://msdn2.microsoft.com/en-us/library/ms682599.aspx )
    Mais après, comment peut on énumérer son contenu ? Est-il possible de récuperer les fonctions sous forme de protos ? Je ne trouve rien de tel sur MSDN. Ou doit-on se plonger dans les arcanes du format PE, pour écrire son propre code ?

    Dans tous les exemples, on suppose qu'on connait le nom de la fonction qu'on veut utiliser... Ce qui m'intéresse, c'est justement le cas contraire.

    Question 2 (subsidiaire): quelqu'un aurait-il un lien sur un bon tutos sur la programmation "en pratique" via l'utilisation de DLL (anglais ou français). Mes recherches sont pour l'instant peu fructueuses...

    Merci.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Il n'y a aucune fonction à ma connaissance pour lister le contenu de la table d'exportation de la DLL: Il faut se plonger dans le format PE. C'est ce que fait Dependency Walker.

    Mais généralement, si tu ne sais pas quelle fonction de la DLL utiliser, c'est qu'il y a déjà un gros problème. N'as-tu pas un fichier d'en-tête avec la DLL ?

    Es-tu sûr qu'il s'agit bien d'une DLL normale et non d'une assembly .Net ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Inactif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 18
    Points : 19
    Points
    19
    Par défaut
    Oui, ça se fait en quelques lignes avec les apis de debugging.
    Pas besoin de connaitre le PE évidemment...

  4. #4
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par sebkramm
    Je cherche à savoir si l'API Win32 contient une fonction permettant d'énumérer les fonctions contenues dans une DLL
    Il faut fouiller dans le fichier, donc connaître le format des fichiers PE. Sinon, tu as Dependency Walker, dumpbin (un vrai couteau suisse, j'adore), etc.
    Citation Envoyé par sebkramm
    Dans tous les exemples, on suppose qu'on connait le nom de la fonction qu'on veut utiliser... Ce qui m'intéresse, c'est justement le cas contraire.
    Quand même, tu veux utiliser une DLL sont connaître les fonctions que tu veux utiliser!?
    Citation Envoyé par sebkramm
    quelqu'un aurait-il un lien sur un bon tutos sur la programmation "en pratique" via l'utilisation de DLL (anglais ou français).
    MSDN bien sûr. Qu'est-ce que tu veux vraiment apprendre actuellement?

  5. #5
    Inactif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 18
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par Melem Voir le message
    Il faut fouiller dans le fichier, donc connaître le format des fichiers PE
    Non, le PE est inutile pour les exported functions (heureusement!)

  6. #6
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par sylvain69 Voir le message
    Non, le PE est inutile pour les exported functions (heureusement!)
    C'est une blague j'espère. As-tu déjà au moins lu l'article de Matt Pietrek sur le PE? D'ailleurs c'est plutôt logique, le fichier doit fournir une liste des symboles exportées non? C'est l'Export Address Table (EAT).

  7. #7
    Inactif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 18
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par Melem Voir le message
    C'est une blague j'espère. As-tu déjà au moins lu l'article de Matt Pietrek sur le PE?
    Matt, j'ai bossé avec lui il y a près de 20 ans.
    Quand les apis existent, on les utilise.

  8. #8
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Je ne connais pas ces APIs dont tu parles. Tu peux nous dire lesquelles?

  9. #9
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Citation Envoyé par sebkramm Voir le message
    Je cherche à savoir si l'API Win32 contient une fonction permettant d'énumérer les fonctions contenues dans une DLL
    Non.

    Mais après, comment peut on énumérer son contenu ?
    Il faut parser le PE.

    Est-il possible de récuperer les fonctions sous forme de protos ?
    Non, mais avec un bémol toutefois. Les fonctions exportées d'une DLL ne donne rien quant à leurs paramètres (types et tailles). Toutefois on peut analyser une fonction en assembleur pour en dégager le nombre de paramètres et leurs tailles respectives. On peut, en poussant l'analyse un peu plus loin, inférer le type de chacun de ces paramètres.


    Ou doit-on se plonger dans les arcanes du format PE, pour écrire son propre code ?
    Oui, pas d'autres solutions si on souhaite lister les fonctions exportées. Ca n'est toutefois pas très compliqué.

  10. #10
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    ouf je me sens rassurer, des gens pensent comme moi ...
    par contre j'aimerai avoir le détail de ce que sylvain69 pense car j'avoue que je suis -très- septique.

    J'ai posé la question autour de moi et personne ne semble connaitre d'API de ce type (même si les API de debug sont souvent mal connue ...)
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  11. #11
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par Neitsa
    Est-il possible de récuperer les fonctions sous forme de protos ?
    Non, mais avec un bémol toutefois. Les fonctions exportées d'une DLL ne donne rien quant à leurs paramètres (types et tailles).
    Je ne serai pas aussi catégorique. Certains langages comme le C++ par exemple utilisent une décoration de nom qui permet donc de connaître le prototye d'une fonction connaissant son nom (version décorée). Mais là encore, le problème est que chaque compilateur a sa propre convention de décoration.

  12. #12
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Citation Envoyé par Melem Voir le message
    Je ne serai pas aussi catégorique. Certains langages comme le C++ par exemple utilisent une décoration de nom qui permet donc de connaître le prototye d'une fonction connaissant son nom (version décorée). Mais là encore, le problème est que chaque compilateur a sa propre convention de décoration.
    Exact, et la plupart du temps la décoration de fonction n'est pas documentée (c'est le cas chez Microsoft par exemple).

    J'ai extrait une partie de code d'un de mes outils. Ce code extrait l'IMAGE_EXPORT_DIRECTORY de la DLL et puis liste les fonctions exportées d'une DLL. Il permet de voir le cas échéant si une fonction est "forwardée".

    La gestion d'erreur est minimale, à ne pas utiliser dans un outils un tant soit peu sérieux (possibilité d'attaque par file fuzzing).

    Code C : 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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
     
    /* DllExportParser.cpp : Defines the entry point for the console application.
     
    ** Neitsa pour DVP **
     
    Extrait les fonctions exportées par une DLL.
     
    Usage : passer le chemin complet de la DLL à l'exécutable.
     
    ex: DllExportParsser.exe c:\windows\system32\kernel32.dll > out.txt
     
    */
     
    #include "stdafx.h"
    #include <windows.h>
    #include <time.h>
     
    typedef struct _HANDLES {
    	HANDLE hFile;
    	HANDLE hMapping;
    	LPVOID pMapping;
    } HANDLES, *PHANDLES;
     
    BOOL MapFile(TCHAR* fileName, HANDLES* handles);
    PIMAGE_NT_HEADERS CheckPeValidity(HANDLES* handles);
    BOOL DumpExports(HANDLES* handles, PIMAGE_NT_HEADERS ImageNtHeaders);
    void CleanAll (HANDLES* handles);
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	HANDLES handles;
    	PIMAGE_NT_HEADERS pINH = NULL;
     
    	if(argc == 2)
    	{
    		memset(&handles, 0, sizeof(handles));
     
    		if(MapFile(argv[1], &handles))
    		{
    			pINH = CheckPeValidity(&handles);
    			if(pINH != NULL)
    			{
    				DumpExports(&handles, pINH);
    			}
    		}
     
    		CleanAll(&handles);
    	}
    	else
    		_tprintf(_T("Usage :\nDllExportParser.exe dll_full_path"));
     
    	return 0;
    }
    BOOL MapFile(TCHAR* fileName, HANDLES* handles)
    {
    	DWORD FileSize = 0;
     
    	//open the DLL file
    	handles->hFile = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    	if (handles->hFile == INVALID_HANDLE_VALUE)
    	{
    		printf("Can't open the required file");
    		return FALSE;
    	}
     
    	// get the DLL size
    	FileSize = GetFileSize (handles->hFile, NULL);
    	if (FileSize == 0)
    	{
    		//Error handling
    		CleanAll (handles);
    		printf("FileSize is 0 !");
    		return FALSE;
    	}
     
     
    	handles->hMapping = CreateFileMapping (handles->hFile, NULL, PAGE_READONLY | SEC_IMAGE, 0, 0, NULL);
    	if (handles->hMapping == NULL)
    	{
    		//error handling
    		CleanAll (handles);
    		printf("Can't create the file mapping !");
    		return FALSE;
    	}
     
    	handles->pMapping = MapViewOfFile (handles->hMapping, FILE_MAP_READ, 0, 0, 0);
    	if (handles->pMapping == NULL)
    	{
    		//error handling
    		CleanAll (handles);
    		printf("Can't map the requested file !");
    		return FALSE;
    	}
     
    	return TRUE;
    }
     
    PIMAGE_NT_HEADERS CheckPeValidity(HANDLES* handles)
    {
    	PIMAGE_DOS_HEADER ImageDosHeader = NULL;
    	PIMAGE_NT_HEADERS ImageNtHeaders = NULL;
     
    	//cast pMapping to IMAGE_DOS_HEADER
    	ImageDosHeader = (PIMAGE_DOS_HEADER)handles->pMapping;
    	//test if the DLL is really a PE (portable executable) file
    	if (ImageDosHeader->e_magic != IMAGE_DOS_SIGNATURE)
    	{
    		//error handling
    		CleanAll (handles);
    		printf("This file isn't a PE file !\n\n Wrong IMAGE_DOS_SIGNATURE");
    		return NULL;
    	}
     
    	ImageNtHeaders = (PIMAGE_NT_HEADERS)(ImageDosHeader->e_lfanew + (DWORD) ImageDosHeader);
     
    	//test if the NT_SIGNATURE is ok
    	if (ImageNtHeaders->Signature != IMAGE_NT_SIGNATURE)
    	{
    		//error handling
    		CleanAll (handles);
    		printf("This file isn't a PE file !\n\n Wrong IMAGE_NT_SIGNATURE");
    		return NULL;
    	}
     
    	return ImageNtHeaders;
    }
     
    BOOL DumpExports(HANDLES* handles, PIMAGE_NT_HEADERS ImageNtHeaders)
    {
    	DWORD ImageBase, ExportTableRVA, NumOfNames, ExportTableSize, ETUpperBoundary;
    	unsigned int i = 0;
    	PIMAGE_EXPORT_DIRECTORY ImageExportDirectory = NULL;
    	PWORD pOrdinals = NULL;
    	PDWORD pFuncs = NULL;
     
    	//pMapping is the ImageBase of the file
    	ImageBase = (DWORD)handles->pMapping;
     
    	//required file has passed all tests. Now get the ExportTable RVA
    	ExportTableRVA = ImageNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
    	if (ExportTableRVA == 0)
    	{
    		//we got a problem...
    		CleanAll (handles);
    		printf("Export table not found !");
    		return FALSE;
    	}
     
    	// add the Export table RVA and image base to get IED (IMAGE_EXPORT_DIRECTORY)
    	ImageExportDirectory = (PIMAGE_EXPORT_DIRECTORY) (ExportTableRVA + ImageBase);
     
    	//Print all infos from Export directory
    	_tprintf (_T("TimeDateStamp: 0x%08lX - "), ImageExportDirectory->TimeDateStamp);	
    	_tprintf (_tctime( (time_t*)&ImageExportDirectory->TimeDateStamp ));
     
    	printf("\nDLL name : %s\n", ImageExportDirectory->Name + ImageBase);
    	_tprintf (
    		_T("Major Version: %i\n")
    		_T("Minor Version: %i\n")
    		_T("Name RVA: 0x%08lX\n")
    		_T("Ordinal Base: 0x%08lX\n")
    		_T("Address Table Entries: %d\n")
    		_T("Number of Name Pointers: %d\n")
    		_T("Export Table Address RVA: 0x%08lX\n")
    		_T("Name Pointer RVA: 0x%08lX\n")
    		_T("Ordinal Table RVA: 0x%08lX\n"),
    		ImageExportDirectory->MajorVersion,
    		ImageExportDirectory->MinorVersion,
    		ImageExportDirectory->Name,
    		ImageExportDirectory->Base,
    		ImageExportDirectory->NumberOfFunctions,
    		ImageExportDirectory->NumberOfNames,
    		ImageExportDirectory->AddressOfFunctions,
    		ImageExportDirectory->AddressOfNames,
    		ImageExportDirectory->AddressOfNameOrdinals);
     
    	pOrdinals = (PWORD) (ImageExportDirectory->AddressOfNameOrdinals + ImageBase);//ordinal pointer
    	pFuncs = (PDWORD) (ImageExportDirectory->AddressOfFunctions + ImageBase);//func pointer
    	NumOfNames = ImageExportDirectory->NumberOfNames;
     
    	//get the export table size in PE header (needed for testing if func is forwarded)
    	ExportTableSize = ImageNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
    	ETUpperBoundary = ExportTableRVA + ExportTableSize;
     
    	//parse the export table and retrieve each function ordinal's.
    	for (i = 0; i < ImageExportDirectory->NumberOfFunctions; i++)
    	{
    		_tprintf (_T("\nOrd: %04lX (0x%08lX)"), ImageExportDirectory->Base + i, pFuncs[i]);
     
    		//parse the export table and retrieve the function name's IF it exists !		
    		if (pOrdinals[i] < NumOfNames)
    		{			
    			PDWORD pNamePointerRVA =(PDWORD)(ImageExportDirectory->AddressOfNames + ImageBase);
    			PCHAR pFuncName = (PCHAR) (pNamePointerRVA[i] + (DWORD) ImageBase);
    			printf (" - %s", pFuncName);
     
    			//now test if the function is forwarded (see pecoff and "Russ Osterlund" papers about that)
    			if ( (pFuncs[i] >= ExportTableRVA) && (pFuncs[i] <= ETUpperBoundary) )
    			{
    				//func is forwarded !
    				PDWORD pFwdFunc = (PDWORD) (pFuncs[i] + (DWORD)ImageBase);
    				printf (" - Fwd to: %s", pFwdFunc);
    			}			
    		}
    	}
    	return TRUE;
    }
    // release handles
    void CleanAll (HANDLES* handles)
    {
    	if (handles->hFile != NULL){
    		CloseHandle (handles->hFile);
    	}
    	if (handles->pMapping != NULL){
    		UnmapViewOfFile (handles->pMapping);
    	}
    	if (handles->hMapping != NULL){
    		CloseHandle (handles->hMapping);
    	}
    }

    Exemple d'output (kernel32.dll)

    TimeDateStamp: 0x462358DF - Mon Apr 16 13:07:11 2007

    DLL name : KERNEL32.dll
    Major Version: 0
    Minor Version: 0
    Name RVA: 0x00004B60
    Ordinal Base: 0x00000001
    Address Table Entries: 950
    Number of Name Pointers: 950
    Export Table Address RVA: 0x00002644
    Name Pointer RVA: 0x0000351C
    Ordinal Table RVA: 0x000043F4

    Ord: 0001 (0x0000A664) - ActivateActCtx
    Ord: 0002 (0x00035475) - AddAtomA
    Ord: 0003 (0x00032649) - AddAtomW
    Ord: 0004 (0x00070EE7) - AddConsoleAliasA
    Ord: 0005 (0x00070EA9) - AddConsoleAliasW
    Ord: 0006 (0x00059126) - AddLocalAlternateComputerNameA
    Ord: 0007 (0x0005900A) - AddLocalAlternateComputerNameW
    Ord: 0008 (0x0002BE81) - AddRefActCtx
    Ord: 0009 (0x00008F8C) - AddVectoredExceptionHandler - Fwd to: NTDLL.RtlAddVectoredExceptionHandler
    ...

  13. #13
    Membre à l'essai
    Profil pro
    E/C
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : E/C

    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Points : 22
    Points
    22
    Par défaut
    Ouahh, ben j'ai lancé un débat ;-) !

    Merci à tous pour vos réponses en tout cas, et à Neitsa pour son code, que je vais essayer.

    Donc, non, pas de fonction dans l'API pour faire ça. Dependency Walker, OK, mais j'ai besoin de lire la DLL depuis mon code. Donc, Sylvain69, je suis aussi très curieux de connaitre l'API dont tu parles.

    Je précise l'idée: J'envisage (c'est au stade de la réflexion, seulement...) le développement d'un outil de traitement de données séquentiel, avec une IHM qui permette de placer des "blocs" de traitements, avec un (ou +) flots de données en entrée, et un flot de données en sortie. Le traitement en lui même ne serait pas implémenté dans l'appli, mais on pourrait faire appel à des fonctions qui sont dans des DLL. Genre, je sélectionne dans un Dialog le fichier qui m'intéresse, puis j'ai la liste des fonctions contenues, et j'en choisis une.

    Par exemple, ce qui m'a donné l'idée, c'est la lib OpenCv
    http://sourceforge.net/projects/opencvlibrary/
    mais pourquoi pas étendre le principe.

    Faire un peu comme
    http://neatvision.eeng.dcu.ie/
    mais sans aucun traitement "en interne".

    D'ou le besoin de parser la DLL, et d'en extraire la liste des fonctions.

    Alors ok, je peux aussi parser le .h correspondant, qui me donnera tout ce qu'il faut, mais si j'ai bien tout compris (?), ceci m'obligera à linker en statique la .lib correspondante. Or l'idée (réalisable ?), c'est de pouvoir acceder en run-time à n'importe quelle dll qui contient un traitement.

    Bon, de toute façon, je n'en suis qu'au stade de l'étude de faisabilité, et en plus, je suis pris par plein d'autres trucs, donc on va laisser ça en stand by pour l'instant dans un coin du cerveau...

    Re merci, en tout cas.

  14. #14
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    (le code posté ci-dessus est une horreur : un marteau pour écraser une mouche)
    Ok, mais vous êtes deux sur ce thread à nous dire qu'il existe une autre solution sans vouloir la donner...

    Vous nous parlez de "debug APIs" mais aucune des fonctions de debug ne permet de lister les fonctions exportées par une DLL :

    http://msdn2.microsoft.com/en-us/lib...03(VS.85).aspx

    (ni aucune structure ou évènement, de debug aussi loin que je sache...).

    J'ai aussi fait le tour de ImageHlp et DebugHlp mais la plupart des fonctions susceptibles de lister l'export table requièrent les symboles de debug (qui ne sont pas forcément disponibles).

    Je veux bien admettre que mon code est "bloated" et qu'il existe une autre solution avec l'API windows si on me la présente.

  15. #15
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par fredd135 Voir le message
    Certains devraient plutot lire Richter pour avoir les bases en Win32 :-)
    C'est vrai, mais premièrement Richter ne parle d'aucune api dans ses livres capable de faire ce que tu dis (il utilise dumpbin.exe -exports qui lui même utilise en interne link.exe) et deuxièmement, contrairement à toi, quand Richter avance quelque chose dans un de ses livres, il en fait la démonstration.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/01/2008, 17h54
  2. [API WIN32] Pb avec SHGetSpecialFolderLocation
    Par Invité dans le forum MFC
    Réponses: 3
    Dernier message: 27/01/2004, 21h19
  3. [API Win32] WriteFile()
    Par tut dans le forum MFC
    Réponses: 2
    Dernier message: 27/01/2004, 16h13
  4. API Win32
    Par benoit70 dans le forum MFC
    Réponses: 8
    Dernier message: 26/01/2004, 19h11
  5. [API win32] Récupérer le répertoire d'un profile
    Par sbeu dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 27/09/2002, 12h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo