我创建了一个新的ELF部分,并在其中添加了一行文字。我按照此处的示例执行此操作:Adding section to ELF file。我创建了一个名为“.mydata”的部分,并将字符串“mydata saved string”放入其中。我试图在C:
命令中匹配执行以下功能$ readelf -p .mydata TEST
String dump of section '.mydata':
[ 0] mydata saved string
我可以使用代码
找到部分偏移量和部分的大小void print_item(FILE* fd, Elf64_Ehdr eh, Elf64_Shdr sh_table[])
{
int i;
char* sh_str;
char* buff;
buff = malloc(sh_table[eh.e_shstrndx].sh_size);
if(buff != NULL)
{
fseek(fd, sh_table[eh.e_shstrndx].sh_offset, SEEK_SET);
fread(buff, 1, sh_table[eh.e_shstrndx].sh_size, fd);
}
sh_str = buff;
for(i=0; i<eh.e_shnum; i++)
{
if(!strcmp(".mydata", (sh_str + sh_table[i].sh_name)))
{
printf("Found section\t\".mydata\"\n");
printf("at offset\t0x%08x\n", (unsigned int)sh_table[i].sh_offset);
printf("of size\t\t0x%08x\n", (unsigned int)sh_table[i].sh_size);
break;
}
}
/*Code to print or store string data*/
}
int main()
{
FILE* fp = NULL; //Pointer used to access current file
char* program_name;
Elf64_Ehdr elf_header; //Elf header
Elf64_Shdr* sh_table; //Elf symbol table
program_name = "/home/Testing/TEST";
fp = fopen(program_name, "r");
fseek(fp, 0, SEEK_SET);
fread(elf_header, 1, sizeof(Elf64_Ehdr), fp);
sh_table = malloc(elf_header.e_shentsize*elf_header.e_shnum);
print_item(fp, elf_header, sh_table);
return 0;
}
现在我有位置,我不确定从该位置提取字符串的正确方法。 ELF Section Header表条目(即sh_name,sh_type ...)似乎与提取字符串无关。
答案 0 :(得分:2)
在我们提出您的问题之前,您的代码存在以下几个问题:
fread(elf_header,...
应为fread(&elf_header,...
。sh_table
。修复这些内容后,可以通过复制ELF文件中.mydata
的{{1}}字节数据来读取sh_table[i].sh_size
部分中的字符串数据,其中sh_table[i].sh_offset
为i
部分的索引。
以下是工作代码:
.mydata