适合读者:编程爱好者、黑客工具爱好者
前置知识:Borland C++ Builder 6.0基本使用方法
Socket:本文主要介绍了远程屏幕监视软件EagleEye的开发与设计过程。逐一介绍了比较正规的专业程序开发步骤:需求分析、功能设计与实现、软件测试运行。在功能设计中用程序流程图展现了程序执行的具体过程。在功能实现中详细的展现了系统的各个功能模块、所需的VCL类和自定义的相关类,给出了实现相应的功能的函数及代码,文章的最后还给出了本软件的主要功能源代码。我们推出这样的文章是想让大家真正了解到专业程序开发的流程和详细的步骤分析,或许这个文章就能让无数新手迈进专业程序开发的第一步呢?!
带你迈上专业软件开发第一步:远程屏幕监视软件的设计与实现
文/图 liuyit
通过21天的编写,远程辅助类工具软件EagleEye 基本编写完毕,能够完成多窗口多种方式(可以选择截图或实时监视的方式)同时监视多台远程计算机,可以实现对本地计算机上显示的远程屏幕图像的实行存储,可以将图像拷贝到剪贴板,并且用户可以设定监视时间、监视方式,可以选择程序的运行方式(可以是正常模式,也可以使程序隐藏于后台运行)。完全实现了我最初的设想。心情不错,于是急忙拿出来和广大的黑防读者们一起共享,共同富裕嘛!
开发环境和功能分析
远程屏幕监视作为我自主编写的远程控制软件的一个模块,我将其独立分割出来发布测试,软件要求能实现分屏同时监视远程主机。大体的开发环境是:
操作系统:Windows XP SP1
开发所用计算机配置:512M内存+P42.4G CPU+800MHZ系统总线
环境:Borland C++ Builder 6.0+SUIStyle控件
至于功能需求分析,我们一点一点看,这或许是专业开发人员和普通自学程序员之间最大的差距,一起来学习、探讨一下吧!
1.为实现数据的网络传输,软件采用C/S(客户端/服务器)数据传输模式。从遵循计算机道德的角度出发,在该设计过程中,不打算编写具有木马特征的独立的服务端,而将软件集客户端(Client)和服务端(Server)于一体。软件基本定位是:远程辅助类工具软件。
Socket:咳……其实你可以花5分钟时间将客户端(Client)和服务端(Server)分离,并加入自启动的功能,如果够狠的话,再加入关联文件的功能,这不是一个截屏木马?
2.服务端(Server)实现:采用C++ Builder的Socket Server控件来实现服务端的数据传输功能。主要功能:监听本地计算机的指定端口,截获本机屏幕信息,拷贝屏幕区域到自定义的位图变量。
Socket:为了达到提高传输效率,服务端根据在连接过程中所获得的转换参数将位图转换成JPGE格式后存入缓存区,在与远程客户端连接的前提下,将缓存区数据流发送至客户端(Client)。
3.客户端(Client)实现:利用Winsock API函数来定义用于本软件网络数据传输的Sockets。功能实现:向远程主机服务端(Server)提出连接申请,并在此过程中将JPGE转换参数发送给服务端(Server)。在获得连接的前提下,不断接受远程服务端(Server)所发送至的包含远程主机屏幕信息的JPGE的数据流,并实时将所接受的图像在本软件的客户区域(Client Region)上重绘,从而实现在本地计算机实时监视远程计算机屏幕的目的。
详细功能设计
上面大体分析了功能和需要,下一步一起来看看如何进行详细的功能设计。
1.客户端(Client)
(1)客户端与服务端之间网络畅通状况的检测。编写Ping模块,此模块发送一个ICMP echo request(ICMP协议回显请求)至目标主机,如果获得回显,则向目标主机发送连接请求。
(2)客户端(Client)与服务端(Server)之间的数据传输。利用Winsock API函数来定义用于本软件数据传输的Sockets。具体过程为:连接远程主机->返回有效SOCKET(使用Connect_Server())->向SOCKET写字符串(使用Write_Socket())->向远程主机的指定端口发送字符串提供转换参数(使用SendMsg())->动态分配端口,并与SOCKET绑定->返回该SOCKET(使用BindSocket())->向远程主机的指定端口发送请求(使用SendStream())->从远程主机的指定端口接收数据流(使用RecvStream())。
(3)图像重绘:使用Image控件将从远程主机发送到的JPGE图像显示。
2.服务端(Server)
(1)服务端(Server)功能的实现。使用C++ Builder的Socket Server控件编写软件的服务端(Server)。监听本地计算机指定端口,接受由客户端发送至的相关参数,将参数传递给屏幕图像截取模块。
(2)屏幕图像截取与传输步骤:读取取得桌面的矩形区域范围GetWindowRect()->创建内存设备描述表从而定义位图变量GetDC()->拷贝屏幕的指定区域到位图BitBlt();->创建JPEG图象将位图转化为JPEG格式->保存JPEG图象信息至内存数据流Assign(),SavetoStream()->将图象信息数据流通过Sockets发送至客户端(由SendStream()实现)。
程序流程图
数据结构与算法