关于ELF文件分析

jody_go 2014-06-18 05:15:00

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <libelf.h>
#include <gelf.h>

char* src_01 = "123456";
int src_02 = 800;

void test(int i)
{
printf("[int test]i is %d\n", i);
}

int main(int argc, char* argv[])
{
Elf *elf = NULL;
Elf_Scn *scn = NULL;
GElf_Shdr shdr;
Elf_Data *data = NULL;
int fd, i, count;
void (*func)(int);

elf_version(EV_CURRENT);
fd = open(argv[1], O_RDONLY);
elf = elf_begin(fd, ELF_C_READ, NULL);
while((scn=elf_nextscn(elf,scn)) != NULL)
{
gelf_getshdr(scn, &shdr);
if (shdr.sh_type == SHT_SYMTAB)
{
break;
}
}

data = elf_getdata(scn, NULL);
count = shdr.sh_size/shdr.sh_entsize;
for (i=0; i<count; i++)
{
GElf_Sym sym;
gelf_getsym(data, i, &sym);
if (!(strcmp("test", elf_strptr(elf, shdr.sh_link, sym.st_name))))
{
func = (void(*)(int))(unsigned long)(sym.st_value&0xffffffff);
func(7);
}

if (!(strcmp("src_01", elf_strptr(elf, shdr.sh_link, sym.st_name))))
{
char* ps = (char *)((unsigned long)(sym.st_value&0xffffffff));
printf("sym.st_size = %d, ps = %s\n", sym.st_size, ps);
}

if (!(strcmp("src_02", elf_strptr(elf, shdr.sh_link, sym.st_name))))
{
int pi = (int)((unsigned long)(sym.st_value&0xffffffff));
printf("sym.st_size = %d, pi = %d\n", sym.st_size, pi);
}
}

elf_end(elf);
close(fd);

return 0;
}



我想根据elf中的st_value值来获得变量src_01和src_02的值,为什么不行呢?test函数则是可以获取的!
...全文
195 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
liucsdn7 2014-06-19
  • 打赏
  • 举报
回复
夜深了。。。。。
赵4老师 2014-06-18
  • 打赏
  • 举报
回复
参考objdump源代码?

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧