怎样重定义telnet命令的输入输出?

ddmor 2005-12-19 02:17:18
CreatePipe创建管道后使用CreateProcess创建telnet命令的子进程,重定义其标准输入输出后使用WriteFile写入输入发现telnet还是接受到输入的内容
...全文
277 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiangshenyang 2005-12-31
  • 打赏
  • 举报
回复
何必使用管道,直接写一个telnet程序即可:
#pragma comment(lib,"wsock32.lib")
#include <winsock2.h>
#include <windows.h>
#include "stdafx.h"
#include "telnet.h"
#include <vector>
using namespace std;
SOCKET m_sktServer;
CWinApp theApp;
#define BUF_SIZE 1024


const unsigned char IAC = 255;
const unsigned char DO = 253;
const unsigned char DONT = 254;
const unsigned char WILL = 251;
const unsigned char WONT = 252;
const unsigned char SB = 250;
const unsigned char SE = 240;
const unsigned char IS = '0';
const unsigned char SEND = '1';
const unsigned char INFO = '2';
const unsigned char VAR = '0';
const unsigned char VALUE = '1';
const unsigned char ESC = '2';
const unsigned char USERVAR = '3';

int SendData(SOCKET sck,byte*pData,int nLen)
{
int nRet;
int nLeft;
//发送数据
nLeft=nLen;//获得要发送的数据长度
while(nLeft>0)
{
nRet=send(sck,(const char *)pData,nLeft,0);
if(nRet==0)
break;
else if(nRet<0)
{//发送数据失败
return -1;
}
nLeft-=nRet;
pData+=nRet;
}
return nLen;
}

int WINAPI RcvData(SOCKET skt,char*szBuf)
{
int nRet;
nRet=recv(skt,szBuf,BUF_SIZE,0);
if(nRet<0)
{//接收数据失败,断开连接
return -1;
}
else
{
szBuf[nRet]=0;
return nRet;
}
}




int FindChar(CString &str, char ch)
{
char* data = str.GetBuffer(0);
int len = str.GetLength();
int i = 0;
for(i = 0; i < len; i++){
if(data[i] == ch)
break;
}
str.ReleaseBuffer();
return i;
}

void ParseOptions(char*szOptions,vector<CString>&opArr)
{
CString sTemp = szOptions;
CString sOption;
unsigned char ch;
int nIdx;
int nIdxE;
while(!sTemp.IsEmpty() )
{
nIdx = sTemp.Find(IAC);
if(nIdx != -1)
{
ch = sTemp.GetAt(nIdx + 1);
switch(ch)
{
case DO:
case DONT:
case WILL:
case WONT:
sOption = sTemp.Mid(nIdx, 3);
sTemp = sTemp.Mid(nIdx + 3);
opArr.push_back(sOption);
break;
case IAC:
sTemp = sTemp.Mid(nIdx + 1);
break;
case SB:
nIdxE = FindChar(sTemp, SE);
sOption = sTemp.Mid(nIdx, nIdxE);
opArr.push_back(sOption);
sTemp = sTemp.Mid(nIdxE);
break;
default:
break;
}
}
else
{
break;
}
}

}




void RespOption(const CString&sOption,CString&sResp)
{
unsigned char Verb;
unsigned char Option;
unsigned char Modifier;
unsigned char ch;
BOOL bDefined = FALSE;

if(sOption.GetLength() < 3) return;

Verb = sOption.GetAt(1);
Option = sOption.GetAt(2);

switch(Option)
{
case 1: //回显
case 3: // Suppress Go-Ahead
bDefined = TRUE;
break;
}
sResp += IAC;
if(bDefined == TRUE)
{
switch(Verb)
{
case DO:
ch = WILL;
sResp += ch;
sResp += Option;
break;
case DONT:
ch = WONT;
sResp += ch;
sResp += Option;
break;
case WILL:
ch = DO;
sResp += ch;
sResp += Option;
break;
case WONT:
ch = DONT;
sResp += ch;
sResp += Option;
break;
case SB:
Modifier = sOption.GetAt(3);
if(Modifier == SEND)
{
ch = SB;
sResp += ch;
sResp += Option;
sResp += IS;
sResp += IAC;
sResp += SE;
}
break;
}
}

else
{
switch(Verb)
{
case DO:
ch = WONT;
sResp += ch;
sResp += Option;
break;
case DONT:
ch = WONT;
sResp += ch;
sResp += Option;
break;
case WILL:
ch = DONT;
sResp += ch;
sResp += Option;
break;
case WONT:
ch = DONT;
sResp += ch;
sResp += Option;
break;
}
}
}

BOOL RespOptions(const vector<CString>&opArr,CString&sResp)
{
int iS=opArr.size();
for(int i=0;i<iS;i++)
{
RespOption(opArr[i],sResp);
}
return TRUE;
}


BOOL ReceiveData(SOCKET sck)
{
BOOL bRt=TRUE;
char szBuf[BUF_SIZE]={0};
CString sResp;
vector<CString> sOptions;
int nRcv=0;
nRcv=RcvData(sck,szBuf);
if(nRcv>0)
{
//协商选项
ParseOptions(szBuf,sOptions);
if(sOptions.size()==0)
{
cout<<szBuf;
}
else
{
RespOptions(sOptions,sResp);
SendData(sck,(byte*)(LPCTSTR)sResp,sResp.GetLength());
bRt= ReceiveData(sck);
}
}
return bRt;
}


BOOL Init(int argc,char*argv[])
{
if(argc<1)
{
cout<<"err ,not enough arg"<<endl;
return FALSE;
}
WSADATA wsadata;
DWORD dwVersion;
dwVersion=MAKEWORD(2,2);
if(WSAStartup(dwVersion,&wsadata)!=0)
return FALSE;
m_sktServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(m_sktServer==SOCKET_ERROR)
return FALSE;
sockaddr_in local;
local.sin_family=AF_INET;
local.sin_port=htons(23);
local.sin_addr.s_addr=inet_addr(argv[1]);
cout<<"正连接到"<<inet_ntoa(local.sin_addr)<<"..."<<endl;
if(connect(m_sktServer,(sockaddr*)&local,sizeof(local))!=0)
return FALSE;
cout<<"连接成功"<<endl;
return TRUE;
}

void Telnet(SOCKET sck)
{
int nRt=0;
char szBuf[BUF_SIZE]={0};
ReceiveData(sck);
ReceiveData(sck);
string sData="root\r\n";
SendData(sck,(byte*)sData.c_str(),sData.size());
Sleep(200);
ReceiveData(sck);
sData="你的密码\r\n";
SendData(sck,(byte*)sData.c_str(),sData.size());
Sleep(200);
ReceiveData(sck);
sData="远程命令\r\n";
SendData(sck,(byte*)sData.c_str(),sData.size());
Sleep(200);
while(nRt!=-1)
{
nRt=RcvData(sck,szBuf);
if(nRt!=-1)
{
szBuf[nRt]=0;
cout<<szBuf;
}
}

}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{

int nRetCode = 0;
if(!Init(argc,argv))
return -1;
Telnet(m_sktServer);


return nRetCode;
}


ggw 2005-12-19
  • 打赏
  • 举报
回复
用即地文件可不可?
duyhui 2005-12-19
  • 打赏
  • 举报
回复
创建管道后,你的程序得到telnet正确的输出了吗?
jazy 2005-12-19
  • 打赏
  • 举报
回复
up
yzhouen 2005-12-19
  • 打赏
  • 举报
回复
up

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧