照樣推薦一首我很喜歡的歌,
這首歌上傳在YT的原始影片雖然沒有標題,
但是我記得歌名好像是 Casino。
言歸正傳,
其實本來想跳過這一篇的,
畢竟Parasitic Virus的設計理念比前兩款更為的深奧,
嗯.......那麼各位就姑且看看吧 (?
而我會盡量去說明設計上的技巧,
那至於看不看得懂,就得看諸君的造化了。
如果想了解病毒詳細的執行情況,
可以參考上一篇病毒開發(9)的演示情形。
先簡單介紹一下病毒感染的流程:
1. 病毒被觸發,搜尋目前目錄下所有com檔。
2. 病毒把自己附加在欲感染的com檔後方。
3. 病毒將被感染com檔的前幾bytes(x >= 3)進行備份。
4. 病毒將被備份的原始檔頭寫入檔案後方。
5. 病毒用一個near jump置換原始檔頭。
6. near jump 的位置指向病毒起始的offset。
接著,
再簡單講解一下被感染檔案的運作流程:
1. 被感染的檔案被使用者執行。
2. 遇到被病毒置換掉的檔頭(near jump)。
3. near jump 直接跳到病毒起始處。
4. 病毒啟動。
5. 利用先前備份的檔頭內容,還原檔案的檔頭。
6. 感染開始,進行一系列的搜尋與感染。
7. 感染流程結束,控制權交還給原始檔案。
8. 跳回 offset 100h (com檔起始處) 執行原檔案。
9. 由原始檔案的 dos interrupt 終結被感染的程式。
虛鹿ㄉ筆記:
.......
.......
.......
.......
.......
阿如果你的大腦還沒有死去的話,
非常好 !! 那你大概已經成功了一半的說 (?
接著就只差用組合語言實踐以上的流程就行啦~
是不是發現一切沒有先前所想像中的複雜呢 (?
為了輔助各位閱讀我的原始碼,
因此在這邊講解一些特殊的操作或是設計:
--------------------------------------------
1. 如何處理變數地址偏移:
ANS:
手法如同病毒開發(8)中所述,
利用call找出偏移位置的手法。
--------------------------------------------
2. 如何避免重複感染:
ANS:
被置換的前幾bytes中最低所需要的 3 bytes,
是由 1 位元的near jump機械碼(0E9h),
及2位元的跳躍距離所構成。
然而,如果單靠確認檔案開頭是否為E9h,
來判斷是否被感染的話,
會有極高的可能會產生巧合,
因此錯失本來該感染的檔案。
(畢竟很多程式喜歡用jmp開頭)
為了能夠避免這種情況發生,
我多置換了2 bytes作為輔助識別的標記,
以達到100%準確的感染狀況判別率。
其中,我所用來標記的2bytes為"RE",
因此被感染的檔案會長這樣,
可以明顯地看到用來標記的字母"RE"。
--------------------------------------------
3. 如何在第一次執行時(無宿主時)正確終止程式:
ANS:
我在病毒本體的程式碼開頭預留了5bytes,
以預留一個緩衝區,(init 標籤處)
讓第一次執行時可以安心的覆寫主程式的檔頭,
(也就是先前所提到的”還原”過程)
而不會影響到整體的運作。
而為了能夠正確終止程式不讓dosbox爆開,
我預設的初始覆寫內容是int 20h(中止程式)。
如此一來,在完成初次的感染後,
使用 mov ax, 100h 、push ax、ret 重新跳到檔頭,
便會遇到被覆寫五個NOP,
也就是int 20h,
故能夠順利終止程式。
--------------------------------------------
以上,基礎病毒開發的系列到此結束。
或許有人不懂為什麼我想教dos病毒開發,
畢竟ms-dos也早就被時代淘汰許久了,
而這種舊時代的東東,
理論上因該沒有太大的價值的。
話雖如此,然而,
我認為了解早期的病毒,
是一個能幫助你未來開發出更進階病毒的良好基礎,
了解歷史的推演與病毒的進化,
了解各種病毒興起與被淘汰的理由,
勢必能夠帶給你一個良好的基礎,
不論是在眼光或是創意上。
總之,這系列大概就到此為止惹,
希望本系列能夠指引到那些立志進入病毒圈發展的新人,
讓他們有個好的開始,並看得更高、更遠。