关于PE结构和32位汇编的问题

时间:2022-02-03 19:26:39
     PE文件里的节和32位汇编里的段是没有关系的还是就是一个东西?就是数据段,代码段,等。指令使用的都是虚拟线性地址,段寄存器变成了段选择器,在段描述符表里查找段信息也没什么必要啊,指令里指定的地址都是32位线性地址,根本不用地址转换的。我看到有人说是为了装在内存的时候只装在一份代码段到内存,然后只要映射到不同进程就可以了,和DLL差不多,是因为这个才分段?我查了也没查到PE的节和数据段,代码段等到底是不是一样的。要是一样的话节表就是段描述符表?谁能告诉我?谢谢了

8 个解决方案

#1


pe的section和汇编里的segment没什么关系,masm中用segment指示符来定义section,我觉得是遗留问题
16位exe中一般都为每个段寄存器分配了一块空间,所以exe中的一块内存和一个段对应

但32位中就没有这个关系了

#2


正因为是虚拟线性地址,才需要用段选择子等,映射成独立的物理地址上去。

#3


引用 2 楼 g_spider 的回复:
正因为是虚拟线性地址,才需要用段选择子等,映射成独立的物理地址上去。

我看了罗云彬的32位汇编,里面有图,是只要是用到段选择子的时候都会通过地址转换转换成虚拟线性地址,指令使用的都是虚拟线性地址,如果开启分页管理,那么就是映射后找到物理地址,如果没开启就直接是物理地址。指令中用的都是32位虚拟线性地址,寄存器也是32位的,根本涉及不到段选择器。那么这种分段还有什么用呢。

#4


指令用的是段偏移,分段还是会起作用,只不过windows使用扁平寻址模式,把cs,ds,es,ss的基地址设为0,界限为4G,因此这几个段中逻辑地址的段偏移就是线性地址

分段肯定有用,比如代码段的特权级

#5


pe文件中的区段和汇编中的段压根就一点关系没有
32位汇编的段里面的东西跟16位都己经完全不一样了

#6


引用 4 楼 lactoferrin 的回复:
指令用的是段偏移,分段还是会起作用,只不过windows使用扁平寻址模式,把cs,ds,es,ss的基地址设为0,界限为4G,因此这几个段中逻辑地址的段偏移就是线性地址

分段肯定有用,比如代码段的特权级



如果是DLL的话那么CS,DS,ES,SS也都是基址是0界限是4G吗?我看到说32位汇编直接寻址的时候才需要重定位,32位汇编里的直接寻址指的是相对于段的偏移还是线性地址?我用OD反汇编也看了,好像都是相对于段的偏移,跳转和CALL也是相对于CS的偏移吧?为什么间接寻址就不需要重定位?16位汇编涉及到段寄存器操作的时候才需要重定位,指的是只有给段寄存器赋值等的时候才需要?根据当前载入的内存区域重定位段基址?
  如果说3位汇编里DLL的段基址也都是0,直接寻址和间接寻址最后得到的都是偏移地址的话,那么不是所有的寻址都需要重定位?如果DLL的基址随载入的内存区域改变的话那么为什么直接寻址还需要重定位呢?

#7


32位的pe重定位和段无关,段寄存器和dll,exe无关
windows就几个段描述符,cs(内核),cs(用户),ss(内核),ss\ds\es(用户),fs(内核),fs(用户)
我的计算机中:
线程在内核模式就用cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000
用户模式就用cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000
不管哪个进程,哪个模块都一样

#8


学习了。。。

#1


pe的section和汇编里的segment没什么关系,masm中用segment指示符来定义section,我觉得是遗留问题
16位exe中一般都为每个段寄存器分配了一块空间,所以exe中的一块内存和一个段对应

但32位中就没有这个关系了

#2


正因为是虚拟线性地址,才需要用段选择子等,映射成独立的物理地址上去。

#3


引用 2 楼 g_spider 的回复:
正因为是虚拟线性地址,才需要用段选择子等,映射成独立的物理地址上去。

我看了罗云彬的32位汇编,里面有图,是只要是用到段选择子的时候都会通过地址转换转换成虚拟线性地址,指令使用的都是虚拟线性地址,如果开启分页管理,那么就是映射后找到物理地址,如果没开启就直接是物理地址。指令中用的都是32位虚拟线性地址,寄存器也是32位的,根本涉及不到段选择器。那么这种分段还有什么用呢。

#4


指令用的是段偏移,分段还是会起作用,只不过windows使用扁平寻址模式,把cs,ds,es,ss的基地址设为0,界限为4G,因此这几个段中逻辑地址的段偏移就是线性地址

分段肯定有用,比如代码段的特权级

#5


pe文件中的区段和汇编中的段压根就一点关系没有
32位汇编的段里面的东西跟16位都己经完全不一样了

#6


引用 4 楼 lactoferrin 的回复:
指令用的是段偏移,分段还是会起作用,只不过windows使用扁平寻址模式,把cs,ds,es,ss的基地址设为0,界限为4G,因此这几个段中逻辑地址的段偏移就是线性地址

分段肯定有用,比如代码段的特权级



如果是DLL的话那么CS,DS,ES,SS也都是基址是0界限是4G吗?我看到说32位汇编直接寻址的时候才需要重定位,32位汇编里的直接寻址指的是相对于段的偏移还是线性地址?我用OD反汇编也看了,好像都是相对于段的偏移,跳转和CALL也是相对于CS的偏移吧?为什么间接寻址就不需要重定位?16位汇编涉及到段寄存器操作的时候才需要重定位,指的是只有给段寄存器赋值等的时候才需要?根据当前载入的内存区域重定位段基址?
  如果说3位汇编里DLL的段基址也都是0,直接寻址和间接寻址最后得到的都是偏移地址的话,那么不是所有的寻址都需要重定位?如果DLL的基址随载入的内存区域改变的话那么为什么直接寻址还需要重定位呢?

#7


32位的pe重定位和段无关,段寄存器和dll,exe无关
windows就几个段描述符,cs(内核),cs(用户),ss(内核),ss\ds\es(用户),fs(内核),fs(用户)
我的计算机中:
线程在内核模式就用cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000
用户模式就用cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000
不管哪个进程,哪个模块都一样

#8


学习了。。。