PE文件问答

2018-10-09  本文已影响0人  MagicalGuy
  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. 怎么才知道导出函数是仅以序号导出还是以名称导出?
    判断一个地址是否以名称导出, 可以使用该地址在地址表中的下标在名称的序号表中查找, 如果名称的序号表存在该下标,则说明,该地址表的下标所保存的元素是以名称方式导出的.
    如果地址表的下标不存在于名称的序号表中,则说明,该地址表的下标所保存的元素是以序号方式导出的,而它的序号就是这个地址表下标加序号基数.
上一篇下一篇

猜你喜欢

热点阅读