" />

欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

批處理 API實(shí)現(xiàn)文件下載的代碼

 更新時(shí)間:2008年08月29日 19:29:52   投稿:mdxy-dxy  
這篇文檔講述的并不是什么新鮮的技術(shù),我只是起到將他們混和起來(lái)實(shí)現(xiàn)了自己需要的功能的作用,如果你對(duì)批處理和PE格式相當(dāng)了解,那我的這篇文檔就權(quán)且當(dāng)作瀏覽溫習(xí)吧...^_^... 

根據(jù)這些,我們可以知道,這個(gè)API是在URLMON.DLL文件中的一個(gè)導(dǎo)出函數(shù),簡(jiǎn)單的實(shí)現(xiàn)了把一個(gè)文件從WEB服務(wù)器下載本機(jī)的功能,其實(shí)用這個(gè)函數(shù)還不錯(cuò)的,至少它幫我們處理了斷點(diǎn)續(xù)傳,緩存等等的功能,比起直接使用SOCKET函數(shù)來(lái)實(shí)現(xiàn)或者用WININET里的函數(shù)來(lái)實(shí)現(xiàn)簡(jiǎn)單多得多了.

URLDownloadToFile有五個(gè)參數(shù):

第一個(gè)參數(shù)是僅當(dāng)調(diào)用者是一個(gè)ActiveX對(duì)象才使用,一般為NULL.

第二個(gè)參數(shù)就是要下載文件的目標(biāo)URL,完整路徑.

第三個(gè)是本地保存路徑,也是完整路徑

第四個(gè)是保留,必須為0

第五個(gè)是指向一個(gè)IBindStatusCallback接口的指針,這就類(lèi)似一種回調(diào)機(jī)制,你可以參考這些來(lái)活動(dòng)當(dāng)前下載進(jìn)度,選擇是否繼續(xù)下載等等.

這里面我們只關(guān)心第二和第三個(gè)參數(shù).其他的通通設(shè)置成0.(當(dāng)然你寫(xiě)C的時(shí)候最好設(shè)置為NULL)

嗯,敲了點(diǎn)鍵盤(pán)介紹了這個(gè)函數(shù),是因?yàn)檎奈臋n都和這個(gè)函數(shù)息息相關(guān),有了這個(gè)函數(shù),就可以呼叫RUNDLL32來(lái)調(diào)用它,但是很可惜,這個(gè)美好的計(jì)劃馬上也破裂了...

我去微軟看了他們的164787號(hào)文檔http://support.microsoft.com/default.aspx?...kb;en-us;164787),該文檔闡述了RUNDLL32的調(diào)用方式和能被他調(diào)用的函數(shù)的格式:

它們是這么說(shuō)的:


引用

Rundll and Rundll32 programs do not allow you to call any exported function from any DLL. For example, you can not use these utility programs to call the Win32 API (Application Programming Interface) calls exported from the system DLLs. The programs only allow you to call functions from a DLL that are explicitly written to be called by them.



這個(gè)是規(guī)定的格式:


代碼

void CALLBACK
EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);



很不幸,我們的URLDownloadToFile小兄弟并沒(méi)有符合這些條件,被RUNDLL32無(wú)情的拋棄了(汗一滴..)...但是我們并沒(méi)有因此而嫌棄它(汗一滴AGAIN..),畢竟,在后來(lái)實(shí)現(xiàn)的過(guò)程里,它是為我們的工作省下了不少功夫.

到此,用RUNDLL32運(yùn)行計(jì)劃流產(chǎn)....(寒...)

想了一根煙功夫,現(xiàn)在URLDownloadToFile有了,怎么才能調(diào)用這個(gè)函數(shù)呢?總不能模仿匯編PUSH 5個(gè)參數(shù)進(jìn)棧,然后CALL吧,那這個(gè)函數(shù)的地址還要用LoadLibrary()和GetProcAddress()計(jì)算得來(lái),那這兩個(gè)函數(shù)的地址.....還是放棄...等等,如果用一個(gè)EXE來(lái)實(shí)現(xiàn)的話(huà)就簡(jiǎn)單很多了(至少EXE是不需要任何解釋器的),對(duì),寫(xiě)一個(gè)EXE來(lái)下載文件.可我們的目的是用BAT來(lái)下載呢,BAT文件能包裹EXE的數(shù)據(jù)嗎?答案是肯定的...往下看..

記得以前看過(guò)一篇文檔<<Do All in Cmd Shell>>里面介紹過(guò)一種方法.先賣(mài)個(gè)關(guān)子.大家都知道,如果用ECHO加上重定向符來(lái)寫(xiě)文件的話(huà),只能寫(xiě)入ASCII的一部分,也就可以顯示出來(lái)的那些ASCII(也就是ASCII值小于128的那些),對(duì)于那些無(wú)法顯示的字符就沒(méi)有辦法了.但是這讓我們想起一個(gè)工具,一個(gè)微軟歷史上同樣古老的,批處理的兄弟--DEBUG!

現(xiàn)在思路清晰了:可以讓批處理把ECHO不能顯示的字符轉(zhuǎn)化為16進(jìn)制數(shù)據(jù)(比如EXE中的那些數(shù)據(jù))保存在批處理中,然后用DEBUG寫(xiě)道文件里,最后用BAT調(diào)用生成的EXE,下載文件!(想完了這里,我感覺(jué)還是太麻煩,不知道哪位牛人對(duì)這個(gè)實(shí)現(xiàn)還有什么更加簡(jiǎn)單的辦法嗎??)


四.解決-實(shí)戰(zhàn)

倘若就此編寫(xiě)一個(gè)可下載文件的EXE,然后直接用BAT包裹,定然會(huì)被同行恥笑,不單是因?yàn)槟菐浊€(gè)字節(jié)的數(shù)據(jù)拖著大大臃腫的BAT文件,更加讓為這種簡(jiǎn)單的想法立刻現(xiàn)形,為了不達(dá)到這些負(fù)面效果,也為了讓這篇文檔不至于干癟癟的讓人感覺(jué)沒(méi)什么看頭(事實(shí)上是因?yàn)樵缧r(shí)候看過(guò)watercloud的一篇大作感悟頗深),我決定手工寫(xiě)一串16進(jìn)制代碼來(lái)代替機(jī)器編譯的EXE.既美觀了界面,又增強(qiáng)了技術(shù)性.....(一_一...簡(jiǎn)直是在賣(mài)作...)

現(xiàn)在當(dāng)務(wù)之急是要一個(gè)可以下載文件的EXE程序,實(shí)現(xiàn)這個(gè)目標(biāo)只要一個(gè)URLDownloadToFile即可,放在最后實(shí)現(xiàn),先來(lái)寫(xiě)一個(gè)PE框架:大家都知道PE文件的格式吧,不懂的就去看看那個(gè)著名的電信黑客羅某某的書(shū).(Who!?...~)

先給出我們的PE框架,基于XP的FileAlignment對(duì)齊大小最小就支持到0x200(也就是10進(jìn)制的512字節(jié),以下有在前面加上0x的都表示16進(jìn)制數(shù)值),我們的框架就打出512字節(jié)(注意,我下面留有空白表示各個(gè)PE部分,結(jié)合下面的文檔,大家方便理解),這個(gè)框架里沒(méi)有任何的代碼或者數(shù)據(jù):

(ZV友情提示:下面是最枯燥的部分,各位手握錐子,要有一不怕苦,二不怕痛的精神看完它....)
(如果定力不高的朋友,或者堆PE文件再熟悉不過(guò)的朋友,可以字節(jié)轉(zhuǎn)到"JMP S1"處往下看.)
(如果只想知道到底怎么回事,或者對(duì)這篇作文報(bào)瀏覽態(tài)度的朋友,可以直接轉(zhuǎn)到"JMP S2"處繼續(xù)瀏覽)
(睡著了的繼續(xù)睡覺(jué)....)

相關(guān)文章

最新評(píng)論