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

Linux Hook技术(二)

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

转载自https://blog.csdn.net/yyttiao/article/details/7350279
今天这一节,主要是讲程序头(Program Headers),程序头主要是从加载执行的角度来看的,很多人想那里面到底是什么东西呢,其实程序头就是一个结构数组,每一个头保存着对应的不同的数据,有的数据是告诉系统把我放入内存,有的数据时告诉系统我是变量.等等...在系统加载程序的时候就要通过该程序头来加载不同的段.

下面就来看一下程序头的结构体:

typedef struct
 
{
 
   Elf32_Word p_type; /* Segment type */
 
   Elf32_Off p_offset; /* Segment file offset */
 
   Elf32_Addr p_vaddr; /* Segment virtual address */
 
   Elf32_Addr p_paddr; /* Segment physical address */
 
   Elf32_Word p_filesz; /* Segment size in file */
 
   Elf32_Word p_memsz; /* Segment size in memory */
 
   Elf32_Word p_flags; /* Segment flags */
 
   Elf32_Word p_align; /* Segment alignment */
 
} Elf32_Phdr;

p_type: 段的类型

在elf.h头文件中,有很详细的说明段的类型,比如PT_LOAD 表示加载的程序段

p_offset: 文件偏移

该段在文件中的偏移。这个偏移是相对于整个文件的。

p_vaddr: 加载后的虚拟地址

该段加载后在进程空间中占用的内存起始地址。

p_paddr: 该段的物理地址

这个字段被忽略,因为在多数现代操作系统下物理地址是进程无法触及的。

p_filesz: 该段在文件中占用的字节大小

有些段可能在文件中不存在但却占用一定的内存空间,此时这个字段为0。

p_memsz: 该段在内存中占用的字节大小

有些段可能仅存在于文件中而不被加载到内存,此时这个字段为0。

p_flags: 段的属性

表示该段的读写执行等属性.elf.h文件中的定义是

#define PF_X (1 << 0) /* Segment is executable */
#define PF_W (1 << 1) /* Segment is writable */
#define PF_R (1 << 2) /* Segment is readable */
#define PF_MASKOS 0x0ff00000 /* OS-specific */
#define PF_MASKPROC 0xf0000000 /* Processor-specific */

p_align: 对齐

现代操作系统都使用虚拟内存为进程序提供更大的空间,分页技术功不可没,页就成了最小的内存分配单位,不足一页的按一页算。所以加载程序数据一般也从一页的起始地址开始,这就属于对齐。

示例代码:

#include <stdio.h>
#include <math.h>
#include <elf.h>
int main()
{
    typedef struct
    {
        int num;
    } student;
    student stu1;
    stu1.num = 133;
    printf("%d\n", stu1.num);
    return 0;
}
typedef struct _SegmentType_

{

    unsigned int type;

    char *typeName;

} SegmentType;

SegmentType segTyoe[] = {

    {0, "NULL"},
    {1, "LOAD"},

    {2, "DYNAMIC"},
    {3, "INTERP"},

    {4, "NOTE"},
    {5, "SHLIB"},

    {6, "PHDR"},
    {7, "TLS"},

    {8, "NUM"},
    {0x60000000, "LOOS"},
    {0x6474e550, "GNU_EH_FRAME"},
    {0x6474e551, "PT_GNU_STACK"},
    {0x6474e552, "PT_GNU_RELRO"},
    {0x6ffffffa, "PT_SUNWBSS"},
    {0x6ffffffb, "PT_SUNWSTACK"},
    {0x6fffffff, "PT_HISUNW"},

    {0x70000000, "PT_HIOS"},
    {0x7fffffff, "PT_HIPROC"},

};

char *findSegTypeName(unsigned int type)

{

    int i = 0;

    for (i = 0; i < sizeof(segTyoe) / sizeof(SegmentType); i++)
    {

        if (segTyoe[i].type == type)
        {

            return segTyoe[i].typeName;

            break;
        }
    }

    return segTyoe[0].typeName;
}

void displayPhdr(Elf32_Ehdr *ehdr, Elf32_Phdr *phdr)

{

    printf("Program Headers:\n");

    printf("%-20s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n",

           "Type", "Offset", "VirtAddr", "PhysAddr", "FileSiz",

           "MemSiz", "Flg", "Align");

    int i = 0;

    for (i = 0; i < ehdr->e_phnum; i++)
    {

        printf("%-20s%-10x%-10x%-10x%-10x%-10x%-10x%-10x\n",

               findSegTypeName(phdr->p_type),

               phdr->p_offset,

               phdr->p_vaddr,

               phdr->p_paddr,

               phdr->p_filesz,

               phdr->p_memsz,

               phdr->p_flags,

               phdr->p_align

        );

        if (phdr->p_type == PT_INTERP)
        {

            printf("\t[Requesting program interpreter: %s]\n",

                   (char *)((char *)ehdr + phdr->p_offset));
        }

        phdr++;
    }
}

相关文章

  • Linux Hook技术(二)

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

  • HOOK

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

  • Linux Preload Hook原理与实践

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

  • HOOK原理

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

  • Linux Hook技术(四)

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

  • Linux Hook技术(五)

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

  • Linux Hook技术(三)

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

  • Linux Hook技术(一)

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

  • Hook 技术(二)

    一、前言   上一篇文章简单介绍了一下 hook 技术,并且写了个例子,不管是你想去 SecondActivity...

  • iOS逆向0011--HOOK(一)-原理

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

网友评论

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

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