Bueno aqui os dejo esta pequeña herramienta que he hecho para ver algunos datos sobre los simbolos de una libreria dinamica o un ejecutable ELF:
http://es.wikipedia.org/wiki/Executable_and_Linkable_FormatCualquier pregunta, comentario o critica constructiva posteen
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <elf.h>
int main(int argc, char **argv)
{
char *shstrtabdata, *strtabdata, *dynstrdata;
int i, off;
bool strtabf=true, symtabf=true, dynsymf=true;
size_t ret;
Elf32_Ehdr
*hdr
= malloc(sizeof(Elf32_Ehdr
)); Elf32_Shdr shdr, shstrtab, strtab, dynsym, dynstr;
Elf32_Sym sym;
FILE
*dyn
= fopen(argv
[1], "rb"); if(!dyn)
{
}
fread(hdr
, sizeof(Elf32_Ehdr
), 1, dyn
); fseek(dyn
, hdr
->e_shoff
+hdr
->e_shentsize
*hdr
->e_shstrndx
, SEEK_SET
); fread(&shstrtab
, sizeof(shstrtab
), 1, dyn
); shstrtabdata
= malloc(shstrtab.
sh_size); if(!shstrtabdata)
{
}
fseek(dyn
, shstrtab.
sh_offset, SEEK_SET
); fread(shstrtabdata
, 1, shstrtab.
sh_size, dyn
); fseek(dyn
, hdr
->e_shoff
, SEEK_SET
);
fwrite(shstrtabdata
, 1, shstrtab.
sh_size, stdin
);
for(i=0; i<hdr->e_shnum; i++)
{
fread(&shdr
, sizeof(shdr
), 1, dyn
); if(!strcmp(shstrtabdata
+shdr.
sh_name, ".symtab")) {
printf(".symtab encontrada: offset: 0x%x\n", shdr.
sh_offset); printf("Tamaño de .symtab: %d\n", shdr.
sh_size); printf("Numero de sym headers: %f\n", (float) shdr.
sh_size/(float) sizeof(Elf32_Sym
)); symtabf = false;
break;
}
}
if(symtabf)
{
printf("sección .symtab no encontrada.\n"); }
fseek(dyn
, hdr
->e_shoff
, SEEK_SET
);
for(i=0; i<hdr->e_shnum; i++)
{
fread(&dynsym
, sizeof(dynsym
), 1, dyn
); if(!strcmp(shstrtabdata
+dynsym.
sh_name, ".dynsym")) {
printf(".dynsym encontrada: offset: 0x%x\n", dynsym.
sh_offset); dynsymf=false;
break;
}
}
fseek(dyn
, hdr
->e_shoff
, SEEK_SET
);
for(i=0; i<hdr->e_shnum; i++)
{
fread(&dynstr
, sizeof(dynstr
), 1, dyn
); if(!strcmp(shstrtabdata
+dynstr.
sh_name, ".dynstr")) {
printf(".dynstr encontrada: offset: 0x%x\n", dynstr.
sh_offset); printf("Tamaño de .dynstr: 0x%x\n", dynstr.
sh_size); break;
}
}
dynstrdata
= malloc(dynstr.
sh_size); if(!dynstrdata)
{
}
fseek(dyn
, dynstr.
sh_offset, SEEK_SET
); ret
= fread(dynstrdata
, 1, dynstr.
sh_size, dyn
);
fseek(dyn
, hdr
->e_shoff
, SEEK_SET
);
for(i=0; i<hdr->e_shnum; i++)
{
fread(&strtab
, sizeof(strtab
), 1, dyn
); if(!strcmp(shstrtabdata
+strtab.
sh_name, ".strtab")) {
printf(".strtab encontrada: offset: 0x%x\n", strtab.
sh_offset); strtabf = false;
break;
}
}
if(strtabf)
{
printf("sección .strtab no encontrada.\n"); }
if(!strtabf)
{
strtabdata
= malloc(strtab.
sh_size); if(!strtabdata)
{
}
fseek(dyn
, strtab.
sh_offset, SEEK_SET
); ret
=fread(strtabdata
, 1, strtab.
sh_size, dyn
); if(ret!=strtab.sh_size)
{
}
}
fseek(dyn
, shdr.
sh_offset, SEEK_SET
);
if(!symtabf)
{
i=0;
while(shdr.sh_size>i)
{
ret
=fread(&sym
, sizeof(sym
), 1, dyn
); i+=sizeof(sym);
printf("%s\n", strtabdata
+sym.
st_name); printf("Direccion: 0x%x\t", sym.
st_value); printf("Tamaño: 0x%x\t", sym.
st_size); if(sym.
st_info & STT_NOTYPE
) printf("Tipo no definido\t"); if(sym.
st_info & STT_OBJECT
) printf("Data object\t"); if(sym.
st_info & STT_FUNC
) printf("Funcion\t"); if(sym.
st_info & STT_FILE
) printf("Fichero fuente\t"); }
printf("Numero de simbolos: %d\n", i
/16); }
fseek(dyn
, dynsym.
sh_offset, SEEK_SET
);
if(!dynsymf)
{
i=0;
while(dynsym.sh_size>i)
{
ret
=fread(&sym
, sizeof(sym
), 1, dyn
); i+=sizeof(sym);
printf("%s\n", dynstrdata
+sym.
st_name); printf("Direccion: 0x%x\t", sym.
st_value); printf("Tamaño: 0x%x\t", sym.
st_size); if(sym.
st_info & STT_NOTYPE
) printf("Tipo no definido\t"); if(sym.
st_info & STT_OBJECT
) printf("Data object\t"); if(sym.
st_info & STT_FUNC
) printf("Funcion\t"); if(sym.
st_info & STT_FILE
) printf("Fichero fuente\t"); }
printf("Numero de simbolos: %d\n", i
/16); }
if(!strtabf
) free(strtabdata
); if(!dynsymf
) free(dynstrdata
);
return 0;
}
El modo de uso es tan simple como pasarle como argumento la ruta del archivo a analizar.
Saludos!