re_base3

  1. PE
    1. DOS存根
    2. NT头
    3. RAV to RAW
    4. IAT导入地址表
  • EAT
  • IAT hook
  • PE and IAT hook

    PE

    由于了解IAT,需要了解一点PE,这里把PE也给写了吧

    PE文件种类:

    image-20221222193952005

    OBJ文件不能执行,dll和sys文件需要调试器执行或者服务和程序加载执行

    DOS签名和PE签名

    image-20221222194231640

    PE文件大体分为:1.PE头、2.PE体

    1.PE头

    • DOS签名
    • DOS存根
    • NT头
    • 一系列节区头
      • .data(数据)
      • .text(代码)
      • .rsrc(资源)

    2.PE体:一系列节区

    名词介绍:

    ​ VA:virtual address 绝对虚拟内存地址

    ​ RVA:相对虚拟内存地址

    ​ VA = RVA + imageBase

    DOS头结构体:唯一有用的就是e_magic和e_lfanew

    image-20221222195650362

    其中e_magic就是Dos签名,e_lfanew就是NT头的偏移

    DOS存根

    Dos存根是兼容dos系统的一种产物,可有可无,内容可用xp内置debug查看

    image-20221222195853656

    内容是一段汇编代码,在dos系统中执行

    NT头

    NT头结构体

    image-20221222200235227

    签名不作介绍,文件头结构体:

    image-20221222200349032

    Machine代表cpu类别

    SizeOfOptionalHeader是表示可选头的大小

    Characteristics表示文件是否是dll,是否可执行

    NT可选头结构体:

    image-20221222200743347

    image-20221222200759909

    NT可选头非常重要,它记录了很多重要的数据

    ImageBase,是映像基址,映像指的是PE文件加载到内存的一种形态(我觉得更像是一种叫法),映像基址定义了文件加载进内存的基础地址

    SectionAlignment, 节区对齐是文件在内存中的最小单位,文件在内存的大小应该是这个值的整数倍

    FileAlignment, 文件对齐是文件在磁盘中的最小单位,文件在磁盘的大小应该是这个值的整数倍

    Subsystem,子系统用来区分文件是sys驱动文件还是exe可执行文件

    image-20221222201551009

    NumberOfRvaAndSizes , 记录DataDirectory数组的个数

    DataDirectory:

    image-20221222201756663

    节区头结构体:

    image-20221222202014726

    image-20221222202552956

    这里的VirtualAddress是用RVA表示的

    RAV to RAW

    RAW就是文件中节区的偏移(非内存)

    image-20221222203627898

    IAT导入地址表

    映像导入描述结构体:

    image-20221222204623280

    image-20221222204719793

    文件导入多少个库文件,就有多少个 image_import_descriptor结构体

    ==该结构体的地址保存在image_optional_header32.DataDirectory[1].VirtualAddress中==

    image-20221222210418625

    INT结构体保存着Image_import_by_name的指针

    结构图:

    image-20221222205449044

    PE装载器将导入函数加载到IAT的顺序:

    image-20221222205721041

    EAT

    不想写了,和IAT差不多,一个导入一个导出

    它的查找数据先是image_optional_header32.DataDirectory[0].VirtualAddress找到这个结构体,然后根据要找的函数名去AddressOfNames数组里面拿到下标,然后用下标再去Oridinal数组找,找到下标又去AddressOfFunction那里找函数地址

    没有函数名直接用Ordinal查找,Ordinal数组存在的意义是我忘了。。反正就这样

    image-20221222211536947

    image-20221222211514061


    IAT hook


    转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jaytp@qq.com

    ×

    喜欢就点赞,疼爱就打赏