从C中的ELF部分提取字符串

时间:2017-05-31 15:59:35

标签: c linux elf

我创建了一个新的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 ...)似乎与提取字符串无关。

1 个答案:

答案 0 :(得分:2)

在我们提出您的问题之前,您的代码存在以下几个问题:

  1. 没有包含。
  2. fread(elf_header,...应为fread(&elf_header,...
  3. 永远不会从ELF文件中读取
  4. sh_table
  5. 修复这些内容后,可以通过复制ELF文件中.mydata的{​​{1}}字节数据来读取sh_table[i].sh_size部分中的字符串数据,其中sh_table[i].sh_offseti部分的索引。

    以下是工作代码:

    .mydata