我有一个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
之间的区别是什么?
答案 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格式的详细信息进行检查(这是令人困惑的格式,但在学习后显示并不那么令人担忧)