Fonctions de DLL

Le
pascal1967
Bonjour,
Est-il possible, à partir d'une dll dont on a perdu les sources, de
retrouver les fonctions et leurs paramètres ?
Merci
Pascal
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fran ois Picalausa
Le #15353801
On Sep 27, 1:06 pm, pascal1967
Bonjour,
Est-il possible, partir d'une dll dont on a perdu les sources, de
retrouver les fonctions et leurs param tres ?
Merci
Pascal



Hello,

Pour les DLL standards, Depends.exe (pr sent dans le platform SDK)
pourra afficher correctement (probablement au travers de l'API
MapDebugInformation) le nom des fonctions export es.
Pour ce qui est de leurs param tres, MapDebugInformation donne aussi
des informations sur le d but et la fin de la fonction dans l'image. A
partir de cette information, il est possible de r cup rer le code
compil correspondant la fonction export e, de le d sassembler... et
(op ration non triviale, mais possible) de retrouver les param tres.

Fran ois
pascal1967
Le #15353741
j'obtient effectivement assez facilement le nom de la fonction mais pour les
paramètres le code assembleur est trop corriace...

pourquoi des outils comme PE Explorer n'y arrive pas non plus ? Cela dépend
du compilateur ?

Merci
Jean-marc
Le #15353701
pascal1967 wrote:

Hello,

j'obtient effectivement assez facilement le nom de la fonction mais
pour les paramètres le code assembleur est trop corriace...



pourquoi des outils comme PE Explorer n'y arrive pas non plus ? Cela
dépend du compilateur ?



Tu peux voir du code bien désassemblé et commenté avec un outil
comme W32Dasm, téléchargeable gratuitement ici:
http://www.angelfire.com/dc/vashala/hacks%20pages/hack_programs/Win32dasm.html

(Lors de la première utilisation, change de police depuis le Menu Font...)

Tu trouveras sans probleme les noms de fonctions et les adresses, puis le
code assembleur
qui va derrière. Si tu es un bon pro, tu pourras deviner que par exemple la
fonction recoit
3 ou 4 parametres. Mais c'est tout.

Et ca ne dépend pas du compilateur, ca tient betement à la façon dont un
compilateur
fonctionne (tous les "vrais" compilateiurs, ceux qui produisent du code
assembleur).

Le code assembleur d'une fonction ne contient plus ni noms, ni types, ni
rien de ce genre.
tu pourras simplement savoir que sur la pile d'appel, on a passé un "truc"
sur 2 bytes, puis un "machin"
sur 4 bytes, etc. Mais impossible de dire par exemple si c'est un "long" ou
un "pointeur sur char".

Voici 2 fonctions en C, dans une dll:

void titi(char *p)
{
printf("%pn", p);
}

void toto(long p)
{
printf("%ldn", p);
}

Ces 2 fonctions produisent le même code source,
à l'identique (à l'exception de la chaine pour printf):

_titi PROC NEAR ; COMDAT

; 5 : {

push ebp
mov ebp, esp
sub esp, 64 ; 00000040H
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-64]
mov ecx, 16 ; 00000010H
mov eax, -858993460 ; ccccccccH
rep stosd

le code est à 100% identique pour toto, et c'est bien normal:
un "long" est codé sur 4 bytes, comme un pointeur. Ils sont
donc impossible à distinguer.


Moralité: en examinant l'assembleur généré, c'est IMPOSSIBLE
(pour toujours et à jamais), quel que soit l'outil de deviner
si la fonction originale attend un long, ou un pointeur sur char
(ou sur quoique ce soit d'autre d'ailleurs, genre une structures, etc.)

En lisant le code source et en le comprenant, un expert pourrait faire
du reverse ingeneering et par tatonnement finir par deviner que le
premier parametre est sans doute une chaine, ou ceci, ou cela;

A force de tests, l'expert finirait peut etre par retrouver qq chose.

Voila. La réponse à ta question originale est donc:

Il est impossible, par des moyens mécaniques, de retrouver
les parametres d'une fonction depuis le code assembleur généré.

Un Expert humain pourra (pourrait) dans une certaine mesure
retrouver plus ou moins la nature des paramètres, mais avec bcp
d'efforts et de temps, en plus de tests poussés.

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
pascal1967
Le #15353661
bravo et merci... d'une clareté redoutable !!!
Publicité
Poster une réponse
Anonyme