-
怎么找到Nt头?
通过DOS头最后一个字段的值,就可以得到NT头的文件偏移. -
怎么找到第一个区段表?
IMAGE_FIRST_SECTION , 区段表紧接在扩展头之后 , 扩展头的大小是不固定的 , 文件头中有一个字段记录了扩展头的大小, 通过NT可以找到扩展头,只要将扩展头的偏移 + 扩展头的大小,就可以得到扩展头尾部(区段表的头部) -
区段表中的VirtualAddress字段保存的是什么,
PointToRawData呢?
VirtualAddress : 区段数据在内存中的RVA
PointToRawData : 区段数据的文件偏移
- 记录OEP的字段在哪里?
扩展头.AddressOfEntry
-
怎么判断一个PE文件是32位的还是64位的?
扩展头.Magic : 32位 : 0x10b , 64位:0x20b -
PE文件的默认加载基址保存在哪里?
扩展头.Imagebase 保存默认加载基址.
- exe的默认加载基址是多少?DLL的默认加载基址
是多少?
exe的默认加载基址 : 0x0040 0000
DLL的默认加载基址 : 0x1000 0000
-
文件对齐粒度一般是多少? 内存对齐粒度一般
是多少?
文件对齐粒度 : 0x200
内存对齐粒度 : 0x1000 -
RVA怎么转换成FOA
FOA = RVA - 内存中区段的起始位置 + 在文件中区段的起始位置
=================
- 导入表的作用是什么? 没有它exe能运行吗?
导入表就是用于记录外部模块的名称,从外部模块导入进来的API名称或序号.
如果exe不需要用到其它模块的函数或数据的话,可以不存在导入表.
- 导出表的作用是什么? 没有它exe能运行吗?
导出一个模块的函数名称,序号和地址, 可以运行, 因为导出表只是提供给其它模块使用的信息表.
- 已知一个dll名,和一个dll导出函数的名字,
如何得到这个函数名的地址?
ENT EOT EAT
+--------+ +---+ +------+
| fun | | 1 | | 地址 |
| fun2 | | 0 | | 地址 |
| fun4 | | 2 | | 地址 |
+--------+ +---+ +------+
遍历ENT找到相等函数名 , 得到与之对应的EOT表的元素, 从EOT中取出一个序号(序号实际就是EAT中下标),用该序号就可以在地址表中得到对应的地址.
- 怎么才能知道一个exe都使用了哪些API?
通过导入表可以知道 , 因为exe要调用哪些外部API,都需要将API记录到导入表中,否则就无法调用.
- 如何判断导入函数是以序号导入或是以名称导入?
通过IMAGE_THUNK_DATA.DWORD 判断最高是否是1 , 是1说明以序号导入.
- 怎么才知道导出函数是仅以序号导出还是以名称导出?
判断一个地址是否以名称导出, 可以使用该地址在地址表中的下标在名称的序号表中查找, 如果名称的序号表存在该下标,则说明,该地址表的下标所保存的元素是以名称方式导出的.
如果地址表的下标不存在于名称的序号表中,则说明,该地址表的下标所保存的元素是以序号方式导出的,而它的序号就是这个地址表下标加序号基数.
网友评论