GetProcAddress的二分查詢

2022-08-29 11:09:11 字數 1802 閱讀 5745

只要稍微熟悉pe結構就能很快寫出來,getprocaddress的原型如下

farproc winapi getprocaddress(hmodule hmodule,lpcstr lpprocname)

hmodule是指模組的基位址,比如用loadlibrary載入dll返回的位址

lpprocname顧名思義就是函式或者變數的名稱,但也可以是函式或者變數在模組中的序號(ordinal)

本文實現的getprocaddress沒有實現序號的功能,僅僅是通過名字字串來得到位址,主要是因為dll版本的不同會導致序號發生改變,因此這裡不提倡使用序號來獲取位址(雖然序號可以不用通過查詢而直接獲得位址)

首先要知道pe的輸出表結構eat,資料結構為image_export_directory(winnt.h中定義)

typedef struct

_image_export_directory image_export_directory, *pimage_export_directory;

getprocaddress中用到的幾個重要的資料成員需要科普一下

numberoffunctions指的是eat中函式或者變數的總個數,如果該值為0,則表示該模組沒有匯出任何的函式或者變數

numberofnames指的是eat中函式或者變數名稱的總個數,這個值總是小於或者numberoffunctions,原因是有些模組並不想把一些重要的函式或者變數匯出來供他人使用,比如微軟就經常這麼幹

addressoffunctions指的是乙個指向函式或者變數位址的rva陣列

addressofnames指的是乙個指向函式名或者變數名的ascii字串rva陣列,該陣列是排好序了的,因此可以通過二分查詢來搜尋加快查詢速度

addressofnameordinals指的是輸出表序數的rva陣列,這是乙個ushort的陣列

搜尋的方法主要是通過名稱字串和addressofnames陣列中的字串進行比較,然後找到相應的偏移,再然後定位addressofnameordinals陣列得到它的序號,最後定位addressoffunctions找到位址

下面給出兩段**,在ring0和ring3層中都可以使用

一種是通過順序查詢getexportgeneral

ulong_ptr getexportgeneral(ulong_ptr imagebase,pchar exportname)}}

__except(exception_execute_handler)

return0;

}

另一種通過二分查詢getexportbinarysearch

ulong_ptr getexportbinarysearch(ulong_ptr imagebase,pchar exportname)

else high=mid-1

; }

if (low<=high &&(nameordinal=addressofnameordinals[mid],nameordinalnumberoffunctions))

return imagebase+addressoffunctions[nameordinal];

}__except(exception_execute_handler)

return0;

}

好了,**都比較的簡單,稍微看一下就能懂,有興趣的話可以用getprocaddress(ring3)或者mmgetsystemroutineaddress(ring0)來驗證一下~~~如果有問題的話歡迎指正!

btw:有**著色的外掛程式麼?客戶端的插入**外掛程式怎麼顯示行號?

GetProcAddress 使用注意事項

使用getprocaddress function 時,有以下幾點需要特別留意 1.第二個引數型別是lpcstr,不是lpctstr 2.用 declspec dllexport 按 c 名稱修飾 extern c 匯出的函式名,對於 stdcall 和 fastcall 呼叫約定是相同的 對 cd...

關於GetProcAddress和名稱修飾

dllexport屬性告訴鏈結器 請將指定的函式標記為匯出並為它生成乙個匯出項。這個匯出項是經過修飾的,對於匯出多個過載的函式來說,匯出修飾後的名稱是十分必要的。但是,這也意味著 你傳入到getprocaddress函式中的函式字串也需要是修飾版本的。從我們之前的幾篇關於呼叫約定的文章中,我們知道,...

container of 的的的原理

另外一篇,同樣精彩,揭開linux核心中container of的神秘面紗 華清遠見嵌入式學院講師。在linux 核心中有乙個大名鼎鼎的巨集container of 這個巨集是用來幹嘛的呢?我們先來看看它在核心中是怎樣定義的。呵呵,乍一看不知道是什麼東東。我們先來分析一下container of p...