-
-
[原创]执行视图 解析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
[培训]《安卓高级研修班(网课)》月薪三万计划