C 程序打开二进制 elf 文件,从中读取并打印出来(如 objcopy)
C program to open binary elf files, read from them, and print them out (like objcopy)
我正在尝试实现类似于 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 文件,我建议您查看以下资源:
查看以下内容code snippet。它展示了如何解释 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);
}
我还建议查看 elfutils library, which can be found here。
我正在尝试实现类似于 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 文件,我建议您查看以下资源:
查看以下内容code snippet。它展示了如何解释 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);
}
我还建议查看 elfutils library, which can be found here。