我创建了一个新的精灵部分,并在其中添加了一行文本。在此处看到的示例之后,我做到了:将部分添加到Elf文件中。我创建了一个名为" .mydata"的部分,并将字符串" mydata保存的字符串"放入其中。我试图匹配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 sectiont".mydata"n");
printf("at offsett0x%08xn", (unsigned int)sh_table[i].sh_offset);
printf("of sizett0x%08xn", (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 Section标头表条目(即SH_NAME,SH_TYPE ...(似乎都与提取字符串相关。
在我们解决您的问题之前,您的代码有几个问题:
- 没有包含。
-
fread(elf_header,...
应该是fread(&elf_header,...
。 -
sh_table
永远不会从ELF文件中读取。
修复了这些内容后,可以通过复制来自sh_table[i].sh_offset
的sh_table[i].sh_size
字节中的.mydata
部分中的字符串数据,其中i
是.mydata
节的索引。
这是工作代码:
#include <stdio.h>
#include <stdlib.h>
#include <elf.h>
#include <string.h>
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 sectiont".mydata"n");
printf("at offsett0x%08xn", (unsigned int)sh_table[i].sh_offset);
printf("of sizett0x%08xn", (unsigned int)sh_table[i].sh_size);
break;
}
}
/*Code to print or store string data*/
if (i < eh.e_shnum) {
char *mydata = malloc(sh_table[i].sh_size);
fseek(fd, sh_table[i].sh_offset, SEEK_SET);
fread(mydata, 1, sh_table[i].sh_size, fd);
puts(mydata);
} else {
// .mydata section not found
}
}
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);
fseek(fp, elf_header.e_shoff, SEEK_SET);
fread(sh_table, 1, elf_header.e_shentsize*elf_header.e_shnum, fp);
print_item(fp, elf_header, sh_table);
return 0;
}