?? 應(yīng)用程序病毒免疫及自修復(fù)的實(shí)現(xiàn).txt
字號:
應(yīng)用程序病毒免疫及自修復(fù)的實(shí)現(xiàn) (2001年3月25日)
網(wǎng)友更新 分類:文件系統(tǒng) 作者:與月共舞 推薦:yygw 閱讀次數(shù):428
(http://www.codesky.net)
--------------------------------------------------------------------------------
應(yīng)用程序病毒免疫及自修復(fù)的實(shí)現(xiàn)
控件 SelfAV V1.1 For Delphi 5.0 說明
有不少專業(yè)軟件都帶有校驗(yàn)保護(hù)功能,在自身被修改后能報(bào)警提示,有的軟件(特別是殺毒軟件)還提供修復(fù)功能。
對一般的軟件開發(fā)者而言,這種技術(shù)的實(shí)現(xiàn)是較為困難的,本人通過對一些帶有這種功能的軟件進(jìn)行分析,實(shí)現(xiàn)了應(yīng)用程序的病毒免疫及自修復(fù),并制作了一個(gè)Delphi控件,希望更多的軟件開發(fā)者能在制作的軟件中加入免疫功能,讓病毒無所遁形。
首先,應(yīng)用程序在運(yùn)行時(shí)應(yīng)該能夠?qū)ψ陨碜餍r?yàn),一般采用和校驗(yàn)或CRC校驗(yàn)等方式。
第一個(gè)問題是:原始校驗(yàn)和應(yīng)該保存在哪?
途徑不外兩種:應(yīng)用程序自身或應(yīng)用程序外部。保存在外部雖然方便,卻是不安全的,我選擇了前者。
隨后而來的問題是:校驗(yàn)和怎樣放入應(yīng)用程序以及應(yīng)用程序怎樣找到它?
附加的問題是:校驗(yàn)和在放入應(yīng)用程序后,文件發(fā)生了變化,怎樣消除這種變化帶來的影響?
我采用了一種取巧的方法,在源碼中定義一個(gè)常量記錄,首先定義十六字節(jié)隨機(jī)數(shù)作數(shù)據(jù)標(biāo)志,再在它們后面定義存放校驗(yàn)和的量,這樣只需要在編譯出的程序中查找數(shù)據(jù)標(biāo)志,標(biāo)志后的內(nèi)容就是校驗(yàn)和存放的地址。
實(shí)際編程中,我定義了一個(gè)位置量、兩個(gè)CRC校驗(yàn)和量,前一個(gè)存放位置量前面數(shù)據(jù)的校驗(yàn)和,后一個(gè)存放這個(gè)數(shù)據(jù)記錄后面的校驗(yàn)和。這樣,在應(yīng)用程序中只要直接引用常量記錄中的數(shù)據(jù)位置值和校驗(yàn)和,分兩次對自身作CRC校驗(yàn)就可以檢測自身的任何變化。
當(dāng)然,在每次編譯之后,都必須用專門的軟件向應(yīng)用程序中寫入數(shù)據(jù)位置、校驗(yàn)和等信息。事實(shí)上,在我寫的第一版控件中,正是這樣作的。不過,為了制作一個(gè)傻瓜式的控件,在第二版中我用了一個(gè)新的方法,后面會說到。
在解決了文件校驗(yàn)的問題后,再考慮自修復(fù)功能。
一開始我總想找一種可以直接修改的方法,這當(dāng)然是不可能的。有朋友提議用批處理,但批處理存在的問題是運(yùn)行時(shí)有個(gè)Dos窗口很討厭,而且如果批處理運(yùn)行的時(shí)候應(yīng)用程序還沒完全退出,是無法進(jìn)行恢復(fù)的。
于是,我寫了一個(gè)小程序AVRestore.exe,專用來進(jìn)行恢復(fù)。這個(gè)程序是用Delphi寫的,只有20K(Delphi也能寫出這么小的程序??事實(shí)就是如此)。我把這個(gè)程序放入資源文件,當(dāng)應(yīng)用程序在發(fā)現(xiàn)自身被修改后,自動(dòng)把它保存到臨時(shí)目錄中,并傳遞備份文件名和可執(zhí)行文件名給它,然后運(yùn)行AVRestore,退出系統(tǒng),由它進(jìn)行修復(fù)工作,修復(fù)完成后再重新啟動(dòng)應(yīng)用程序。
前面提到校驗(yàn)和自動(dòng)寫入的問題,我也是這樣作的:寫一個(gè)小程序AVWriter.exe,用來向應(yīng)用程序?qū)懭胄r?yàn)和,并放入資源文件。應(yīng)用程序第一次運(yùn)行時(shí),內(nèi)部校驗(yàn)和是0,于是自動(dòng)將AVWriter.exe從資源中寫到臨時(shí)目錄,并執(zhí)行它,退出系統(tǒng),處理完成后再重新啟動(dòng)應(yīng)用程序。
SelfAV V1.1控件的工作流程如下:
(1)、控件初始后,檢查臨時(shí)目錄中是否有AVRestore.exe和AVWriter.exe,如有則刪除。
(2)、如果數(shù)據(jù)位置和校驗(yàn)和為0,表示程序剛編譯,于是將AVWriter.exe從資源中寫到臨時(shí)目錄,用應(yīng)用程序名作參數(shù)運(yùn)行AVWriter,并退出當(dāng)前程序。 AVWriter運(yùn)行后,先以只讀方式打開程序文件,找到隨機(jī)數(shù)據(jù)標(biāo)志后,將文件分前、后兩部分作CRC校驗(yàn),得出兩個(gè)校驗(yàn)和。再以寫方式打開文件,將數(shù)據(jù)寫入應(yīng)用程序(考慮到時(shí)差問題,在打開文件時(shí),設(shè)置了一個(gè)檢查、等待時(shí)間)。最后重新啟動(dòng)應(yīng)用程序。
(3)、如果數(shù)據(jù)位置和校驗(yàn)和不為0,則打開應(yīng)用程序自身,用數(shù)據(jù)位置值將文件分前、后兩部分作CRC校驗(yàn)并與原始值比較。
(4)、若校驗(yàn)通過,證明文件未被修改。接著在當(dāng)前目錄中查找備份文件,如果沒有則產(chǎn)生一備份文件(隱藏文件),并在備份文件頭中寫入整個(gè)文件的CRC校驗(yàn)和,然后退出檢測。
(5)、若校驗(yàn)失敗,則檢查是否有備份文件及備份文件是否完好。如果設(shè)置了AutoRepair,彈出一個(gè)對話框,告訴用戶文件被非法修改。
A、如果備份文件完好且用戶要求修復(fù),則將AVRestore.exe從資源中寫到臨時(shí)目錄,用應(yīng)用程序名和備份文件名作參數(shù)運(yùn)行它,再退出應(yīng)用程序。AVRestore運(yùn)行后,先檢查備份文件是否完好(最嚴(yán)格的保障),再刪除應(yīng)用程序,從備份文件中進(jìn)行恢復(fù)。恢復(fù)成功,重新啟動(dòng)應(yīng)用程序。
B、如果備份文件不存在或校驗(yàn)失敗,觸發(fā)OnCRCError事件,并將CanRepair置False,由程序開發(fā)人員處理(不處理也可)。
(6)、如果程序開發(fā)人員不想使用控件自帶的修復(fù)功能,把AutoRepair置False,控件將直接觸發(fā)OnCRCError事件,由開發(fā)人員自行處理(控件有一個(gè)Repair方法可進(jìn)行修復(fù))。
對一般用戶來說,你并不需要了解上面的東西,SelfAV V1.1是一個(gè)完全智能化的控件,你要做的僅僅是下載一個(gè)控件,安裝后把它往主窗體上一放就行了(當(dāng)然,你還需要把它的Enabled屬性設(shè)為True它才能起作用),其它的就交給它自己處理好了。
如果你打算在免費(fèi)軟件中使用該控件,這一切(包括源碼)都可以向控件的作者索取,感興趣的朋友請與我聯(lián)系:yygw@yeah.net。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -