關於匯入表

2021-08-13 14:10:36 字數 1958 閱讀 7306

寫一篇關於匯入表的文章。

逆向脫殼,找到入口點之後,dump。一般都會遇到要修復匯入表的問題,因而了解匯入表就有必要。

import address table 由於匯入函式就是被程式呼叫但其執行**又不在程式中的函式,這些函式的**位於乙個或者多個dll 中.當pe 檔案被裝入記憶體的時候,windows 裝載器才將dll 裝入,並將呼叫匯入函式的指令和函式實際所處的位址聯絡起來(動態連線),這操作就需要匯入表完成.其中匯入位址表就指示函式實際位址。

換言之,就是windows給我們呼叫其dll的乙個實現方法。

對於每乙個引入的可執行檔案,就比如dll,有乙個匯入表,在winnt.h中可以檢視到它的形式為

typedef struct _image_import_descriptor ;

dword   timedatestamp;             

dword   forwarderchain;             

dword   name;                         

dword   firstthunk;                   

} image_import_descriptor;

typedef image_import_descriptor unaligned *pimage_import_descriptor;

可以看到結構體中有五個dword,其中我們重點看的是union中的乙個dword,還有firstthunk,從名字來看originalfirstthunk和firstthunk應該有某種聯絡。

實際上他們兩個都是指標,其中存放的是兩個rva位址。

通過字段找到匯入表,第一眼看到的就是結構體了,originalfirstthunk應該就是第乙個資料,可是我們知道在c語言中引用結構體的方法是(p).x        之所以強調這一步是因為,結構體並非是按位址直接存放,這個.操作符就是帶我們走向x的實際位址,所以我們的originalfirstthunk應該是第乙個dword所指的位址,這個位址怎麼求呢,實際上很簡單,因為不可能把p和x放的太遠,你甚至可以直接往下翻找,但我們說更正確的辦法那就是dword所指的虛擬位址轉成實體地址,我們可以用dword中存放的虛擬位址減去這個section的虛擬位址,得到的偏移量再加上dword的實體地址(因為originalfirstthunk就是第乙個,所以dword的實體地址就是section的實體地址)。好的,假設我們現在已經到達originalfirstthunk的實際空間,前面說過他是乙個指標,所以應該存放著乙個rva位址,關於這個rva位址的實體地址轉換方法同上,往下走,我們跟著這個指標到了其所指的位址,其中的資料是乙個雙位元組的hint和函式名字,然後是下乙個雙位元組hint和函式名字……

除了通過originalfirstthunk可以找到,也可以用name找到,方法就簡單很多了,直接通過結構體中name所佔dword作為指標,就可以跳到函式所在位址。

再說firstthunk,他實際上是乙個指向陣列的指標,這個陣列的型別名字有點長,叫做image_thunk_data,實際上originalfirstthunk也是指向這個陣列,具體來看看image_thunk_data長什麼樣子

typedef struct _image_thunk_data32  u1;

} image_thunk_data32;

typedef image_thunk_data32 * pimage_thunk_data32;

看起來是乙個四選一的東東,每個這種東東都能拿來指向函式,其中第四個是乙個結構體

typedef struct _image_import_by_name image_import_by_name, *pimage_import_by_name;

看到這裡我們就能明白,我們從originalfirstthunk中走過去的那些hint和函式名字是為什麼了吧。

沒錯就是_image_import_by_name ,其他三個東東我們這裡不細講,因為一般看到的就是這種形式(第三個ordinal也有使用)

匯入表注入

程式開始執行時,引導程式根據匯入表的dll名字載入dll。首先在執行目錄下查詢dll,如果找到,則把他載入程序式空間。如果沒找到則在系統目錄下繼續尋找。可以通過這乙個特點,在原有的匯入表後面增加乙個匯入表結構 int和iat表至少有乙個函式的名字 這就是匯入表注入。自定義的要寫入的結構 typede...

關於如何匯入GPUImage

今天是晚上開始的,預期的計畫就是能夠把gpuimage成功匯入,然後使用一些其中的東西就可以了哈。果然最後也只是匯入了gpuimage,其中出現了一些小意外。這個是我今天晚上看的主要的資料了,應該是專案的原作者發布在github上的最初始的版本,裡面也有很多的介紹哈。其中匯入的介紹大概是這樣的 匯入...

關於oracle 匯入匯出

根據需求,將一資料庫匯出 用exp 命令匯出。資料量比較大 dmp都50g左右 資料量達到 千萬行。匯出來就後悔了,早知道就用資料幫浦了。匯出命令 exp username passwd orcl file test owner test 之後搭建新的資料庫環境.注意 新搭建的環境例項名 sid 使...