Windows PE导出表编程2(重组导出表函数地址)
? ? 本次要做的嘗試是通過修改導出表的函數地址,實現程序功能的更改,實現這個最大的限制就是堆棧平衡問題。
先寫一個DLL和EXE為了測試。
DLL代碼如下:
這樣的話有兩個導出函數(我們假設是一個密碼驗證之后執行的函數):
EXE測試代碼如下:
也就是簡單模擬下DLL調用,默認情況下因為密碼錯誤,所以執行結果是這樣:
然后開始一步一步分析處理問題:
1.確定需要替換函數堆棧平衡
首先IDA看下兩個導出函數的調用堆棧,也就是看下參數是否一樣,不然直接調換位置會導致函數調用之后堆棧不平衡:
可以確定,這兩個函數的調用堆棧相同,可以直接替換。
2.從PE頭開始,一步一步找到導出函數地址數組(AddressOfFunctions)
可以知道導出表的地址和大小,這個地址是RVA,根據這個RVA可以計算出來FOA。RVA-FOA之間的轉換我寫過總結,還寫了個工具當時。需要的可以翻翻我上傳的東西。這里不細說直接計算:
這樣0xCF30的位置應該是存的導出表相關。找到這個位置:
黑色部分是對應的如下這個結構:
紅色框部分就是倒數第三個,導出函數地址RVA,繼續計算FOA
然后找到FOA?0xCF58處的一個DWORD數組,這個存的是導出函數地址,RVA。
最后把這兩個地址進行交換就行了。然后運行測試exe,實現錯誤密碼登錄成功,當然這只是個演示程序,如果是實現功能的話,還可以直接OD加載進來,跑一下,在IF的地方把匯編代碼的比較函數改了就行了。這個在WindowsPE的第一節我就寫過操作流程,這里不細說了。
最后就是我寫完這些分析的時候發現有點SB了,咱們來看下這個:
其實可以直接根據那個提供的地址,得到下面的兩個地址,沒看錯的話,應該是一個是VA,一個是RVA,基址是10000000。稍等我去查下:
woc基址還真是這個。這樣的話直接全局搜索這個地址然后替換就行了啊。額...不過沒事。畢竟是為了學習嗎。無所謂了。為了方便一些不太了解導出表的小伙伴,我最后在傳一個導出表的結構吧。如果看不懂了可以看下這個結構理解下:
?
總結
以上是生活随笔為你收集整理的Windows PE导出表编程2(重组导出表函数地址)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows核心编程 第二十章 DLL
- 下一篇: Windows PE导出表编程3(暴力覆