調(diào)用未知dll中的導(dǎo)出函數(shù)

調(diào)用未知dll中的導(dǎo)出函數(shù)

ID:12006296

大?。?0.00 KB

頁(yè)數(shù):7頁(yè)

時(shí)間:2018-07-15

調(diào)用未知dll中的導(dǎo)出函數(shù)_第1頁(yè)
調(diào)用未知dll中的導(dǎo)出函數(shù)_第2頁(yè)
調(diào)用未知dll中的導(dǎo)出函數(shù)_第3頁(yè)
調(diào)用未知dll中的導(dǎo)出函數(shù)_第4頁(yè)
調(diào)用未知dll中的導(dǎo)出函數(shù)_第5頁(yè)
資源描述:

《調(diào)用未知dll中的導(dǎo)出函數(shù)》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。

1、不知道諸位看官是否有過(guò)這樣的經(jīng)歷:在不經(jīng)意之間發(fā)現(xiàn)一個(gè)DLL文件,它里邊有不少有趣的導(dǎo)出函數(shù)——但是由于你不知道如何調(diào)用這些函數(shù),所以只能大發(fā)感慨而又無(wú)能為力焉。固然有些知名的DLL可以直接通過(guò)搜索引擎來(lái)找到它的使用方式(比如本文中的例子ipsearcher.dll),不過(guò)我們誠(chéng)然不能希望自己總能交到這樣的好運(yùn)。所以在本文中,李馬希望通過(guò)自己文理不甚通達(dá)的講解能夠給大家以授人以漁的效果。不知道諸位看官是否有過(guò)這樣的經(jīng)歷:在不經(jīng)意之間發(fā)現(xiàn)一個(gè)DLL文件,它里邊有不少有趣的導(dǎo)出函數(shù)——但是由于你不知道如何調(diào)用這些函數(shù),所以只能

2、大發(fā)感慨而又無(wú)能為力焉。固然有些知名的DLL可以直接通過(guò)搜索引擎來(lái)找到它的使用方式(比如本文中的例子ipsearcher.dll),不過(guò)我們誠(chéng)然不能希望自己總能交到這樣的好運(yùn)。所以在本文中,李馬希望通過(guò)自己文理不甚通達(dá)的講解能夠給大家以授人以漁的效果。先決條件閱讀本文,你需要具備以下先決條件:·初步了解匯編語(yǔ)言,雖然你并不一定需要去讀懂DLL中導(dǎo)出函數(shù)的匯編代碼,但是你至少應(yīng)該了解諸如push、mov這些常用的匯編指令?!ひ粋€(gè)能夠查看DLL中導(dǎo)出函數(shù)的工具,VisualStudio中自帶的DependencyWalker就

3、足夠勝任了,當(dāng)然你也可以選擇eXeScope?!ひ粋€(gè)調(diào)試器。理論上講VC也可以完成調(diào)試的工作,但它畢竟是更加針對(duì)于源代碼一級(jí)調(diào)試的工具,所以你最好選擇一個(gè)專(zhuān)用的匯編調(diào)試器。在本文中我用的是OllyDbg——我不會(huì)介紹有關(guān)這個(gè)調(diào)試工具的任何東西,而只是簡(jiǎn)要介紹我的調(diào)試過(guò)程。準(zhǔn)備好了嗎?那么我們做一個(gè)熱身運(yùn)動(dòng)吧先。熱身——函數(shù)調(diào)用約定這里要詳細(xì)介紹的是有關(guān)函數(shù)調(diào)用約定的內(nèi)容,如果你已經(jīng)了解了這方面的內(nèi)容,可以跳過(guò)本節(jié)。你可能在學(xué)習(xí)Windows程序設(shè)計(jì)的時(shí)候早已接觸過(guò)“函數(shù)調(diào)用約定”這個(gè)詞匯了,那個(gè)時(shí)候你所了解的內(nèi)容可能是一個(gè)

4、籠統(tǒng)的概念,內(nèi)容大抵是說(shuō)函數(shù)調(diào)用約定就是指的函數(shù)參數(shù)進(jìn)棧順序以及堆棧修正方式。譬如cdecl調(diào)用約定是函數(shù)參數(shù)自右而左進(jìn)棧,由調(diào)用者修復(fù)堆棧;stdcall調(diào)用約定亦是函數(shù)參數(shù)自右而左進(jìn)棧,但是由被調(diào)用者修復(fù)堆?!薏?,這太晦澀了——在源代碼上我們是無(wú)法看到這些東西的!那么我們別無(wú)選擇,只有深入到匯編一層了。考慮以下C++代碼:#include?int?__cdecl?max1(?int?a,?int?b?){????return?a?>?b???a?:?b;}int?__stdcall?max2(?i

5、nt?a,?int?b?){????return?a?>?b???a?:?b;}int?main(){????printf(?"max(?1,?2?)?of?cdecl?version:?%d",?max1(?1,?2?)?);????printf(?"max(?1,?2?)?of?stdcall?version:?%d",?max2(?1,?2?)?);????return?0;}對(duì)應(yīng)的匯編代碼為:;int__cdeclmax1(inta,intb)00401000MOVEAX,DWORDPTRSS:[ESP+4

6、]00401004MOVECX,DWORDPTRSS:[ESP+8]00401008CMPEAX,ECX0040100AJGSHORTCppTest.0040100E0040100CMOVEAX,ECX0040100ERETN;int__stdcallmax2(inta,intb)00401010MOVEAX,DWORDPTRSS:[ESP+4]00401014MOVECX,DWORDPTRSS:[ESP+8]00401018CMPEAX,ECX0040101AJGSHORTCppTest.0040101E0040101C

7、MOVEAX,ECX0040101ERETN8;被調(diào)用者的堆棧修正;max1(1,2)00401030PUSH200401032PUSH100401034CALLCppTest.0040100000401039ADDESP,8;調(diào)用者的堆棧修正;max2(1,2)0040104APUSH20040104CPUSH10040104ECALLCppTest.00401010好了,我來(lái)簡(jiǎn)要介紹一下。函數(shù)參數(shù)傳入函數(shù)體是借由堆棧段完成的,也就是將各個(gè)參數(shù)依某種次序推入SS中——在cdecl與stdcall約定中,這個(gè)次序都是自右而

8、左的。另外,由于將參數(shù)推入了堆棧致使堆棧指針ESP發(fā)生了變化,所以要在函數(shù)結(jié)束的時(shí)候重新修正ESP。從上邊的匯編代碼中你也可以很清楚地看到,cdecl約定是在調(diào)用max1之后修正的ESP,而stdcall約定則是在max2返回時(shí)借由RETN8完成了這個(gè)修正工作。另外,從上邊的匯編代碼中還可以看到,函數(shù)的

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫(huà)的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶(hù)上傳,版權(quán)歸屬用戶(hù),天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶(hù)請(qǐng)聯(lián)系客服處理。