获取小精灵部分的偏移量 [英] Get elf sections offsets
本文介绍了获取小精灵部分的偏移量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试获取elf文件各部分的偏移量和数据。
我已经有了使用此代码的部分名称:
I'm trying to get the offset and the data of each sections of an elf file. I already have the sections names with this code:
#include <elf.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
int filesize(int fd)
{
return (lseek(fd, 0, SEEK_END));
}
void print_section(Elf64_Shdr *shdr, char *strTab, int shNum)
{
int i;
for(i = 0; i < shNum; i++)
printf("%02d: %s\n", i, &strTab[shdr[i].sh_name]);
}
int main(int ac, char **av)
{
void *data;
Elf64_Ehdr *elf;
Elf64_Shdr *shdr;
int fd;
char *strtab;
fd = open(av[1], O_RDONLY);
data = mmap(NULL, filesize(fd), PROT_READ, MAP_SHARED, fd, 0);
elf = (Elf64_Ehdr *) data;
shdr = (Elf64_Shdr *) (data + elf->e_shoff);
strtab = (char *)(data + shdr[elf->e_shstrndx].sh_offset);
print_section(shdr, strtab, elf->e_shnum);
close(fd);
return 0;
}
但是我找不到一种方法来获取每个部分的数据也不是它们的起始偏移量。
感谢您的帮助
But I can't find a way to get either the data of each sections nor their starting offset. Thanks for your help
推荐答案
我认为您可以使用 sh_offset
和 shdr [i] .sh_size
:
void print_section(Elf64_Shdr *shdr, char *strTab, int shNum, uint8_t *data)
{
int i;
for(i = 0; i < shNum; i++) {
size_t k;
printf("%02d: %s Offset %lx\n", i, &strTab[shdr[i].sh_name],
shdr[i].sh_offset);
for (k = shdr[i].sh_offset; k < shdr[i].sh_offset + shdr[i].sh_size; k++) {
printf("%x", data[k]);
}
printf("\n");
for (k = shdr[i].sh_offset; k < shdr[i].sh_offset + shdr[i].sh_size; k++) {
printf("%c", data[k]);
}
printf("\n");
}
}
并这样称呼它:
print_section(shdr, strtab, elf->e_shnum, (uint8_t*)data);
获取虚拟地址(偏移量)的一种方法:
One way to get the virtual address (offset):
Elf64_Phdr *ph = (Elf64_Phdr *) ((uint8_t *) data + elf->e_phoff);
printf("Virtual address offset: %lx\n", ph->p_vaddr - elf->e_phoff);
这篇关于获取小精灵部分的偏移量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文