日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

Windows PE 第十章 加载配置信息

發(fā)布時間:2025/6/17 windows 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Windows PE 第十章 加载配置信息 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

加載配置信息

? ? 加載配置信息最初最用在Windows?NT操作系統(tǒng)中,作為文件頭部的延伸部分,后來被用作異常處理。加載配置信息表中存放了基于結(jié)構(gòu)化異常處理(SEH)技術(shù)的各項異常句柄。當(dāng)程序運(yùn)行發(fā)生異常后,操作系統(tǒng)會根據(jù)異常處理類別對異常進(jìn)行分發(fā)處理,并依據(jù)這些句柄實施程序流程的轉(zhuǎn)向,保證系統(tǒng)能從異常中全身而退。

10.1?何為加載配置信息

? ? 加載配置信息結(jié)構(gòu)是PE中定義的一種基本數(shù)據(jù)類型,最初僅用于Windows?NT操作系統(tǒng),定義一些供Windows?NT操作系統(tǒng)加載PE時用到的一些附加信息。后來該部分含義發(fā)生了變化。不再定義加載用的配置信息,而是被專門用來定義基于SEH技術(shù)的相關(guān)數(shù)據(jù)。
????如果PE中的該部分表中沒有對應(yīng)的異常類別處理函數(shù)句柄,操作系統(tǒng)將會調(diào)用其內(nèi)核模式的異常分發(fā)函數(shù)終止應(yīng)用程序的運(yùn)行。這種安全設(shè)置主要是為了阻止因異常句柄導(dǎo)致的溢出被惡意程序利用,從而造成對系統(tǒng)的破壞。

通常情況下,連接器會提供一個默認(rèn)的加載配置信息結(jié)構(gòu),該結(jié)構(gòu)包含了預(yù)留的SEH數(shù)據(jù)。如果用戶代碼中提供了該結(jié)構(gòu),則必須由用戶來完成設(shè)置新的預(yù)留SEH字段,否則連接器不會講SEH數(shù)據(jù)加入到加載配置信息中。

10.2??Windows?結(jié)構(gòu)化異常處理

? ? 就是說SEH的原理和調(diào)用,之前寫核心編程筆記的時候整理過:

http://blog.csdn.net/u013761036/article/details/54234212?這里只說當(dāng)時沒有整理的部分。

Windows?異常分類

? ? 由于SEH使用了與硬件平臺如果的數(shù)據(jù)指針,所以在不同的硬件平臺上,SEH的實現(xiàn)方法是不同的。在X86平臺上的SEH處理框架中,把異常分為兩大類:

硬異常(系統(tǒng)異常)和軟異常(程序自己拋出的異常)

1.硬異常,即系統(tǒng)異常,可以細(xì)分為三類:

(1)故障異常:因執(zhí)行指令失敗引起,比如除以0引發(fā)的異常,一起eip指向了不可執(zhí)行的頁面等。這一類異常是系統(tǒng)異常中最常見的。此類異常有一個共同點,那就是發(fā)生異常時自動壓入棧的是失敗指令的地址,而不是它的嚇一跳指令地址,這樣做的原因是:當(dāng)從異常遍歷過程返回時,可以重新執(zhí)行一遍這條指令。

(2)陷阱異常:發(fā)生這類異常通常是因為執(zhí)行了自陷指令,如使用指令”INT?3”而引發(fā)的異常。這一類異常的返回地址是自陷指令的下一條指令所在的地址。

(3)終止異常:硬件或者其他不可恢復(fù)的因素導(dǎo)致的異常等。通常只能重啟。

2.軟異常,所謂軟異常,就是以函數(shù)調(diào)用的手段累模擬一次異常,即通過Windows提供的API函數(shù)RaiseException,執(zhí)行函數(shù)引發(fā)軟異常,實際上,在高級語言的異常處理模型中的大部分拋出異常的操作,最終都是對RaiseException函數(shù)的調(diào)用。

然后就是各種對SEH的使用啥的,之前總結(jié)過就不說了。但是在書上看到了一個概念區(qū)分,就是區(qū)分?中斷和異常,異常可以理解成是程序內(nèi)部的自發(fā)行為,中斷則是外部導(dǎo)致的被動行為,所以我個人對?缺頁中斷的這個詞的理解是,缺頁異常導(dǎo)致的中斷。

10.3?PE中的加載配置信息

? ? 這本書講的是PE結(jié)構(gòu),自然這個才是他要說的重點,分析一個EXE的結(jié)構(gòu):

通過PE數(shù)據(jù)目錄表定位到加載配置信息;然后,分析該部分?jǐn)?shù)據(jù)對應(yīng)的數(shù)據(jù)結(jié)構(gòu);最后,通過一個實例分析,描述了數(shù)據(jù)結(jié)構(gòu)中每個字段與提取的字節(jié)碼之間一一對應(yīng)的關(guān)系。

10.3.1?加載配置信息定位

? ? 加載配置數(shù)據(jù)為數(shù)據(jù)目錄注冊的數(shù)據(jù)類型之一,其描述信息處于數(shù)據(jù)目錄第11個目錄項中。


? ? 為了避免SEH框架緩沖區(qū)溢出執(zhí)行用戶代碼導(dǎo)致安全隱患,自XP系統(tǒng)以后的大部分系統(tǒng)中PE文件,如常見的記事本程序、kernel32.dlluser32.dll等都附加了加載配置信息。通常情況下,操作系統(tǒng)的加載器會根據(jù)數(shù)據(jù)目錄表中定義的大小,來判斷加載配置信息的類別。為了保持對Windows?XP操作系統(tǒng)和以前的操作系統(tǒng)的兼容,通常此處的大小為64字節(jié),即0x40

10.3.2??加載配置信息目錄IMAGE_LOAD_CONFIG_DIRECTORY



看下頭文件里的定義:


10.3.3?加載配置信息實例分析

? ? 書上是直接分析的例子的一個文件,我這里沒有,我就自己隨便找一個文件分析吧,得到的數(shù)據(jù)不一樣,但是思路和結(jié)構(gòu)一樣。

隨便找一個平時的測試項目,注釋了些代碼:


OK先從PE頭開始


得到兩個東西,配置表地址RVA0xF2C8,大小0x40

然后計算FOA:


FOA=0xDCC8

然后直接看二進(jìn)制信息:


? ? 得到這一步的時候我有點困惑,什么情況,大小是40的話定位到上面的黑色區(qū)域應(yīng)該是啊,不過這數(shù)據(jù)也不科學(xué)啊,然后我以為是因為我自己沒寫SEH導(dǎo)致的,然后我就改了下代碼:


同樣的方式進(jìn)行操作發(fā)現(xiàn)得到這個:



還是不對,然后就又看了下這個定義:


18*4=72=0x48??...這也不是0x40啊!,但是


額...先不管這些,繼續(xù)往下走。從這個繼續(xù)走吧:


從最后safehandle地址是0x40F6E0(注意這個是VA)?個數(shù)是7

按照這個:


RVA應(yīng)該是F6E0了,然后計算FOA.


E0E0處找到這7個數(shù)據(jù):

這七個數(shù)據(jù)是RVA,對應(yīng)轉(zhuǎn)換成VA然后在內(nèi)存里直接看這些數(shù)據(jù):


得到的是類似這樣的東西,把這些機(jī)器碼翻譯成匯編然后再翻譯成c的話對應(yīng)的是7個異常處理回調(diào)函數(shù)的代碼,注意和我上面寫的那個__try..沒關(guān)系。

然后我又嘗試注冊了一個SetUnhandledExceptionFilter(ExceptionFilter);??還是不行,難道是那個在__except里劫持異常類型的那個毀掉函數(shù)?這個之后在測試吧。今天沒時間了。

下一章是講動態(tài)加載,下一章不單獨總結(jié)了,沒什么新東西。

唯一設(shè)計到一個新東西就是?硬編碼加載,其實就是直接通過偏移量加載?其他函數(shù),也可以加載內(nèi)部未導(dǎo)出的函數(shù),這個在這里又更充分的總結(jié):http://blog.csdn.net/u013761036/article/details/53933350里面我寫了一個?把DLL私有函數(shù)導(dǎo)出的思路。里面有這方面相關(guān)。So下一章就直接跳過了,下次整理就直接整理PE變形那一章。

總結(jié)

以上是生活随笔為你收集整理的Windows PE 第十章 加载配置信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。