• PE解析器与加载器编写指南


    PE解析器与加载器编写指南

      最近准备去实习,看公司要求应该开发PE相关的查杀引擎,因此再回头复习一下PE格式,重新写一个PE解析器和PE加载器,再此记录下有关坑。

    PE解析器部分:

    1)如何确定节区表

      正确计算方法: pSection =  pNtHeader + sizeof(IMAGE_NT_HEADER) 。

      错误计算方法:pSection = pFile + sizeof(IMAGE_DOS_HEADER) + sizeof(IMAGE_NT_HEADER)。

      原因:DOS_HEADER后面还留有一段数据,并不紧跟着NT_HEADER,因此你这样计算是错误的!

        

    2)RVA与FOA的转换

      我们现在是PE解析,其都基于FOA,因此我们现在只讲解RVA->FOA进行转换,在后面的PELoader这块,我们再来分析FOA->RVA。

      其分析是基于节表的,循环遍历节表,判断其落在相关区间,然后在差值计算,得到对应的FOA,如下图:

      

    3)导入表的解析

      导入表是当DLL加载时,根据该PE文件的导入表对其进行修复操作,之后函数找到该函数就可以找到对应的函数地址。

      现在我们来回顾一下导入表结构,其导入表结构如下:

      

       如果我们要获取整张表的数据,我们需要建立一个二维数组,对应着两行数据,因此我们设计了如下数据结构:

      

      现在,随之而来的一个问题:如何确定导入表的个数?PE文件的数据结构似乎没有一个数据表明其个数。

      答案是其连续0为结束,因此我们申请一块中间内存进行比较即可。(这种方式在PE文件解析中经常用到)。

      下面就是初始化导入表的代码,很好理解:

       

    4)导出表的解析

      导出表主要是三张子表,函数名称表,函数序号表,函数地址表,这三张表用一张图就很好解决。

      

       因此我们采用如下数据结构存储:

      

       解析代码:

      先遍历函数地址表,地址和序号初始化,名字先设置为NULL,之后我们再遍历名称和序号表,根据序号将其赋值。

      

     5)重定位的解析

      重定位表构造相对简单,其sizeOfBlock是加上块头部8字节的大小,计算偏移是要注意不要再加多了。

      重定位元素也很简单,以WORD为单位,但要注意高4位为0x3才有效,修复重定位表时要检查该位是否有效。

      我们开始是如下的数据结构:

      

       下面为重定位表的解析,其依然采用中间变量的方法:

      

    PE加载器

      PE加载器,就是将一个PE文件映射到自己的内存,然后启动其main函数运行程序。

      一个PELoader的实现,需要有几个注意点:修复IAT表;修复重定位表;将内存属性写为可执行。

    1)修复IAT表

      这里有两个函数 LoadLibrary 和 GetProcAddress,这两个函数能帮助我们很好的找到目标函数,其代码如下:

      

    2)修复重定位表

      

    3)修改属性并执行Main函数

      我们开始将文件映射时,其是只读属性,在修复之后如果执行Main函数会触发0xc0000005页权限访问异常。

      因此我们需要通过如下代码将其置为可执行属性,当然这里存在瑕疵,但是我们只是写个简单Demo,也没太多要求。

      

  • 相关阅读:
    Silverlight实用窍门系列:68.Silverlight的资源字典ResourceDictionary
    在HyperlinkButton的URL地址里附加多个参数(以http get的方式)
    SilverLight CheckBox 控件 DataContext属性与DataContextChanged事件
    关于事件在意料之外触发的问题
    关于Telerik RadGridView 数据列拖动后异常的一种情况
    silverlight使用小计(先做记录后续整理)
    Redis_简介和安装
    Python并行系统工具_multiprocessing模块
    Python并行系统工具_程序退出和进程间通信
    Python并行系统工具_进程分支
  • 原文地址:https://www.cnblogs.com/onetrainee/p/12938085.html
Copyright © 2020-2023  润新知