Apres plusieurs essais, j'ai du mal a charger dynamiquement une dll et ses procedures (GetProcAdress) en fonction de l'index d'exportation.
Qqun aurait il un exemple a me proposer ?
Apres plusieurs essais, j'ai du mal a charger dynamiquement une dll et ses procedures (GetProcAdress) en fonction de l'index d'exportation.
Qqun aurait il un exemple a me proposer ?
J'ai pas d'exemple, je ne l'ai jamais fait de façon dynamique... mais en cas de pépin tu devrait pouvoir accéder à l'adresse de base du module que tu a charger. Avec cette information tu devrais pouvoir obtenir tout ce que tu veux a partir de l'entête PE...
J'espaire ne pas poluer ton thread
Bien au contraire, tu m'interesse ....
tout ce que je veux cad ??
C'est quoi l'entete PE ?
Je cherche a generer un paquet (ou une dll c pareil) qui puisse me permetre d'exporter des fonctions sans connaitre le nom a l'avance (grace a l'index)
Si en plus ton systeme me permet d'exporter des methodes sans connaitre a l'avance le nombre et le type de parametres c encore mieux !
L'entête PE (Portable Executable) est la structure que windows emplois pour definir ces executable. Elle contient les ressource, les adresse des fonctions exporter avec leur nom et leur adresse d'entrée dans le fichier. Je peut pas te dire en 2 coup de cuillaire a pot comment on fait (c'est un peut hard de gére le PE quand même). Par contre le site http://win32asm.cjb.net/ contient dans la section Tutorials des tuto sur l'entête PE. Le site et en anglais type internet . C'est relativement compréhensible .
Par contre... c'est importer ou exporté que tu veux ?
Ben les 2 forcement ^^ puisque je developpe les 2 applicationsPar contre... c'est importer ou exporté que tu veux ?
Pour l'exportation ca va ... (a moins qu'il ne faille ecrire plus que le mots clef Index X)
Pour l'importation, je ne sais pas comment gerer le GetProcAddress .. on m'a dit de mettre l'index sous forme de chaine mais il refuse.
ok...
Alors pour l'importation, l'analyse de l'entête PE devrais te donné des résultat pas trop mauvais (pour pas dire bon )... par contre, GetProcAddress te permet juste de trouver l'adresse d'une fonction don tu connait le nom... pas l'index (enfin je crois ).
J'ai trouvé ca sur l'aide Delphi ... mais j'arrive pas a le mettre en place :/
et puis c quoi un ".DEF" ?!?
J'en ai pas moi :/
lpProcName
Points to a null-terminated string containing the function name, or specifies the function's ordinal value. If this parameter is an ordinal value, it must be in the low-order word; the high-order word must be zero.The lpProcName parameter can identify the DLL function by specifying an ordinal value associated with the function in the EXPORTS statement. GetProcAddress verifies that the specified ordinal is in the range 1 through the highest ordinal value exported in the .DEF file. The function then uses the ordinal as an index to read the function's address from a function table. If the .DEF file does not number the functions consecutively from 1 to N (where N is the number of exported functions), an error can occur where GetProcAddress returns an invalid, non-NULL address, even though there is no function with the specified ordinal.
Bon... b'en jai dit un connerie pour le PE enfin c'est juste qu'il y'a plus simple que de ce le tapper a la main .
Pour GetProcAdresse... le .DEF tu t'en branle... c'est quand tu compile... il faut que tu fournisse un chaine de caractère formater spécialement pour l'ocasion...
Je m'explique:
Le mot de poids fort doit être a 0, les deux premier caractère de ta chaine sont donc #0.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 lpProcName Points to a null-terminated string containing the function name, or specifies the functions ordinal value. If this parameter is an ordinal value, it must be in the low-order word; the high-order word must be zero.
Le mot de pois faible doit contenir l'index de ta procedure, soit le 3éme caracatére avec comme valeur les 8 bits de poids fort de ton index (0 si index < 255) et le dernie les 8 bits de poids faible... ça devrais marcher comme ça [/code]
sur les PE, et en français :
La documentation francaise sur le PE : glayag.free.fr
Oki merci pour ces Infos
Effectivement ... J4avais pas vu la traduction sous cet angle :/ (cad WORD au sens Octale du therme .....)
J'avais essayé '01' mais sans succes :/
Bon j'essaye et je poste la soluce des que j'ai.
Merci :p
ta pas compris ce que je voulait dire... (en fait... je me suis mal exprimer )
Le caractère String[0] doit être egale au caractère ascii d'index 0 (#0 en delphi)
Le caratère String[1] doit être égale au caractère ascii d'index 0
...
En fait, tu met ton index de fonction dans un cardinal, puis tu utilise la procédure Move pour copier les 4 premiè octet de ton Cardinal (qui faut 4 octet dailleur ) vers les 4 premièe octet d'une chaine de caractère... Et tu passe le résultat a ta fonction
En gros, tu envoie un double mot (32bits) sous la forme d'un chaine...
@tourlourou: C'est plus cool en fraçais . J'avais pas encore trouver de cite pareille
et tout simplement :
PArceque la ca foire ;pppp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 @p := GetProcAddress(h, #0#0#0#1);
(toutes combinaisons ....)
normale... '#0#0#0#1' est une constante... et si je ne me trompe, l'API windows voudrait le pointeur vers cette varibale, dou la magouille avec les variableEnvoyé par Clorish
Pas mieux ......
De toutes facon, on appelle bien la procedure de la meniere suivante :
Alors pkoi ca marcherais pas :/
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 @p := GetProcAddress(h, 'Toto');
Par contre la je commence a desesperer .... Impossible a trouver de l'aide sur Internet .... pour une chose qui me semblais si facile :/
Ben j'ai encore dit une connerie Alors ... mais c'est pas grave... ça commence a devenir une abitude en fait
Pour notre problème, il faut que le mot de poids forts soit a 0 et que le mot de poids faible contienne l'index...
#0#0#0#1 n'est donc pas bon, puisque le mot de poid le plus faible est le premier (oui oui... j'ai bien dit que j'avais dit des connerie ), du au principe de stocage en mémoire des processeur Intel.
ce serais plutôt #1#0#0#0... si ça marche toujours pas... promis que je te le fait sesoir (ou... demain soir ) !!!
DEvine !!!!
Ca marche pô !!!
Peut etre que je fait autant de betises que toi :/ alors la on est pas rendu .....
JE crois que je vais rester avec les noms de procs le temps que qqun me donne le code correct ;p
Bon... ben jsuis partie pour coder ce soir moi
Je vois quand je rentre cher moi et je te tient au courant
J'ai trouver... j'aitai trop bête... désoler ...
Le paramètre que l'on passe effectivement a GetProcAdress est un pointeur on est d'accord... en fait c'est ce pointeur qui doit être initialiser avec la valeur de l'index de la procedure dont tu désire l'adresse... autrement dit le paramètre doit être initialiser de la façon suivante :
Ensuite, si tu apelle GetProcAdress avec comme second paramètre pFnc (qui est un pointeur ) la fonction retourne la bonne valeur. C'est a dire l'adresse de la procedure ayant pour index 1 dans cette exemple ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part pFnc := pointer(1)
C'etait pas la string qu'il falait paramètrer bizarement, mais le pointer...
Le pire... c'est que je le savait
Ben en voila une bonne nouvelle
Bon, la j'ai pas le temps mais je teste tout ca demain bien sur !!
en tout cas merci pour ces infos, et le temps passé sur le probleme.
Moi je dit : destination FAQ, SOURCES et TUTOS ;p
Developpez .... le premier site mondial qui parle du chargement de procedures DLL par index
ça marche de sur... j'ai fait les test hier soir... j'imagine que ça doit fonctionner pour toi aussi maintenant...
Par contre... songe a la balise Résolue
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