日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
      軟件
      軟件
      文章
      搜索

      首頁編程開發(fā)其它知識 → 探究PE文件中的PE文件格式分析

      探究PE文件中的PE文件格式分析

      相關(guān)軟件相關(guān)文章發(fā)表評論 來源:死亡的飛翔時間:2011/8/2 0:04:53字體大小:A-A+

      作者:死亡的飛翔點擊:64次評論:0次標(biāo)簽: PE

      • 類型:音頻處理大。1M語言:中文 評分:5.1
      • 標(biāo)簽:
      立即下載
       最近由于各種原因想要研究一下PE文件,要徹底研究PE和COFF文件格式當(dāng)然是非研究微軟自己的技術(shù)白皮書——《Microsoft Portable Executable and Common Object File Format Specification》不可了。于是花了一點時間看看,有些心得,和大家分享一下。

        首先本文不是討論PE文件格式本身的,這屬于技術(shù)規(guī)范的范疇,大家要是感興趣可以參看上文中提到的微軟的資料。要是不太喜歡E文的朋友也可以在網(wǎng)上找到很多描述PE格式的文章,在就不再這里贅述了。再說,就算我想講,估計也講不好(受限于本人的語文水平orz)

        我們都很清楚,實際上PE格式文件里面的section這個東西是個很自由的玩意兒,你想把神馬數(shù)據(jù),代碼劃分到哪個section完全是你的自由。我們一般按照數(shù)據(jù)所需的屬性來進行section的劃分,比如我們把代碼放到.text section而把數(shù)據(jù)放到.data section里。但是這種劃分并沒有什么約束限制:首先只要你愿意,你完全可以把代碼放在一個叫做stupid的section里(當(dāng)然這個名字按照PE標(biāo)準(zhǔn)不能超過8個字節(jié));其次同一個section中也不是只能有一種數(shù)據(jù),比如我可以把程序的符號表同常量數(shù)據(jù)一同放在.data里(當(dāng)然現(xiàn)實中他們是分開來的)。

        section的存在并不是為了以數(shù)據(jù)功能為準(zhǔn)則劃分?jǐn)?shù)據(jù),而是以數(shù)據(jù)屬性為標(biāo)準(zhǔn)來歸類數(shù)據(jù)。哪些屬性?就是可讀性、可寫性以及可執(zhí)行性。為什么代碼放在.text里?那是因為代碼是可讀可執(zhí)行但不可寫的;為什么我可以將常量數(shù)據(jù)和程序符號數(shù)據(jù)放在一起?因為他們都是可讀但不可寫亦不可執(zhí)行的;為什么常量數(shù)據(jù)和全局?jǐn)?shù)據(jù)卻不能放到一起?那是因為前者要求不可讀但后者卻要求這個屬性。


      了解了section這個東西,下面我們就來分析一下Win32程序中常見的一些section吧(說常見也只能說微軟的linker生成的程序是這樣了,而其他諸如Borland的連接器可不一定使用下面這些section名字):

      .text - 不多說了,就是保存代碼的節(jié)

      .data - 保存數(shù)據(jù)的節(jié),這個對應(yīng)C語言中以初始化的全局變量數(shù)據(jù)。想想為什么你在源碼里初始化一個全局變量后運行時這個變量的值正是你想要的那個?int a = 12;并不意味著CRT為你執(zhí)行了一個賦值語句,而是a在PE文件中保存的位置已經(jīng)被硬編碼了一個12的值。這樣loader加載程序時,你給的初值被從PE文件讀取到了內(nèi)存中變量a的位置,這樣才使你的變量a有了初值。

      .rdata - 保存常量數(shù)據(jù)的節(jié)。這個可以對應(yīng)C語言中的常數(shù)和常量字符串,同上面一樣的原因,他們的初值被保存到了PE文件的次Section中,而不是在運行時被賦值。

      .bss - (Block Start with Symbol)這個section對應(yīng)C程序中的全局未初始化變量。啥?你說C中未初始化的全局變量實際上全被初始化成了0?這是因為實際上操作系統(tǒng)是這樣干的——你的全局未初始化變量由于沒有初值,所以不需要將值像上面兩個一樣保存到PE文件中(所以.bss節(jié)除了描述信息之外不占據(jù)磁盤空間),但是.bss會描述一段內(nèi)存區(qū)域,loader在加載.bss section時直接開辟這么一塊包括所有未初始化數(shù)據(jù)的內(nèi)存區(qū)域,然后直接將這區(qū)域清零。這就是C中全局未初始化數(shù)據(jù)之所以為零的原因了。

      .idata - 這個是保存程序?qū)氡?Import Table)的節(jié)。

      .rsrc - 這個是保存導(dǎo)處表的(Export Table)的節(jié)。

      .reloc - 這個節(jié)是保存重定位數(shù)據(jù)的

      .rsrc - 這節(jié)是保存程序資源的。想你的程序字符串啊、對話框模板啊、位圖、鼠標(biāo)光標(biāo)什么的都在這里。實際上這個節(jié)儲存.resx文件編譯后的結(jié)果。

      .textbss - 這節(jié)比較好玩,它是和微軟Incremental Linking(增量鏈接)特性相關(guān)的。關(guān)于Incremental的特性,我在這篇文章中有說明。

        相關(guān)評論

        閱讀本文后您有什么感想? 已有人給出評價!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過難過
        • 5 囧
        • 3 圍觀圍觀
        • 2 無聊無聊

        熱門評論

        最新評論

        發(fā)表評論 查看所有評論(0)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)