面向文件系统的病毒——引导型病毒
大致思路
将病毒放在软盘的引导扇区,并将原来的引导代码放到数据区,在执行完病毒代码后拷贝回原来的引导代码,并将执行权交给引导代码
问题
- 自我覆盖的问题,所以需要我们将病毒中执行拷贝指令的代码移出被覆盖区域
- 如何使别的数据不使用簇2的问题,这里我们可以修改FAT1和FAT2表,将簇2改为不可用,如果改为已占用的FFF,由于没有对应目录项会很可疑,所以改为坏簇FF7
磁盘访问int 13h中断
复位磁盘系统
1 | Xor ah, ah ;ah=0为磁盘复位 |
读指定从磁头,道,扇区起始,n个扇区道内存缓冲
1 | AH = 02h是读扇区功能号 |
设计一个基于0开始的绝对扇区读函数
功能:将绝对扇区号转化为磁头,道,扇区的CHS寻址方式
如何转化?
具体实现:
1 | ReadSector: ;该函数的绝对扇区号是从0开始的 |
执行部分程序设计
例题
- 关于软盘引导型病毒,下列说法不正确的是( )
A. 病毒感染时会将原引导扇区内容拷贝到软盘的数据区
B. 病毒执行时会将原引导扇区内容从软盘的数据区拷贝到内存7C00处
C. 病毒将原引导扇区的内容拷贝到7C00时需要处理自我覆盖的问题
D. 病毒感染时必须覆盖原引导扇区的全部内容才能获得执行
参考答案:D
- 已知软盘上一个扇区的绝对扇区数是X,软盘1道有18个扇区,请问如何获得该扇区的CHS参数?
参考答案:
病毒的执行机制——中断替换
框架
- 认识中断向量表
- 非驻留式的中断向量修改
- 驻留式的中断向量修改
中断向量表
触发中断后,就会去调用中断处理程序
而找到中断处理程序的入口地址就是通过中断向量表
中断向量表在内存00:00处,每4个字节为一个项,这个项的索引就是中断向量号,其中高2个字节为段地址,低2个字节为段内偏移
中断触发指令int xxh
,xx就是中断向量号,4*xx就是中断xx的入口地址在中断向量表中的存放位置
非驻留式中断向量修改
驻留程序:一直在内存中不退出的程序,例如中断处理程序
我们目的是修改中断处理程序下的入口地址(即修改中断向量表)使其执行病毒程序,但是病毒程序也需要驻留在内存才不会使中断向量表无效
在非驻留式中断替换中我们在病毒程序调用后恢复中断向量表
大致思路
重点
病毒和中断向量表不在同一个段,因此段寄存器需要根据实际访问情况变化
跨段跳转的问题:
病毒需要由自己段跳到原中断向量程序所在的段
要跨段跳转,就要采用JMP XX:YY的形式
但是JMP CX:AX的语法是不支持的
即JMP XX:YY的指令不支持两个间接性,XXYY总有一个是立即数,而程序里面Seg和Offset都不是立即数,怎么解决?
我们可以先采用两个立即数来确定JMP指令的形式(比如JMP 00:00),然后我们再来定位到JMP指令的机器码,进行按字节的细粒度修改!
程序设计
驻留式中断向量更改
DOS系统自己就提供了中断调用修改中断向量表,因此这里把hook变成内存驻留
获取中断入口地址的调用
1 | mov al,16h ;al 中断向量号,16h为键盘IO中断号 |
设定中断向量的调用
1 | mov dx, offset ;ds:dx指出了新的中断入口地址 |
病毒代码程序设计
1 | org 0100h |
例题
- 关于DOS中断和中断型病毒,下列说法不正确的是( )
A. DOS中断程序的入口地址存放在中断向量表中
B. 病毒在修改中断向量表时需要考虑不同段地址的问题
C. 10h中断程序的入口段地址存放在 4*10h+2的地方
D. 中断型病毒是通过替换原中断处理程序获得执行机会
参考答案:D
解析:并不是替换了原中断处理程序,而是修改了中断向量表使其先执行的病毒程序再执行中断处理程序