[C/UNIX] recoder la commande nm

recoder la commande nm [C/UNIX] - C - Programmation

Marsh Posté le 27-03-2007 à 23:27:52    

Bonjour a tous,
Je dois recoder la fonction nm sans les options.  
Cette commande permet de visualiser la table des symboles d'un executable ou d'un fichier passe en parametre (lpus d'informations man nm).
En fait il faut savoir bien manipuler les outils du format ELF (y-a-t-il un pros dans les parrages ??)
Si quelqu'un sait comment faire pour par exemple lire et afficher la string table ca m'aiderais beaucoup.
En fait je n'ai pas encore commencer le prog mais j'aimerais le maximum d'informations histoire de me mettre dans la bonne voie.
 
Un petit exemple  juste en tapant nm dans un repertoire ou il y a un fichier executable::
 
~>>>>=prompt>>>>>1925>>nm    
 
08049918 A _DYNAMIC
080499dc A _GLOBAL_OFFSET_TABLE_
         w _Jv_RegisterClasses
080499cc d __CTOR_END__
080499c8 d __CTOR_LIST__
080499d4 d __DTOR_END__
080499d0 d __DTOR_LIST__
08049914 r __EH_FRAME_BEGIN__
08049914 r __FRAME_END__
080499d8 d __JCR_END__
080499d8 d __JCR_LIST__
08048514 T ___start
08049a28 A __bss_start
         w __deregister_frame_info
08048808 t __do_global_ctors_aux
08048678 t __do_global_dtors_aux
0804990c D __dso_handle
08049908 D __progname
08049904 D __ps_strings
         w __register_frame_info
080484fc T __start
         U __syscall
08049a28 A _edata
08049a48 A _end
08048840 T _fini
08048440 T _init
080485f0 T _rtld_setup
080484fc T _start
         U atexit
08049a28 b completed.1
08049a44 B environ
         U exit
0804885b t fini_fallthru
080486e4 t frame_dummy
         U getpagesize
0804845b t init_fallthru
08048748 T main
080487ec T my_putchar
08048774 T my_putnbr
08049a2c b object.2
08049910 d p.0
         U write
 
Par exemple comment afficher le texte a cote des adresses memoires (c'est dans la string table non??) et les adresses memoires bien entendus??
Merci.
 


---------------
L'etre humain juge tres vite comprend lentement, s'enerve facilement et perd vite ses facultees d'enfant!!!!
Reply

Marsh Posté le 27-03-2007 à 23:27:52   

Reply

Marsh Posté le 27-03-2007 à 23:36:42    

Salut,

 

Les informations contenues dans le premier lien dans google "elf format" conviendrait?

 

Edit: apparemment y'aurait une libelf qui existerait, je l'ai dans mes paquets sur kubuntu, si ça peut donner une indication de plus (suis pas pro hein, donc j'espère que j'ai pas mal compris ta question :))

Message cité 1 fois
Message édité par IrmatDen le 27-03-2007 à 23:40:42
Reply

Marsh Posté le 27-03-2007 à 23:41:41    

IrmatDen a écrit :

Salut,
 
Les informations contenues dans le premier lien dans google "elf format" conviendrait?


 
 
En fait j'ai deja parcourus le pdf du format elf. C cool quand meme. Il faut que je le bosse. Mais je n'ai pas vu comment on peut obtenir les chaine de caractere situees a cote des adresses memoires. A tu la solution??


---------------
L'etre humain juge tres vite comprend lentement, s'enerve facilement et perd vite ses facultees d'enfant!!!!
Reply

Marsh Posté le 27-03-2007 à 23:47:35    

Ce serait pas un mélange de la string table et de la symbol table ce que tu cherches à obtenir :??:
 
Edit: je sais pas si tu as fait gaffe à mon edit précédent, mais si tu peux utiliser une lib, t'en prive pas hein [:ddr555]

Message cité 1 fois
Message édité par IrmatDen le 27-03-2007 à 23:53:44
Reply

Marsh Posté le 27-03-2007 à 23:59:25    

IrmatDen a écrit :

Ce serait pas un mélange de la string table et de la symbol table ce que tu cherches à obtenir :??:
 
Edit: je sais pas si tu as fait gaffe à mon edit précédent, mais si tu peux utiliser une lib, t'en prive pas hein [:ddr555]


 
Oui c'est surment ca!! Youpi! mais en fait je n'ai pas vraiment compris l'explication de la symbol table. Personne a une doc en Francais ou une petite explication??  
Au fait qu'entend -tu par melange?? (tu veut dire que je cherche dans la sting table le debut de la chaine de caractere et ensuite jaffiche cette chaine grace a la symbol table?? ou je suis carement a cote de la plaque??)


---------------
L'etre humain juge tres vite comprend lentement, s'enerve facilement et perd vite ses facultees d'enfant!!!!
Reply

Marsh Posté le 28-03-2007 à 00:06:34    

J'espère pas me planter non plus, mais la première phrase de la table des chaînes est bien:

Citation :

String table sections hold null-terminated character sequences, commonly called strings. The object file uses these strings to represent symbol and section names.


Et la description de la table des symboles:

Citation :

st_name:        This member holds an index into the object file’s symbol string table, which holds the character representations of the symbol names. If the value is non-zero, it represents a string table index that gives the symbol name. Otherwise, the symbol table entry has no name.


Dans le même ordre l'idée, l'adresse serait apparemment contenue dans le champ st_value :)

Reply

Marsh Posté le 28-03-2007 à 00:10:55    

IrmatDen a écrit :

J'espère pas me planter non plus, mais la première phrase de la table des chaînes est bien:

Citation :

String table sections hold null-terminated character sequences, commonly called strings. The object file uses these strings to represent symbol and section names.


Et la description de la table des symboles:

Citation :

st_name:        This member holds an index into the object file’s symbol string table, which holds the character representations of the symbol names. If the value is non-zero, it represents a string table index that gives the symbol name. Otherwise, the symbol table entry has no name.


Dans le même ordre l'idée, l'adresse serait apparemment contenue dans le champ st_value :)


 
 
Voila c'est ca. En fait sh_name retourne l'octet du debut du nom de la section. Moi je veut afficher le nom en commencant a cette octet jusqu'a '\0' (la fin)
Merci. Tu me met sut la bonne voit je pense!


---------------
L'etre humain juge tres vite comprend lentement, s'enerve facilement et perd vite ses facultees d'enfant!!!!
Reply

Marsh Posté le 28-03-2007 à 00:30:17    

Quelqu'un sait-il quel format prend sh_name parce que en decimale ca donne un nombre negatif et en hexa rien qui me dit quelque chose


---------------
L'etre humain juge tres vite comprend lentement, s'enerve facilement et perd vite ses facultees d'enfant!!!!
Reply

Marsh Posté le 28-03-2007 à 00:40:03    

C'est codé sur 2 octets non signés je parie :)
Regarde aussi si y'a pas un lien avec le membre e_shstrndx du header ;)

Reply

Marsh Posté le 28-03-2007 à 00:51:08    

IrmatDen a écrit :

C'est codé sur 2 octets non signés je parie :)
Regarde aussi si y'a pas un lien avec le membre e_shstrndx du header ;)


 
Ok c bon a savoir en faite e_shstrndx indique si sh_name et existe ou pas grace a SHN_UNDEF.Donc j'ai tester avec se champ,  Pour moi apparament c bon sh_name existe mais je ne sais pas omment affiche un non signe sur 2 octets.  


---------------
L'etre humain juge tres vite comprend lentement, s'enerve facilement et perd vite ses facultees d'enfant!!!!
Reply

Marsh Posté le 28-03-2007 à 00:51:08   

Reply

Marsh Posté le 28-03-2007 à 01:04:40    

short unsigned int, ça devrait le faire, pour être sûr tu peux sortir son sizeof. Je suis pas sûr de ce que ça vaut compilé en 64 bits par contre :(

Message cité 1 fois
Message édité par IrmatDen le 28-03-2007 à 01:04:52
Reply

Marsh Posté le 28-03-2007 à 01:15:20    

IrmatDen a écrit :

short unsigned int, ça devrait le faire, pour être sûr tu peux sortir son sizeof. Je suis pas sûr de ce que ça vaut compilé en 64 bits par contre :(


 
OK en j'ai donc fait un sizeof c'est sur 4 octet. et en fait c bon jobtient bien un nombre positif. Mais une fois que j'ai ce nombre qu'est ce que j'en fait. (je fais comment pour lire dans la string table??)


---------------
L'etre humain juge tres vite comprend lentement, s'enerve facilement et perd vite ses facultees d'enfant!!!!
Reply

Marsh Posté le 28-03-2007 à 01:29:15    

Je comprends pas ton problème là :/
Tu charges la table des chaînes, ensuite c'est jamais plus qu'un tableau de caractères et il te suffit de regarder au bon endroit.

Reply

Marsh Posté le 28-03-2007 à 01:41:34    

IrmatDen a écrit :

Je comprends pas ton problème là :/
Tu charges la table des chaînes, ensuite c'est jamais plus qu'un tableau de caractères et il te suffit de regarder au bon endroit.


ok, mais je ne vois pas de char * c'est ca mon probleme. Donc sh_name me donne la valeur 1179403647.(cette valeur est donc le debut de la string "name" si j'ai bien compris??) Une fois ke j'ai cette valeur je veut donc lire la string "name" je ne voit pas comment lire cette chaine avec sh_name vu que c'est un int.  
 
Et ca me parait bizar la valeur de l'int
il doit y avoir un probleme


Message édité par drexlbob le 28-03-2007 à 01:49:44

---------------
L'etre humain juge tres vite comprend lentement, s'enerve facilement et perd vite ses facultees d'enfant!!!!
Reply

Marsh Posté le 28-03-2007 à 11:18:12    

J'imagine qu'il est possible que tu ai lu ça dans un binaire 32 bits. Du coup, tu aurais lu 2 champs au lieu d'un seul, bien que ça reste gros, c'est la seule explication plausible qui me viennent en tête :/
Mais dans l'idée c'est l'index du premier caractère de la chaîne à laquelle il est fait référence oui.
 
Je vais essayer d'y jeter un petit coup d'oeil ce soir, ça peut être intéressant à savoir (ça et le reste :))

Reply

Marsh Posté le 28-03-2007 à 23:40:08    

IrmatDen a écrit :

J'imagine qu'il est possible que tu ai lu ça dans un binaire 32 bits. Du coup, tu aurais lu 2 champs au lieu d'un seul, bien que ça reste gros, c'est la seule explication plausible qui me viennent en tête :/
Mais dans l'idée c'est l'index du premier caractère de la chaîne à laquelle il est fait référence oui.
 
Je vais essayer d'y jeter un petit coup d'oeil ce soir, ça peut être intéressant à savoir (ça et le reste :))


 
Ok c'est super cool parce que moi je n'ais toujours pas avance, donc si tu arrive a afficher la string fait moi signe.  
Encore merci de ton aide.


---------------
L'etre humain juge tres vite comprend lentement, s'enerve facilement et perd vite ses facultees d'enfant!!!!
Reply

Marsh Posté le 29-03-2007 à 00:07:49    

Nop, je viens de rentrer du taf :'( Je doute faire quelque chose là :/

Reply

Marsh Posté le 29-03-2007 à 00:58:42    

IrmatDen a écrit :

Nop, je viens de rentrer du taf :'( Je doute faire quelque chose là :/


 
Ok je vais voir ca ce soir je te tien au jus demain.


---------------
L'etre humain juge tres vite comprend lentement, s'enerve facilement et perd vite ses facultees d'enfant!!!!
Reply

Marsh Posté le 30-03-2007 à 00:40:16    

Bon, j'ai pu avancer un peu en fait hier soir, et j'arrive à accéder sans pépin à au moins l'une des tables de caractère; l'indice donné par Elf32_Shdr.sh_name (11), pointe bien vers la chaîne "strtab". J'en suis pas encore à lister tout les symboles donc :)
Ceci dit, vu que j'obtiens un indice correct c'est plutôt pas mal barré (par contre, je suis sur un OS 32 bits / binaire analysé 32 bits).
 
Poste ton code, autant j'y verrais quelque chose qui cloche... Comme autant, tu analyse un binaire 32 bits avec un prog compilé en 64 ou inversement :/

Reply

Marsh Posté le 30-03-2007 à 01:19:48    

IrmatDen a écrit :

Bon, j'ai pu avancer un peu en fait hier soir, et j'arrive à accéder sans pépin à au moins l'une des tables de caractère; l'indice donné par Elf32_Shdr.sh_name (11), pointe bien vers la chaîne "strtab". J'en suis pas encore à lister tout les symboles donc :)
Ceci dit, vu que j'obtiens un indice correct c'est plutôt pas mal barré (par contre, je suis sur un OS 32 bits / binaire analysé 32 bits).
 
Poste ton code, autant j'y verrais quelque chose qui cloche... Comme autant, tu analyse un binaire 32 bits avec un prog compilé en 64 ou inversement :/


 
Voila je t'ai donc envoye le code par message prive.


---------------
L'etre humain juge tres vite comprend lentement, s'enerve facilement et perd vite ses facultees d'enfant!!!!
Reply

Marsh Posté le 30-03-2007 à 01:59:14    

Ok, en fait tu as raté une étape. C'est-à-dire que tu charges bien l'en-tête du fichier ELF, mais une fois ceci fait, tu ne fais rien d'autre. Alors que tu as Elf32_Ehdr::e_shnum section d'en-tête, dont la première est située à Elf32_Ehdr::e_shoff.
Donc l'offset de la string table (en admettant que Elf32_Ehdr::e_shstrndx soit > 0), se situe à l'offset (Elf32_Ehdr::e_shoff + Elf32_Ehdr::e_shstrndx * e_shentsize) dans ton binaire. Ensuite, tu lis le Elf32_Shdr situé à cet endroit, et... Je te laisse continuer la réflexion sur cette piste ;)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed