導出函數和未導出函數

導出函數:顧名思義,出現在導出表(EAT)裏面的函數,可以給外部調用的函數,驗證是否爲導出函數的方法,熟悉逆向的朋友可以使用LordPE之類的工具查看,當然也可以使用GetProcAddress或者MmGetSystemRoutineAddress之類的函數來獲取地址,如果成功的話就是導出函數。

非導出函數:這種函數是供自己調用使用的,不想提供給別人使用,當然也有方法可以獲取函數地址,可以根據函數的特徵來搜索,這就是傳說中的硬編碼,經典的案例案例如,NtReadVirtualMemory。

公開(文檔化)函數:微軟(可以是其它廠商~)提供的帶有函數原型和文檔的函數,這種函數使用起來最方便,不用去尋找或者逆向函數原型,還帶有參數說明~~。

非公開(非文檔化)函數:沒有函數原型和文檔的函數,微軟經常會把一些參數可能會隨時變化的函數,或者功能有點強大的不河蟹的函數隱藏起來,這些也是不河蟹軟件最喜歡的函數。通常這類函數可以被GetProcAddress或者MmGetSystemRoutineAddress獲取到地址,但是函數原型需要搜索或者逆向。

 

1.公開函數肯定是導出函數,只要你在msdn上能找到函數可定都是能直接調用的導出函數,除非微軟蛋疼了。

2.導出函數可以是非公開函數,比如LdrLoadDll這個函數,能取到地址但是msdn上面沒有說明。



未公開的函數(導出未文檔化)是已經導出了,但是不能直接使用。
使用方法:
1。在驅動層使用MmGetSystemRoutineAddress加函數名去獲取函數的地址
2。在應用層使用Loadlibrary和GetProcessAddress(事先當然要先定義好原型)


未導出函數的使用比較麻煩,一般要先獲取那個函數所在模塊的基地址,然後再通過特徵碼去得到函數地址。或者在某個函數內部進行特徵碼的搜索。這個方法針對不同的函數或是結構不止一種方法,像SSDT SHADOW。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章