從序號查找入口地址
(1)定位到PE文件頭。
(2)從PE文件頭中的IMAGE_OPTIONAL_HEADER32結構中取出數據目錄表,並從第一個數據目錄中得到導出表的地址。
(3)從導出表的nBase字段得到起始序號。
(4)將需要查找的導出序號減去起始序號,就得到了函數在入口地址表中的索引。
(5)檢測索引值是否大於導出表的NumberOfFunctions字段的值,如果大於後者的話,說明輸入的序號是無效的。
(6)用這個索引值在AddressOfFunctions字段指向的導出函數入口地址表中取出相應的項目,這就是函數的入口地址RVA值,當函數被裝入內存的時候,這個RVA值加上模塊實際裝入的基址,就得到了函數真正的入口地址。
從函數名稱查找入口地址
(1)最初的步驟是一樣的,那就是首先得到導出表的地址。
(2)從導出表的NumberOfNames字段得到已命名函數的總數,並以這個數字作爲循環的次數來構造一個循環。
(3)從AddressOfNames字段指向的函數名稱地址表的第一項開始,在循環中將每一項定義的函數名與要查找的函數名相比較,如果沒有任何一個函數名是符合的,表示文件中沒有指定名稱的函數。
(4)如果某一項定義的函數名與要查找的函數名符合,那麼記下這個函數名在字符串地址表中的索引值,然後在AddressOfNameOrdinals 指向的數組中以同樣的索引值取出數組項的值,暫且假定這個值爲x。
(5)最後,以x值作爲索引值,在AddressOfFunctions 字段指向的函數入口地址表中獲取的RVA就是函數的入口地址。