我有一个Windows可执行文件.exe
文件。我在文件里面偷看,发现它里面的Data Directory.
是Thread Local Storage
的目录条目。该条目指定了:
RVA (Relative Virtual Address) of the data: 10000
Size of the data: 24
我在可执行文件中找到了Section Table,它包含一个名为.tls
(Thread Local Storage)的Section Header。该标头指定了这个:
Pointer to the raw data: A400
Size of the raw data: 512
可执行文件的这两部分有什么区别?他们似乎都在谈论线程本地存储,但他们指向不同的地方并指定不同的大小。
这只是一个例子。这是另一个例子:在Data Directory
是Import Directory
,在Section Table
是Section Header
,名为.idata
(进口数据)。它们包含看似矛盾的价值观。
还有其他例子。
Data Directory
中的条目与entries
中的the Section Table
有什么区别?
exes通常以ram加载到0c00400000以及更远
rva adressas是之后的偏移量(如0x00401000,可能是ram中代码的开头是0x1000的rva)
exes也是从部分构建的,当加载到ram时这些部分通常与4096对齐(在不同的ram页面中),当在磁盘上的exe文件中,它们通常对齐到512(以节省空间)
所以例如在RAM中的0x00401007,在rva中将是0x1007,在文件中是0x207 ...... PE格式一些信息作为rvas给出,一些作为文件集...也包含在该部分中的数据大小也可以作为未对齐给出(比如说177)和对齐(如512),这是相同的大小,但一个是对齐的,一个不是..
pe存储信息中的哪些确切字段需要以pe格式详细信息检查哪种格式(这是令人困惑的格式但在学习之后显示不那么疤痕)