Posted on 2009-09-07 22:21
S.l.e!ep.¢% 閱讀(381)
評論(0) 編輯 收藏 引用 所屬分類:
PE
PE格式概貌??
? 以下只是PE格式的大致結構請跟著本教程一步步理解他們吧!??
? +---------------+??
? |?? DOS?? MZ?? header?? |????
? +---------------+??
? |?? DOS?? stub???????????? |??
? +---------------+????
? |?? PE?? header?????????? |??
? +---------------+??
? |?? Section?? table?? |??
? +---------------+????
? |?? Section?? 1?????????? |??
? +---------------+??
? |?? Section?? 2?????????? |??
? +---------------+????
? |?? Section?? ...?????? |??
? +---------------+??
? |?? Section?? n?????????? |??
? +---------------+????
? 1)?? DOS?? MZ?? header??
? 這一模塊有64個字節(我所看到的大都如此),我們所關心的是開始和結尾的四個字節.??
? 開始的四個字節是16?? BIT的標志位?? IMAGE_DOS_HEADER?? 4D?? 5A(ASC2碼就是'MZ')??
? 這就和BMP文件以'BM'為起始一樣僅作標識,了解即可.查看一下剛才打開的文件(以后例子)??
? 在文件最開始就能看見4D?? 5A(MZ)??
? 最后的四個字節是從文件起始到PE?? header模塊的偏移量.例子中是E0?? 00?? 00?? 00(對于??
? 格式我們最關心的不就是偏移量嗎?還不記住?)。??
???
? 2)?? DOS?? STUB??
? 這一模塊沒有什么好說的.實際上是個有效的?? EXE,在不支持?? PE文件格式的操作系統中,??
? 它將簡單顯示一個錯誤提示,類似于字符串?? "This?? program?? requires?? Windows"??
???
? 3)?? PE?? header??
? 這一模塊比較重要.他包含很多重要的信息(如:支持在什么樣的機器上運行,有多少section??
? 是可執行文件還是DLL等.這個模塊的起始地址可由DOS?? MZ?? header模塊的的最后四個字節讀出。??
? 如讀到的是?? E0?? 00?? 00?? 00?? 則此模塊的起始地址是0000000E,這樣PE?? LOADER可根據此地址跳過??
? DOS?? STUB直接定位到此模塊。??
???
? 4)?? section?? table??
? PE格式真正的內容都是以?? section為單位的,section?? table是一個結構數組,該數組中成員的??
? 個數就是該文件的SECTION個數,由PE?? header模塊讀出。每個SECTION對應一個結構其??
? 包含對應節的屬性、文件偏移量、虛擬偏移量等。??
???
? 5)?? 以下就是各個SECTION的內容了??
???
? 了解了大概的模塊讓我們看看PE?? LOADER的裝載順序(以下摘自iczelion的PE教程)??
???
? .當PE文件被執行,PE裝載器檢查?? DOS?? MZ?? header?? 里的?? PE?? header?? 偏移量。??
? 如果找到,則跳轉到?? PE?? header。????
? .PE裝載器檢查?? PE?? header?? 的有效性。如果有效,就跳轉到PE?? header的尾部。????
? .緊跟?? PE?? header?? 的是節表。PE裝載器讀取其中的節信息,并采用文件映射方法將這些節映射到內存,??
? 同時付上節表里指定的節屬性。????
? .PE文件映射入內存后,PE裝載器將處理PE文件中類似?? import?? table(引入表)邏輯部分。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/dennishan/archive/2008/10/09/3043667.aspx