C程序打开二进制elf文件,从中读取并打印出来(如objcopy)

C程序打开二进制elf文件,从中读取并打印出来(如objcopy),c,objcopy,C,Objcopy,我正在尝试实现一种类似于objcopy的功能,其中二进制文件的字节(特别是.text部分)将使用open()和read()打印出来。如何设置缓冲区大小并迭代到.text部分的末尾,以避免读取的字节数超过必须读取的字节数,从而避免错误?以下是如何使用open()和read()读取文件 p.S我使用了fopen()和fread()而不是open()和read(),因为我目前使用的是Windows机器。然而,这两种方法的结果都是一样的 int main() { FILE *file = fo

我正在尝试实现一种类似于objcopy的功能,其中二进制文件的字节(特别是.text部分)将使用
open()
read()
打印出来。如何设置缓冲区大小并迭代到
.text
部分的末尾,以避免读取的字节数超过必须读取的字节数,从而避免错误?

以下是如何使用
open()
read()
读取文件

p.S我使用了
fopen()
fread()
而不是
open()
read()
,因为我目前使用的是Windows机器。然而,这两种方法的结果都是一样的


int main()
{
    FILE *file = fopen("input.txt", "r");
    char buffer[2048];

    if (file)
    {
        /* Loop will continue until an end of file is reached i.e. fread returns 0 elements read */
        while (fread(buffer, 4, 1, file) == 1)
        {
            printf("%s", buffer);
        }
        fclose(file);
    }
}

更新:为了具体解释ELF文件,我建议查看以下参考资料:

查看以下内容。它显示了如何解释ELF文件

#include <stdio.h>
#include <libelf.h>
#include <stdlib.h>
#include <string.h>
static void failure(void);
void main(int argc, char **argv)
{
    Elf32_Shdr *shdr;
    Elf32_Ehdr *ehdr;
    Elf *elf;
    Elf_Scn *scn;
    Elf_Data *data;
    int fd;
    unsigned int cnt;

    /* Open the input file */
    if ((fd = open(argv[1], O_RDONLY)) == -1)
        exit(1);

    /* Obtain the ELF descriptor */
    (void)elf_version(EV_CURRENT);
    if ((elf = elf_begin(fd, ELF_C_READ, NULL)) == NULL)
        failure();

    /* Obtain the .shstrtab data buffer */
    if (((ehdr = elf32_getehdr(elf)) == NULL) ||
        ((scn = elf_getscn(elf, ehdr->e_shstrndx)) == NULL) ||
        ((data = elf_getdata(scn, NULL)) == NULL))
        failure();

    /* Traverse input filename, printing each section */
    for (cnt = 1, scn = NULL; scn = elf_nextscn(elf, scn); cnt++)
    {
        if ((shdr = elf32_getshdr(scn)) == NULL)
            failure();
        (void)printf("[%d]    %s\n", cnt,
                     (char *)data->d_buf + shdr->sh_name);
    }
} /* end main */

static void
failure()
{
    (void)fprintf(stderr, "%s\n", elf_errmsg(elf_errno()));
    exit(1);
}
#包括
#包括
#包括
#包括
静态空洞破坏(空洞);
void main(整型argc,字符**argv)
{
Elf32_Shdr*Shdr;
Elf32_Ehdr*Ehdr;
精灵,精灵;
Elf_Scn*Scn;
Elf_数据*数据;
int-fd;
无符号int-cnt;
/*打开输入文件*/
如果((fd=open(argv[1],orduonly))=-1)
出口(1);
/*获取ELF描述符*/
(无效)elf_版本(EV_电流);
if((elf=elf_begin(fd,elf_C_READ,NULL))==NULL)
失败();
/*获取.shstrtab数据缓冲区*/
如果((ehdr=elf32_getehdr(elf))==NULL)||
((scn=elf_getscn(elf,ehdr->e_shstrndx))==NULL)||
((data=elf_getdata(scn,NULL))==NULL))
失败();
/*遍历输入文件名,打印每个部分*/
for(cnt=1,scn=NULL;scn=elf_nextscn(elf,scn);cnt++)
{
如果((shdr=elf32_getshdr(scn))==NULL)
失败();
(无效)printf(“[%d]%s\n”,cnt,
(字符*)数据->数据备份+数据备份->数据备份名称);
}
}/*端干管*/
静态空隙
失败()
{
(void)fprintf(stderr,“%s\n”,elf_errmsg(elf_errno());
出口(1);
}

我还建议您查看,可以找到。

只需使用libelf。。。或者在代码中解析ELF数据。结构并不是那么复杂,而且有很好的记录(例如),我不确定这是否回答了这个问题。这个问题特别是关于迭代ELF二进制文件的一部分。能够读取文件只是问题的开始,不是吗?谢谢@KevinBoone的提醒。我只是相应地更新了我的答案。