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

[原创]执行视图 解析init_array

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

需要注意的是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)
雪    币: 1013
活跃值: (1397)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
aihacker 2016-8-26 17:20
3
0
学习一下
雪    币: 745
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
_thouger 2023-3-2 14:42
4
0
404咯
游客
登录 | 注册 方可回帖
返回