寫一篇關於匯入表的文章。
逆向脫殼,找到入口點之後,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 使...