zoukankan      html  css  js  c++  java
  • API HOOK和PE文件的关系

    api hook技术的难点,并不在于hook技术,而在于对PE结构的学习和理解。如何修改api函数的入口地址?这就需要学习pe可执行文件(.exe,.dll等)如何被系统映射到进程空间中,这需要学习pe格式的基本知识。windows已经提供了很多数据结构struct帮助我们访问pe格式,记住它们,我们就不要自己计算格式的具体字节位置这些繁琐的细节。但是从api hook的实现来看,pe格式的访问部分仍然是整个编程实现中最复杂的一部分,对于经常crack的朋友不在此列。
    假设我们已经了解了pe格式,那么我们在哪里修改api的函数入口点比较合适呢?这个就是输入符号表imported symbols table(间接)指向的输入符号地址。
    下面对于pe格式的介绍这一部分,学习了pe格式后再看这些就很容易了。
    pe格式的基本组成:
    DOS文件头
    以4D5A的16进制即MZ开头
    PE文件头
    以50450000的PE00开头
    可选头文件
    包含下面的数据目录
    数据目录
    函数入口地址,基地址,内存,文件对齐粒度之类信息
    节表
    维护一个所有节的信息
    节表1
    具有同类特征的信息,文件的主体部分
    节表2
      
    ...
      
    节表n
      
    我们需要从“可选头”尾的“数据目录”数组中的第二个元素——输入符号表的位置,它是一个IMAGE_DATA_DIRECTORY结构,从它中的VirtualAddress地址,“顺藤摸瓜”找到api函数的入口地点。
    简单说明如下:
    OriginalFirstThunk 指向IMAGE_THUNK_DATA结构数组,为方便只画了数组的一个元素,AddressOfData 指向IMAGE_IMPORT_BY_NAME结构。
    IMAGE_IMPORT_DESCRIPTOR数组:每个引入的dll文件都对应数组中的一个元素,以全0的元素(20个bytes的0)表示数组的结束
    IMAGE_THUNK_DATA32数组:同一组的以全0的元素(4个bytes的0)表示数组的结束,每个元素对应一个IMAGE_IMPORT_BY_NAME结构
    IMAGE_IMPORT_BY_NAME:如..@Consts@initialization$qqrv. 表示
    Unmangled Borland C++ Function: qualified function __fastcall Consts::initialization()
    如果PE文件从kernel32.dll中引入10个函数,那么IMAGE_IMPORT_DESCRIPTOR 结构的 Name1域包含指向字符串"kernel32.dll"的RVA,同时每个IMAGE_THUNK_DATA 数组有10个元素。(RVA是指相对地址,每一个可执行文件在加载到内存空间前,都以一个基址作为起点,其他地址以基址为准,均以相对地址表示。这样系统加载程序到不同的内存空间时,都可以方便的算出地址)
    上述这些结构可以在winnt.h,ImageHlp.h头文件里查到。
    [1] 
  • 相关阅读:
    盒子高度是百分比的时候里面的内容垂直居中
    echarts -- 饼图引导线的设置
    列出你所知道可以改变⻚⾯布局的属性
    vue 组件传值(父传子,子传父,兄弟组件之间传值)
    动态设置缩放区域(数据不累计叠加)
    pytest之mark标签注册及用例匹配规则修改
    Django(1)--安装与文件解析
    visual studio code django
    day01 红蓝球
    day02 基本数据类型
  • 原文地址:https://www.cnblogs.com/fulse/p/6272539.html
Copyright © 2011-2022 走看看