框架
寄生机制
文件型病毒
头插入、尾插入、逆插入
面向文件系统的病毒
引导性病毒
执行机制
对于com文件,头,尾,逆插入寄生都相当于入口点修改,可以执行
中断替换
debug使用
- -u 反汇编
- -g xxx 运行到xxx中断
- -t 单步
- -r 查看寄存器
- -d 查看内存
- -e 地址 值 修改内存
- -a 地址 添加指令
病毒的寄生机制
头插入
DOS环境下四种基本可执行文件格式
批处理文件 .bat结尾
设备驱动文件 .sys结尾
纯代码文件 .com结尾
没有文件头
缺省从0x100H处开始执行
没有重定位项
所有代码和数据控制在64k以内
EXE文件 .exe结尾
文件以英文字母MZ开头
有一个文件头,指出每个段定义等信息
摆脱了代码大小不得超过64k的限制
大致思路
将病毒代码放到正常代码头部合成新的文件
一些问题
- 病毒代码的ret导致直接退出,删掉ret
- 删掉ret后执行错误,发现是由于将数据区当指令执行了,利用JMP指令跳过数据区
- 正常执行后发现正常代码打印的字符串不对,发现是由于加载偏差,于是在病毒区后面增加代码使其复制正常代码到原来的位置进行覆盖,然后跳转到开始
- 在覆盖字符不多的情况下可以正常执行,换作大程序发现程序直接挂掉,发现是由于覆盖的代码将进行覆盖的指令都给覆盖了,于是我们需要保护拷贝指令,将拷贝指令复制到最后面,执行完成后跳转到开始
总结
- 多次利用JMP指令控制指令的执行
- 处理预期加载地址与实际加载地址不同的问题,处理覆盖的问题
- 利用代码拷贝来创造寄生空间或还原现场
尾插入
大致思路
用JMP指令覆盖正常程序的前3个字节使其跳转到病毒代码,再将覆盖的代码写到病毒代码的最后,执行完病毒代码后将尾部保存的原字节内容覆盖回去再跳转回去执行就可
自定位代码
但是有一些问题,比如病毒代码的加载偏差,在头插入中我们采用将正常代码拷贝到原来位置来消除加载偏差的,可是如果我们拷贝病毒代码,那就成了头插入了,于是我们要想办法获得加载偏差的值然后在病毒代码中校正,这就是自定位技术(重定位技术)
首先我们想到利用MOV AX,IP来获取IP寄存器的值,可是没有指令有权限访问IP寄存器
但是CALL指令很特殊,它会将下一条指令的IP压栈后跳转执行,于是我们可以利用这个机制获得加载偏差
总结
逆差入
定义:逆插入感染,实际就是一部分代码在原程序的头部,一部分在尾部,将整个原来的程序给包裹起来
图示
大致思路:
程序设计:
感染代码:
操作
- 逆差入需要拷贝多次(normal后移、头粘贴、尾粘贴)
- 用到了DOS读写文件的中断调用
DOS下的文件读写
类似C语言的fopen、fread、fwrite、fseek、fclose
打开文件:
读文件:
关闭文件:
写文件:
移动文件指针:
以上代码将文件指针放在尾部,设置移动的偏移量CX:DX为0,就是不移动,那么调用21h后,得到的新偏移量就是文件大小,也就是AX中存放文件大小
例题
应该是从尾至头拷贝,防止覆盖