从C中的小精灵部分中提取字符串



我创建了一个新的精灵部分,并在其中添加了一行文本。在此处看到的示例之后,我做到了:将部分添加到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 ...(似乎都与提取字符串相关。

在我们解决您的问题之前,您的代码有几个问题:

  1. 没有包含。
  2. fread(elf_header,...应该是fread(&elf_header,...
  3. sh_table永远不会从ELF文件中读取。

修复了这些内容后,可以通过复制来自sh_table[i].sh_offsetsh_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;
}

最新更新