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