通行证│用户名: 密码: 验证码: 验证码,看不清楚?请点击刷新验证码 电信网通铁通移动   在线
文章搜索:
热门搜索:红客 黑鹰 红客技术 安全动画 红客培训
首页 文章 软件 动画 资源 励志 论坛 邮箱 会员 军事 科技 博客 爱心红客 最近更新 800g资源
 业内新闻 漏洞公告 病毒公告 电脑知识 网络知识 菜鸟入门 攻防教程 黑客攻防 安全编程 工具使用 综合安全 个人安全 安全相关 Q Q安全 原创精华 红客人物 站内事件
您现在的位置: 爱国者安全网 >> 文章类 >> 红客教程 >> 网络编程 >> 文章正文
自己动手编写简单远程控制
责任编辑:酷酷の鱼   更新日期:2008-1-18
 

文章作者:灰狐
首发地址:灰狐's Blog ( Www.HuiHu32.cN )

最近大大小小的考试陆续来到,每个人都忙的无暇估计其他,当然也包括兄弟俺。一系列考试复习就够让人头疼了,麻烦的是还有4个VC的课程设计(3个帮其他人做的),害俺不得不把出版社的稿子一拖再拖。

8号终于考试完了,从8号到10号晚上连续通宵了三天,11号晚上休息了一次,今天(12号)晚上又来通宵了,一直在赶出版社的稿子,今晚估计就能搞定了。

博客前段时间换了空间,已经好久没更新了,这期也没空给黑防写稿子了,好忙。刚刚又到新浪体育上看了下,结果不出以外地看到国家队和国奥队双双惨败,一个0:4,一个2:7,真够丢人的,唉。

看完新闻后也不知道有什么事情好做,就写篇文章吧,既然不能花太多时间来写。想想在VC课程设计中我选的题目是做一个简单的远程控制软件,只要实现客户端与服务端的连接和发送信息,并控制服务端实现鼠标控制、关机重启、屏幕截取等简单功能就可以了。

今天就把我做的过程写下来吧,给新手一些参考,软件是VC6.0,建立的是MFC工程,通信和线程等功能实现均直接调用API,对控件的处理使用了相关类。

首先讲一下两方的通信过程:服务端启动后就进行监听,客户端主动连接服务端,连接成功后为其建立一个线程接收控制命令并进行处理。

下面讲解客户端的实现。
客户端的功能其实很简单,只要连接上服务端后就基本什么不用做了,当用户点击“发送控制”按钮后根据控制选项构造不同的命令进行发送。
下面是连接服务端的代码:
// 得到服务端IP
BYTE ch1,ch2,ch3,ch4;
m_edtServer.GetAddress(ch1,ch2,ch3,ch4);
m_strServer.Format("%u.%u.%u.%u",ch1,ch2,ch3,ch4);

WSADATA ws;
int ret;
struct sockaddr_in server;

if(WSAStartup(MAKEWORD(2,2),&ws) != 0)
{
return;
}
if((sClient = socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET)
{
return;
}

server.sin_family = AF_INET;
server.sin_port = htons(m_nPort);
server.sin_addr.s_addr = inet_addr(m_strServer);

if(connect(sClient,(struct sockaddr *)&server,sizeof(server)) == 0)
{
m_edtStatus.SetWindowText("已连接上 TCP端口:12345");
}

下面是“发送控制”按钮的响应函数,本示例程序中只有三种基本功能:信息发送(使对方弹出一个对话框,显示您所发送过去的信息)、系统控制(包括关机、重启、截获屏幕、弹出/关闭光驱5个子功能)、鼠标控制(包括随机移动、禁用输入、交换左右键3个子功能)。我使用了三个单选框来确定是哪类基本类型的控制,下拉框来进行子功能选择。因此每次控制要发送两次控制,第一次确定基本功能,第二次确定子功能。

char CmdBuffer[1024];
char CmdType[5];
CString strBuffer;
int iSelect;
HANDLE hThread;
DWORD dwThread;

// 构造命令
if(m_rdoMsg.GetCheck() == 1)
{ // 发送消息
m_edtMsg.GetWindowText(strBuffer); // 得到输入框中的内容
sprintf(CmdBuffer,"%s",strBuffer);
sprintf(CmdType,"%c",'S');
}
else if(m_rdoCtrl.GetCheck() == 1)
{ // 系统控制
// 只发送下拉框返回的选项索引号,服务端直接根据该索引确定子功能命令
iSelect = m_cmbCtrl.GetCurSel();
sprintf(CmdBuffer,"%d",iSelect);
sprintf(CmdType,"%c",'C');
}
else if(m_rdoMouse.GetCheck() == 1)
{ // 鼠标控制
iSelect = m_cmbMouse.GetCurSel();
sprintf(CmdBuffer,"%d",iSelect);
sprintf(CmdType,"%c",'M');
}
else
{
return;
}

// 首先发送命令基本类型
int ret = send(sClient,CmdType,strlen(CmdType) + 1,0);
if((ret == SOCKET_ERROR) || (ret == 0))
{
return;
}
// 发送子功能号
ret = send(sClient,CmdBuffer,strlen(CmdBuffer) + 1,0);
if((ret == SOCKET_ERROR) || (ret == 0))
{
return;
}
return;

下面再贴一段如何使服务端截获到的屏幕图像显示在picture控件中,因为时间比较紧张,我没有把图像传输这一块儿做好,就给偷了个懒,服务端截获到屏幕后直接保存在C盘根目录下,而控制端直接到该位置读取,哈哈,专门跟老师说了下,老师考虑到时间限制就放我了一马,其实就是用某些编码算法将图片压缩一下就可以了,例如JPEG,懒得弄了。

HBITMAP hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(),"C:\\test.bmp",
IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE);

CDC *pDc = GetDlgItem(IDC_FILE_STATIC)->GetDC();
CDC screen;
screen.CreateCompatibleDC(pDc);
CRect rect;
GetClientRect(rect);
HBITMAP OldBitmap = (HBITMAP)screen.SelectObject(hBitmap);
pDc->BitBlt(0,0,rect.Width() ,rect.Height() ,&screen,0,0,SRCCOPY);
return;

下面来看服务端,老规矩,先来看监听的函数。
WSADATA ws;
int iAddrSize;
HANDLE hThread;
DWORD dwThread;
struct sockaddr_in local,client;

if(WSAStartup(MAKEWORD(2,2),&ws) != 0)
{
return;
}

if((sListen = socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET)
{
return;
}

local.sin_family = AF_INET;
local.sin_port = htons(12345);
local.sin_addr.S_un.S_addr = INADDR_ANY;

if(bind(sListen,(struct sockaddr*)&local,sizeof(struct sockaddr)) == SOCKET_ERROR)
{
closesocket(sListen);
return;
}

listen(sListen,5);

iAddrSize = sizeof(client);
sClient = accept(sListen,(struct sockaddr *)&client,&iAddrSize);
if(sClient == INVALID_SOCKET)
{
closesocket(sListen);
return;
}

// 创建一个会话线程
hThread = CreateThread(NULL,0,ClientThread,(LPVOID)sClient,0,&dwThread);
if(hThread == NULL)
{
return;
}
CloseHandle(hThread);

closesocket(sListen);
WSACleanup();
return;

再来看线程函数的代码。
SOCKET sock = (SOCKET)param;
char szBuff[MAX_PATH];
int ret;

while(1)
{
ret = recv(sock,szBuff,sizeof(szBuff),0);
if(ret == 0)
break;
else if(ret == SOCKET_ERROR)
break;
else
szBuff[ret] = '\0';

[1] [2] 下一页

  • 上一篇文章:
  • 下一篇文章: 没有了
  • 最近更新
    固顶文章 爱国者安全网2007年度优秀版主评选
    普通文章 瑞星公司01月18日发布 每日计算机病毒及木马播报
    普通文章 07年病毒高速出新“工业化”入侵特征明显
    普通文章 病毒制造门槛低 互相模仿导致泛滥
    普通文章 我国IP地址数已达到1.35亿个 但缺口仍然很大
    普通文章 关于URL解析漏洞在PDF文档中的利用
    推荐文章 推荐:对网软网上购物系统的一点点分析
    普通文章 自己动手编写简单远程控制
    普通文章 IP-Tools中的密码学算法详细分析
    普通文章 **CHM 3.50 注册流程及算法分析(续)
    热门文章
    普通文章windows下利用OpenVPN搭建VPN服务器
    普通文章验证码 kaptcha 杂谈
    普通文章计算机病毒鼻祖里奇拟挑战谷歌
    普通文章利用漏洞传播 内嵌在网页中的木马病毒
    普通文章2007年病毒感染3000余万台电脑
    普通文章假低价信息吸引买主 盗号程序10秒内划走银行卡存款
    普通文章捷克黑客入侵电视节目遭指控
    普通文章美国男子用垃圾邮件操纵中国公司股价被起诉
    普通文章White_Dune 存在本地缓冲区溢出及格式串处理漏洞
    普通文章Trolltech Qt QSslSocket类证书验证绕过安全限制漏洞
    精彩专题