美文网首页
PE文件问答

PE文件问答

作者: MagicalGuy | 来源:发表于2018-10-09 00:18 被阅读0次
    1. 怎么找到Nt头?
      通过DOS头最后一个字段的值,就可以得到NT头的文件偏移.

    2. 怎么找到第一个区段表?
      IMAGE_FIRST_SECTION , 区段表紧接在扩展头之后 , 扩展头的大小是不固定的 , 文件头中有一个字段记录了扩展头的大小, 通过NT可以找到扩展头,只要将扩展头的偏移 + 扩展头的大小,就可以得到扩展头尾部(区段表的头部)

    3. 区段表中的VirtualAddress字段保存的是什么,
      PointToRawData呢?
      VirtualAddress : 区段数据在内存中的RVA
      PointToRawData : 区段数据的文件偏移

    1. 记录OEP的字段在哪里?
      扩展头.AddressOfEntry
    1. 怎么判断一个PE文件是32位的还是64位的?
      扩展头.Magic : 32位 : 0x10b , 64位:0x20b

    2. PE文件的默认加载基址保存在哪里?
      扩展头.Imagebase 保存默认加载基址.

    1. exe的默认加载基址是多少?DLL的默认加载基址
      是多少?
      exe的默认加载基址 : 0x0040 0000
      DLL的默认加载基址 : 0x1000 0000
    1. 文件对齐粒度一般是多少? 内存对齐粒度一般
      是多少?
      文件对齐粒度 : 0x200
      内存对齐粒度 : 0x1000

    2. RVA怎么转换成FOA
      FOA = RVA - 内存中区段的起始位置 + 在文件中区段的起始位置

    =================

    1. 导入表的作用是什么? 没有它exe能运行吗?
      导入表就是用于记录外部模块的名称,从外部模块导入进来的API名称或序号.
      如果exe不需要用到其它模块的函数或数据的话,可以不存在导入表.
    1. 导出表的作用是什么? 没有它exe能运行吗?
      导出一个模块的函数名称,序号和地址, 可以运行, 因为导出表只是提供给其它模块使用的信息表.
    1. 已知一个dll名,和一个dll导出函数的名字,
      如何得到这个函数名的地址?
      ENT EOT EAT
      +--------+ +---+ +------+
      | fun | | 1 | | 地址 |
      | fun2 | | 0 | | 地址 |
      | fun4 | | 2 | | 地址 |
      +--------+ +---+ +------+
      遍历ENT找到相等函数名 , 得到与之对应的EOT表的元素, 从EOT中取出一个序号(序号实际就是EAT中下标),用该序号就可以在地址表中得到对应的地址.
    1. 怎么才能知道一个exe都使用了哪些API?
      通过导入表可以知道 , 因为exe要调用哪些外部API,都需要将API记录到导入表中,否则就无法调用.
    1. 如何判断导入函数是以序号导入或是以名称导入?
      通过IMAGE_THUNK_DATA.DWORD 判断最高是否是1 , 是1说明以序号导入.
    1. 怎么才知道导出函数是仅以序号导出还是以名称导出?
      判断一个地址是否以名称导出, 可以使用该地址在地址表中的下标在名称的序号表中查找, 如果名称的序号表存在该下标,则说明,该地址表的下标所保存的元素是以名称方式导出的.
      如果地址表的下标不存在于名称的序号表中,则说明,该地址表的下标所保存的元素是以序号方式导出的,而它的序号就是这个地址表下标加序号基数.

    相关文章

      网友评论

          本文标题:PE文件问答

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