Windows可执行文件的“数据目录”条目和“节头”条目之间有什么区别?

时间:2019-01-01 09:42:53

标签: windows executable portable-executable

我有一个Windows可执行文件.exe。我浏览了该文件,发现其中的Data Directory.Thread Local Storage的目录条目。该条目说明了这一点:

RVA (Relative Virtual Address) of the data: 10000
Size of the data: 24

我在可执行文件中找到了节表,它包含名为.tls(线程本地存储)的节头。该标头指定了以下内容:

Pointer to the raw data: A400
Size of the raw data: 512

可执行文件的这两部分有什么区别?他们俩似乎都在谈论线程本地存储,但是它们指向不同的地方并指定不同的大小。

那只是一个例子。这是另一个示例:在Data Directory中是Import Directory,在Section Table中是名为Section Header的{​​{1}}(导入数据)。它们包含看似冲突的值。

还有其他示例。

.idata中的条目与Data Directory中的entries之间的区别是什么?

1 个答案:

答案 0 :(得分:0)

exes通常会以ram的形式加载到地址0c00400000,甚至更多

rva adressas是一个偏移量(例如,可能在ram中代码开头的0x00401000是0x1000的rva)

exe也是从部分构建的,这些部分在加载到ram时通常与4096对齐(位于不同的ram页面中),而在磁盘上的exe文件中,它们通常与512对齐(以节省空间)

例如,ram中的0x00401007 adres,rva中的0x1007和file中的0x207 ... PE格式的某些信息以rvas的形式给出,而某些则以文件的偏移量形式给出...该部分中包含的数据大小也可能是给定为不对齐(例如177)和对齐(例如512),则该大小与之相同,但一个对齐但不对齐。

pe中的确切字段存储的信息需要以pe格式的详细信息进行检查(这是令人困惑的格式,但在学习后显示并不那么令人担忧)