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