美文网首页
Linux Hook技术(四)

Linux Hook技术(四)

作者: Sma11_Tim3 | 来源:发表于2020-04-06 17:26 被阅读0次

这一节主要是讲述的是符号节.要怎么才能找到符号节呢,其实只要在上一期讲的遍历节头的时候,判断每一个节类型是不是SHT_SYMTAB或SHT_DYNSYM,那么相应的节就是一个符号节了,符号节存放的是一张符号表,符号表也是一个连续存储的结构数组.

那什么叫符号呢?编程过程中用到的变量和函数都可以称之为符号,一个ELF文件中并不只有一个符号节,通常是两个,一个叫动态节,打印名称为".dynsym",它的类型是SHT_DYNSYM,所有引入的外部符号在这里有所体现.另一个类型值为SHT_SYMTAB,名字为".symtab",它保存了所有有用的符号信息.

typedef struct
{
  Elf32_Word    st_name;     /* Symbol name (string tbl index) */
  Elf32_Addr    st_value;    /* Symbol value */
  Elf32_Word    st_size;     /  * Symbol size */
  unsigned char st_info;     /* Symbol type and binding */
  unsigned char st_other;    /* Symbol visibility */
  Elf32_Section st_shndx;    /* Section index */
} Elf32_Sym;

st_name; 符号的名字索引

这个成员是一个符号表对应的字符串表中的一个偏移,对应的字符串表可以通过该节link成员获取得到.

st_value; 符号地址

该成员给出了相应的符号值,根据符号类型和用途,它可能是个内存地址或者绝对值

st_size; 符号的字节大小

如果是数据对象,可能给出该数据对象占用的大小,如果是函数,可能给出了函数指令占用的大小.

st_info; 符号的信息

这个成员有2部分组成,第四位用来表示符号的类型.高四位表示这个符号的绑定类型,对于从动态库引入的函数,这个字段就应该为STB_GLOBAL,表示这个符号是全局符号.在elf.h中,给出了如下2个宏,用来获取符号信息

#define ELF32_ST_BIND(val)   (((unsigned char) (val)) >> 4)
#define ELF32_ST_TYPE(val)   ((val) & 0xf)
#define ELF32_ST_INFO(bind, type)   (((bind) << 4) + ((type) & 0xf))

st_other; 此字段恒为0

st_shndx; 每个符号和某些节相关,这个字段给出了一个节头的索引.如果函数体所在的节不存于当前文件中,此字段为0.

下面就通过代码来看一下,怎么获取这些符号节表的信息.

代码写的不是很好,请主要关注怎么去获取这些信息~~

示例代码:

void display_dynsym(Elf32_Ehdr *ehdr,Elf32_Shdr *shdr)
{
Elf32_Sym *symb = (Elf32_Sym *)((char*)ehdr + shdr->sh_offset);
int  symbSize = shdr->sh_size / sizeof(Elf32_Sym);
char    *symName = (char*)(((Elf32_Shdr *)((char*)ehdr + ehdr->e_shoff + shdr->sh_link * sizeof(Elf32_Shdr)))->sh_offset 
+ (char*)ehdr);
printf("symName = 0x%x\n",(char*)symName);
printf("symb = 0x%x\n",(char*)symb);
printf("symbSize = 0x%x\n",(char*)symbSize);
printf("Symbol table '.dynsym' contains %d entries:\n",symbSize);
int i = 0;
printf("%7s:%-8s%-6s%-8s%-7s%-9s%-4s%s\n","Num","Value","Size",
"Type","Bind","Vis","Ndx","Name");
for(i = 0; i < symbSize;i++){
printf("%7d:",i);
printf("%-8x",symb->st_value);
printf("%-8d",symb->st_size);
printf("%-6x",ELF32_ST_TYPE(symb->st_info));
printf("%-8x",ELF32_ST_BIND(symb->st_info));
printf("%-7x",symb->st_other);
printf("%-9d",symb->st_shndx);
printf("%s",symName + symb->st_name);
printf("\n");
symb++;
}
}
void display_sym(Elf32_Ehdr *ehdr,Elf32_Shdr *shdr)
{
Elf32_Sym *symb = (Elf32_Sym *)((char*)ehdr + shdr->sh_offset);
int  symbSize = shdr->sh_size / sizeof(Elf32_Sym);
char    *symName = (char*)(((Elf32_Shdr *)((char*)ehdr + ehdr->e_shoff + shdr->sh_link * sizeof(Elf32_Shdr)))->sh_offset 
+ (char*)ehdr);
printf("symName = 0x%x\n",(char*)symName);
printf("symb = 0x%x\n",(char*)symb);
printf("symbSize = 0x%x\n",(char*)symbSize);
printf("Symbol table '.symtab' contains %d entries:\n",symbSize);
int i = 0;
printf("%7s:%-8s%-6s%-8s%-7s%-9s%-4s%s\n","Num","Value","Size",
"Type","Bind","Vis","Ndx","Name");
for(i = 0; i < symbSize;i++){
printf("%7d:",i);
printf("%-8x",symb->st_value);
printf("%-8d",symb->st_size);
printf("%-6x",ELF32_ST_TYPE(symb->st_info));
printf("%-8x",ELF32_ST_BIND(symb->st_info));
printf("%-7x",symb->st_other);
printf("%-9d",symb->st_shndx);
printf("%s",symName + symb->st_name);
printf("\n");
symb++;
}
}
void displaySmby(Elf32_Ehdr *ehdr,Elf32_Shdr *shdr)
{
int py = ehdr->e_shstrndx * sizeof(Elf32_Shdr);
Elf32_Shdr *symtab = (Elf32_Shdr *)((char*)shdr + py);
char *szShdrName = (char*)(symtab->sh_offset + (char*)ehdr);
int i = 0;
for(i = 0; i < ehdr->e_shnum; i++){
if(shdr->sh_type == SHT_SYMTAB){
display_sym(ehdr,shdr);
}else if(shdr->sh_type == SHT_DYNSYM){
display_dynsym(ehdr,shdr);
}
shdr++;
}
}

相关文章

  • Linux Hook技术(四)

    这一节主要是讲述的是符号节.要怎么才能找到符号节呢,其实只要在上一期讲的遍历节头的时候,判断每一个节类型是不是SH...

  • Linux Preload Hook原理与实践

    Preload简介Linux常见Hook技术对比函数调用类型内核模块Hook应用层Inline HookGot表应...

  • Linux Hook技术(五)

    今天咱们来点实战的话题,对于前面我们研究的那么多知识,做一次总结.来看看这些节表之间是怎么联系起来的.最后我们将经...

  • Linux Hook技术(三)

    转载自:https://blog.csdn.net/yyttiao/article/details/7358578...

  • Linux Hook技术(二)

    转载自https://blog.csdn.net/yyttiao/article/details/7350279 ...

  • Linux Hook技术(一)

    本文借鉴了网上大多数文章,相当于一边学习一边整合。主要借鉴https://blog.csdn.net/yyttia...

  • HOOK

    HOOK 一、HOOK概述 HOOK(钩子) 其实就是改变程序执行流程的一种技术的统称! 二、iOS中HOOK技术...

  • SSDT知识点

    0x00 Hook技术 hook技术分为两块: Ring3层的Hook,俗称应用层hook技术 Ring0层的Ho...

  • 005——HOOK原理

    HOOK概述 HOOK(钩子)其实就是改变程序执行流程的一种技术的统称!HOOK原理 IOS中HOOK技术的几种方...

  • 浅谈android hook技术

    安全博客 > 技术研究 > 浅谈android hook技术 浅谈android hook技术 您当前的位置:...

网友评论

      本文标题:Linux Hook技术(四)

      本文链接:https://www.haomeiwen.com/subject/rfjfactx.html