2021年PE加载器源代码解析


    
    1原创段仿真PE加载器行程序



    程序假定PE文件合法方没提供容错处理

    bool PELoader(char *lpStaticPEBuff long lStaticPELen)
    {
      long lPESignOffset  *(long *)(lpStaticPEBuff + 0x3c)
      IMAGE_NT_HEADERS *pINH  (IMAGE_NT_HEADERS *)(lpStaticPEBuff + lPESignOffset)

      取加载存中
      long lImageSize  pINH>OptionalHeaderSizeOfImage
      char *lpDynPEBuff  new char[lImageSize]
      if(lpDynPEBuff  NULL)
      {
        return false
      }
      memset(lpDynPEBuff 0 lImageSize)

      取PE文件节数量
      long lSectionNum  pINH>FileHeaderNumberOfSections

      计算PE头信息节表信息占存
      long lPEHeadSize  lPESignOffset + sizeof(IMAGE_NT_HEADERS) + lSectionNum * sizeof(IMAGE_SECTION_HEADER)
      
      加载PE头部信息节表
      memcpy(lpDynPEBuff lpStaticPEBuff lPEHeadSize)

      加载节
      long lFileAlignMask  pINH>OptionalHeaderFileAlignment  1        节磁盘中齐掩码
      long lSectionAlignMask  pINH>OptionalHeaderSectionAlignment  1  节load存中齐掩码
      IMAGE_SECTION_HEADER *pISH  (IMAGE_SECTION_HEADER *)((char *)pINH + sizeof(IMAGE_NT_HEADERS))
      for(int nIndex  0 nIndex < lSectionNum nIndex++ pISH++)
      {
        判定节齐属性合法
        if((pISH>VirtualAddress & lSectionAlignMask) || (pISH>SizeOfRawData & lFileAlignMask))
        {
          出现非法节
          delete lpDynPEBuff
          return false
        }

        加载改节
        memcpy(lpDynPEBuff + pISH>VirtualAddress lpStaticPEBuff + pISH>PointerToRawData pISH>SizeOfRawData)
      }

      修改导入表导入程序执行程中API函数址
      if(pINH>OptionalHeaderDataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]Size > 0) 0说明导入表
      {
        IMAGE_IMPORT_DESCRIPTOR *pIID  (IMAGE_IMPORT_DESCRIPTOR *)(lpDynPEBuff + \
          pINH>OptionalHeaderDataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]VirtualAddress)

        循环扫描函数导入dll
        for( pIID>Name  NULL pIID++)
        {
          *OllyDump源代码里重建导入表时候没初始化OriginalFirstThunk字段
          里OriginalFirstThunk字段进行处理*
          IMAGE_THUNK_DATA *pITD  (IMAGE_THUNK_DATA *)(lpDynPEBuff + pIID>FirstThunk)

          HINSTANCE hInstance  LoadLibrary(lpDynPEBuff + pIID>Name)
          if(hInstance  NULL)
          {
            导入dll失败
            delete lpDynPEBuff
            return false
          }

          循环扫描dll导入函数
          for( pITD>u1Ordinal  0 pITD++)
          {
            FARPROC fpFun
            if(pITD>u1Ordinal & IMAGE_ORDINAL_FLAG32)
            {
              函数序号方式导入
              fpFun  GetProcAddress(hInstance (LPCSTR)(pITD>u1Ordinal & 0x0000ffff))
            }
            else
            {
              函数名称方式导入
              IMAGE_IMPORT_BY_NAME * pIIBN  (IMAGE_IMPORT_BY_NAME *)(lpDynPEBuff + pITD>u1Ordinal)
              fpFun  GetProcAddress(hInstance (LPCSTR)pIIBN>Name)
            }

            if(fpFun  NULL)
            {
              导出函数失败
              delete lpDynPEBuff
              return false
            }

            pITD>u1Ordinal  (long)fpFun
          }

          FreeLibrary(hInstance)
        }
      }


      重定位处理
      if(pINH>OptionalHeaderDataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC]Size > 0)
      {
        取第重定位块
        IMAGE_BASE_RELOCATION *pIBR  (IMAGE_BASE_RELOCATION *)(lpDynPEBuff + \
          pINH>OptionalHeaderDataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC]VirtualAddress)

        long lDifference  (long)lpDynPEBuff  pINH>OptionalHeaderImageBase

        循环重定位块
        for( pIBR>VirtualAddress  0 )
        {
          char *lpMemPage  lpDynPEBuff + pIBR>VirtualAddress
          long lCount  (pIBR>SizeOfBlock  sizeof(IMAGE_BASE_RELOCATION)) >> 1

          页面中需重定位项进行处理
          short int *pRelocationItem  (short int *)((char *)pIBR + sizeof(IMAGE_BASE_RELOCATION))
          for(int nIndex  0 nIndex < lCount nIndex++)
          {
            int nOffset  pRelocationItem[nIndex] &0x0fff
            int nType  pRelocationItem[nIndex] >> 12

            然windows定义重定位类型PE文件中见03两种
            if(nType  3)
            {
              *(long *)(lpDynPEBuff + nOffset) + lDifference
            }
            else if(nType  0)
            {
              什做
            }
          }

          pIBR指重定位块
          pIBR  (IMAGE_BASE_RELOCATION *)(pRelocationItem + lCount)
        }

      }

      delete lpDynPEBuff

      return true
    }


    文档香网(httpswwwxiangdangnet)户传

    《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
    该内容是文档的文本内容,更好的格式请下载文档

    下载文档到电脑,查找使用更方便

    文档的实际排版效果,会与网站的显示效果略有不同!!

    需要 10 香币 [ 分享文档获得香币 ]

    下载文档

    相关文档

    深度解析天使、VC、PE、IPO投融资逻辑

    深度解析天使、VC、PE、IPO投融资逻辑天使投融资i路演 · 2015-09-10 06:55信息来源:众筹观察早期创业公司的融资“估值”,必须建立在公司收入规模,用户规模在不断扩大的前提之...

    11年前   
    454    0

    PE并购基金的发起与后期运营详细解析

    PE并购基金的发起与后期运营详细解析一、并购基金概述并购基金是私募股权基金的一种,用于并购企业,获得标的企业的控制权。常见的运作方式是并购企业后,通过重组、改善、提升等方式,实现企业上市或者出...

    10年前   
    503    0

    PE管特点

    PE管特点 1、良好的卫生性能:PE管加工时不添加重金属盐稳定剂,材质无毒性,无结垢层,不滋生细菌,很好地解决了城市饮用水的二次污染。 2、卓越的耐腐蚀性能:除少数强氧化剂外,可耐多种...

    9年前   
    7719    0

    源代码使用许可协议

    ________源代码使用许可合同甲方:XX软件有限公司 乙方:法定地址: 法定地址:法定代表人: 法定代表人:联系电话: ...

    4年前   
    1731    0

    燃气PE管供应合同

    设备、材料采购供应合同 甲方:   (需方)  合同编号:2007-06-15 乙方: (供方)  签订地点:                                      ...

    12年前   
    12288    0

    中国私募基金PE成立条件

    广州地区私募股权投资法律情况总结:1. 中央法律上私募基金分为股权投资基金与证券投资基金两类。根据中央机构编制委员会办公室发布的《关于私募股权基金管理职责分工的通知》(2013年6月)规定,这...

    11年前   
    583    0

    关于异地开发中的源代码管理问题

    关于异地开发中的源代码管理问题最近在带领一个异地的团队在进行.NetB/S系统开发工作。两地相隔1000多公里,两地都有开发人员,源码的统一管理就成了需要解决的问题。针对这个问题,想到如下的解...

    10年前   
    516    0

    数据结构大作业(含源代码)

    数据结构大作业作业题目: 职工信息管理系统 姓 名: 学 号: ...

    3年前   
    453    0

    2021年reactos仿windows系统内核源代码研究

    引导序号引导过程引导执行代码位数目标文件名称1.         主引导代码(Master Boot Record (MBR)code),主要寻找活动分区,然后读入引导扇区代码16位执行代码r...

    2个月前   
    159    0

    计算机源代码编写规范

     计算机源代码编写规范 文件编号: NW506104 ...

    12年前   
    25789    0

    C语言通讯录报告及源代码

    XX学院《C语言程序设计》课程设计报告 学 院:_电气与信息工程学院_ 专业班级: 计科班 学生姓名: 学 号: ...

    3年前   
    354    0

    股权投资协议书(PE)

    股权投资协议书甲方:地址:法定代表人:乙方:地址:法定代表人:鉴于:1. 项目公司名称:_______ ___(以下简称”目标公司”或甲方)注册资本为人民币____...

    4年前   
    857    0

    PE尽职调查保密协议

    尽职调查保密协议 甲方: 注册号:注册地址: 法定代表人: 乙方: 注册号:注册地址: 法定代表人: 鉴于乙方可能对甲方投资,为了对甲方进行评估,乙方需要...

    12年前   
    550    0

    PE管材料购销合同

    钢丝网骨架复合管材料购销合同购货单位(以下简称甲方):_____________________________供货单位(以下简称乙方):___________________________...

    4年前   
    874    0

    PE给水用户过路管道安装、试压方案

    施工方案报审表工程名称:新兴产业示范区横三路市政工程 编号:致:工程项目管理公司我方已根据施工合同的有关规定完成了 廊坊市新兴产业示范区横三路PE给水用户过路管道安装、试...

    1年前   
    449    0

    PE组长竞聘演讲稿

     PE组长竞聘演讲稿    尊敬的各位领导各位同事:  大家晚上好!我是吴建勋!今天我为自己能够站在这里参加PE组长竞选感到万分的荣幸和自豪!同时为大家的到来表示衷心的感谢和热烈的欢迎!非常感...

    9年前   
    545    0

    中国 PE 和 VC 机构的族谱图是怎样的

    中国 PE 和 VC 机构的族谱图是怎样的?修改写补充说明举报1 条评论 分享 • 邀请回答按投票排序按时间排序4 个回答215赞同反对,不会显示你的姓名孙志超所有你想知道的都在个人说明里21...

    11年前   
    518    0

    2017年LabVIEW的舵机自动加载测试系统软件设计范文

    LabVIEW的舵机自动加载测试系统软件设计范文  舵机是直升机动力学控制的执行机构,它在直升机实际飞行过程中需要承受通过液压助力器来的空气动力及其力矩作用。 详细内容请看下文labview的...

    7年前   
    383    0

    数字图像处理车牌识别课程设计matlab实现附源代码

    基于matlab的车牌识别系统一、 目的与要求目的:利用matlab实现车牌识别系统,熟悉matlab应用软件的基础知识,了解了基本程序设计方法,利用其解决数字信号处理的实际应用问题,从而加深...

    1年前   
    342    0

    《电力通信网络管理信息系统的设计与实现》源代码

    头文件: /****************************************************************** * All rights reserved...

    5年前   
    962    0

    文档贡献者

    奋斗不止500年

    贡献于2024-02-07

    下载需要 10 香币 [香币充值 ]
    亲,您也可以通过 分享原创文档 来获得香币奖励!
    下载文档

    该用户的其他文档