主题:[救命]一道汇编题,求救!!
nitta
[专家分:0] 发布于 2007-05-25 20:11:00
最近老师布置了一道题,快要交了
真的好难啊,完全不会,急死了
请高手来帮帮忙吧!!感激不尽!!
下面是题目
模拟源代码病毒
在当前目录及当前目录的各级子目录中查找 C 语言源代码文件(*.c),找出所有C 语言源代码文件并“感染”这些文件:
能够修改 C 语言源代码文件
修改找到的源文件,使修改后的源文件编译之后生成的可执行文件执行时会首先在屏幕中央显示你的学号,之后按任意键在继续执行原来的操作(即被修改前应该执行的部分);
能够列出“感染”了哪些文件。
最后更新于:2007-05-25 20:14:00
回复列表 (共2个回复)
沙发
OldTrier [专家分:0] 发布于 2007-06-16 18:18:00
本题的程序有点“大”,建议看看《深入DOS编程》和《深入Windows编程》,了解DOS下和Windows下与文件操作有关的中断调用规定。
程序应有一个足够大的文件缓冲区(数据段);
涉及的文件操作有:
1、从操作系统获取磁盘文件信息(磁盘号)(保证现有磁盘都能查到);
2、对文件目录树的搜索(全目录树搜索,注意根目录和各级子目录是与各自的文件描述符缓冲区相关联的,每次进入下一级子目录时应启用新的文件描述符缓冲区,从子目录返回到父目录时,使用原来的文件描述符缓冲区即可);
2、打开文件(读方式);
3、读文件(将文件全部内容按一定长度[例如每次读40KB]分次读到内存,通常用循环体,直到文件读入完,注意记录好实际读入的文件长度);
4、关闭文件;
(接下来的程序功能应该有:分析内存中的文件内容;若已被“感染”则不再进行“感染”,否则,在其中加入“感染”部份,并记下“感染”后的文件长度,供保存文件时使用;
加入“感染”成分的操作可以这样做:在文件中找到“...main(...){”后记下“{”之后的地址(文件被分为前后两部份),计算出剩余内容的长度备用;对后部份内容的开始部份内容进行分析以确定文件是否已被感染,若已被感染,则打开下一文件(若打开不成功说明当前目录已搜索完,应返回父目录),否则进行下面的文件存盘处理(在保存文件过程中插入“感染”成份。)
5、文件更名(改扩展名为.BAK);
6、创建文件(写方式,按文件原名创建;若创建成功,文件即已经打开);
7、写文件(先写原文件的前一部份,再写“感染”部份,最后写原文件的后一部份;注意各部份的长度应正确;写完后关闭文件即完成对一个原程序文件的“感染”);
读到此处,想你一定已清楚恢复被“感染”文件的操作过程。
有两点请注意:
1、不要绝对相信文件的扩展名,搜索到一个*.c文件后一定要检查其内容是否符合C规范或C++规范,以免误“感染”;
(例如,*.COM文件应小于64KB,大于64KB的其实是EXE文件结构,微软就是通过对文件中的标识成份进行分析后来执行COMMAND.COM的。)
2、恢复原文件时建议先找同名的.BAK文件,若存在,对其内容进行检查,若确系*.C格式,则删去现在的*.C,再直接将*.BAK更名为*.C即可;否则真的需要进行原文件恢复操作。
3、真正执行恢复原文件操作时,应将被“感染”的*.C文件读入内存后,关闭文件(!);将文件内容分为前、中(“感染”部份)、后三部份;再按原名重新创建新文件,然后写入前、后两部份。(依本人的经验,按原名重新创建文件时,新文件长度为0,能保证文件恢复为原来长度。这只是本人用过这样的方法,不知有没有更简捷的。)。
另外,最好对自己“感染”的文件,加上自己的标记(//...方式或/*...*/方式),以免代人受过。
板凳
OldTrier [专家分:0] 发布于 2007-06-16 18:21:00
上面回复中的序号(1、 2、...)使用有失误之处,请阅读者注意,自行订正。
我来回复