[原创]执行视图 解析init_array
发表于:
2016-8-24 11:21
6808
小菜渣作.
简单地通过程序头表解析.
需要注意的是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;
}
完整程序:
b3cK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6o6K9r3g2F1P5i4g2^5K9h3&6Q4x3V1k6W2L8r3k6Q4y4h3k6A6L8X3W2@1j5i4u0J5j5i4W2Q4x3X3g2Y4K9i4b7`.
其中还包含几个用于测试的样本.
执行记录:
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$
710K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6o6K9r3g2F1P5i4g2^5K9h3&6Q4x3V1k6W2L8r3k6Q4y4h3k6A6L8X3W2@1j5i4u0J5j5i4W2Q4x3X3g2Y4K9i4b7`.
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课