IAT表是如何實現的

2021-08-13 16:11:28 字數 2131 閱讀 6335

我們知道當程式要呼叫系統dll時,會用到iat表

具體是怎麼實現的呢,

假設我們程式中某處要用到messageboxa,那麼這裡會有兩種形式,一種是先call到乙個位址,這個位址中是乙個jmp [a],a中存放著資料,資料內容就是我們的messagebox的入口位址。另一種情況是直接calll到messageboxa的入口位址即 [a],千萬要注意是a中存放的資料,而不是a本身,a中存放的資料是messagebox的入口位址,之所以叫做表也是這個原因,因為程式要呼叫很多系統dll,如果我們的dll位址發生改變,要對每一處呼叫修改其呼叫位址是很麻煩的,如果有這樣的表,我們將所有的函式呼叫的入口位址集中在乙個集中的位址中,然後通過解析這個表方便我們進行修改,這樣我們只要修改這個表所指的函式入口位址。

好的前面說了兩種方法,思考乙個問題,這個表是怎麼實現的,我們程式設計過程中並沒有建這樣的表啊?

實際上,這個表是windows方便我們所實現的,

在od中選擇call了messagebox的一行,用view 執行檔案的方法檢視,可以看到這裡並不是函式入口位址。那麼是什麼使得載入之後它變成了入口位址呢?

其實這是windows在載入我們程式的時候自動幫我們做好的。

我們看到view執行檔案的方法開啟之後是是乙個dword的數,這個十六進製制數加上基址假設叫做b,我們跳過去看b,看到b中的資料是乙個ascii碼的內容,即字串messagebox,也就是說,windows在執行程式,即在載入前通過內部實現,把我們的字串messagebox換為了messagebox的入口位址,這樣我們在call 【a】的時候就是跳轉到了messagebox的入口位址。

而表中的位址是怎麼填充的呢,在檔案還未載入進記憶體中的時候,這個表中實際上只有很多個指標,指標指向的位址是字串。

再整理一下思路,我們有這樣乙個表,在還未載入進記憶體中之前,他是乙個指標,指標指向乙個資料段,資料段中的內容是函式名稱的字串。當程式載入進記憶體中時,作業系統根據所指資料段中的字串把表中的指標轉換成函式入口位址。

所以接下來就是我們的匯入表的內容了,關於匯入表可以看我的另一篇文章

假設你已經知道了什麼是匯入表,並且資料視窗中找到了匯入表的首位址,根據我那篇部落格可以知道匯入表是由image_import_descriptor(iid)組成的

每個iid有五個dword,我們這裡只關心後面兩個字段,即name和firstthunk,name欄位指向乙個位址,該位址是dll的名稱,firstthunk指向我們的iat的位址。

知道這些之後我們就可以給出作業系統是如何把iat自動填充的了。

1,找到匯入表起始位址

2,找到第乙個iid

3,根據iid的第四個字段確定dll庫名稱

4,根據iid的第五個字段確定iat表位址

5,通過iat字串指標定位到目標函式名稱。

6,用目標函式位址修改iat的字串指標。

7,修改下一處iat

8,iat項為0,修改完畢

9,找到下乙個iid從第3步開始重複上面的操作。

舉個例子,如下,程式中401339處呼叫了messagebox,call到4018dc

舉個

於是我們轉到4018dc,可以看到他jmp到messagebox的目標位址75e5279e

,這個位址存放在iat表中,位址在00405120,

我們在資料視窗中跳轉到405120,可以看到,的確是75e5279e

接下來在該位址看檔案未載入時候存放的是什麼資料,

我們跳轉到存放字串的位址405226,

可以看到的確是messagebox的名稱,如果我們希望系統幫我們替換不同的函式,則只要把這裡的messagebox改為其他名字就行。

今天的任務是解析如何實現順序表

資料結構的理論基礎和演算法思想是已經學習過了的。然後在自己實現之前先讀一遍別人寫出的順序表 順帶讀c 我來寫注釋。include include檔案的目的就是把多個編譯單元 也就是c或者cpp檔案 公用的內容,單獨放在乙個檔案裡減少整體 尺寸 或者提供跨工程公共 提供i o 和的區別就是乙個是c 乙...

搖桿是如何實現的

大家在玩手機網遊的時候都注意過移動人物的前後左右鍵,那麼它是如何實現的呢?今天博主就為大家揭開這個迷惑 首先我們要建立兩個父子關係的image,通過source image分別將他們模型放進去 接下來我們通過指令碼來控制搖桿 首先我們要引入乙個命名空間 using unityengine.event...

AOP是如何實現的?

spring中的aop 還是離不開spring的ioc容器,的生成,管理及其依賴關係都是由ioc容器負責 spring預設使用jdk動態 在需要 類而不是 介面的時候,spring會自動切換為使用cglib 不過現在的專案都是面向介面程式設計,所以jdk動態 相對來說用的還是多一些。類實現invoc...