首页
社区
课程
招聘
[原创]执行视图 解析init_array
发表于: 2016-8-24 11:21 6614

[原创]执行视图 解析init_array

2016-8-24 11:21
6614
小菜渣作.
简单地通过程序头表解析.

需要注意的是Elf32_Dyn中解析出的init_array 地址是RVA,有些时候段装载地址可能和文件偏移不同(也就是p_vaddr!= p_offset), 如果想直接从文件解析该数组需要做转换.
转换方法是查表.
下面是转换代码:
Elf32_Addr VaToFa(int fd,Elf32_Addr rva)
{
  /*顾名思义
    fd - 打开的elf文件句柄
    rva - 欲转换的地址
    return - rva的文件偏移
  */
  int old;
  int pnum;
  Elf32_Ehdr ehdr;
  Elf32_Addr result;
  old = lseek(fd,0,SEEK_CUR);
  lseek(fd,0,SEEK_SET);
  read(fd,&ehdr,sizeof(Elf32_Ehdr));
  pnum = ehdr.e_phnum;
  result = rva;
  for(int i = 0;i<pnum;i++)
  {
    Elf32_Phdr phdr;
    read(fd,&phdr,sizeof(Elf32_Phdr));
    if(rva>=phdr.p_vaddr && rva<phdr.p_vaddr+phdr.p_memsz)
      result =  rva-phdr.p_vaddr+phdr.p_offset;
  }
  lseek(fd,old,SEEK_SET);
  return result;
}


完整程序:
https://github.com/Chenyuxin/elf_initarray.git
其中还包含几个用于测试的样本.

执行记录:
pandaos@pandaos:~/elf1$ gcc main.cpp -o elf1
pandaos@pandaos:~/elf1$ ./elf1 libdanmu.so 
offset : 1399f0
INIT ARRAY OFFSET:13a9c0(RVA)
INTI NUM:11
init table:
fun 0 :9eb9
fun 1 :9fa9
fun 2 :a099
fun 3 :a1bd
fun 4 :a2e1
fun 5 :a815
fun 6 :a895
fun 7 :a8d1
fun 8 :a8e1
fun 9 :a9bd
fun 10 :aa99
pandaos@pandaos:~/elf1$ 


https://github.com/Chenyuxin/elf_initarray.git

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 1380
活跃值: (1626)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
学习一下
2016-8-26 17:20
0
雪    币: 754
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
404咯
2023-3-2 14:42
0
游客
登录 | 注册 方可回帖
返回
//