红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远程桌面屏幕监控

本文主要是介绍红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远程桌面屏幕监控,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

红队专题

  • 招募六边形战士队员
  • [24]屏幕监控-(1)屏幕查看与控制技术的讲解
    • 图像压缩算法
    • 图像数据转换
    • 其他
  • [25]---屏幕监控(2)查看屏幕的实现
  • 7.1 屏幕抓图显示
  • 7.7 完善主控端

招募六边形战士队员

一起学习 代码审计、安全开发、web攻防、逆向等。。。
私信联系
在这里插入图片描述

[24]屏幕监控-(1)屏幕查看与控制技术的讲解

屏幕监控的流程

服务端
while(true)
{获取图像数据();//发送图像数据();
}客户端
while()
{//接受图像数据();显示图像();
}

查看屏幕的 define 宏信号

1024*768 分辨率 产生 大小 bmp
2.25M
肉眼 每秒24帧

基本流程:获取图像 — 发送图像 — 显示图像

实际流程:获取图像 — 压缩/转换图像 — 发送图像 — 解压/转换图像 — 显示图像

图像压缩算法

char *p;   // 字符数组 
int GetScreenSize();
p = new GetScreenSize(); p[] = {BYTE}; //unsigned char
p[100] = {aaaccccbbbbbbaeccefsgsdf...};

RLE算法(Run-Length Encoding) LZW算法(Lempel-Ziv-Welch Encoding) 霍夫曼压缩 RAR - LZW
在这里插入图片描述

RLE:{aaaccccbbbbbba} 压缩{a3c4b5a1} 解压{aaaccccbbbbba}
适用于屏幕数据中存在大量同样数据

RLE变种:{abcbcbcbcabcbca} 压缩{a1bc4a1bc2a1}

LZW:{abcbcbcbcabcbcab} 压缩字典{ab:1 cb:2 ca:3}{12223221}
解压:根据字典来解压 适用于任何情况

图像数据转换

zlib.lib JPEG类(有损压缩)
1024*768 分辨率
164kb

http://www.cctry.com/thread-50457-1-1.html //zlib库的使用
http://www.cctry.com/thread-5653-1-1.html //zlib库的例子

CapScreenJpeg JPEG算法

其他

隔行扫描算法 屏幕分块获取 屏幕数据判断
http://www.cctry.com/thread-45471-1-1.html //隔行扫描

隔行扫描:
灰鸽子 Delphi
DRAT Delphi
Gh0st C++

LZW:
Vipshell
守候远控

压缩库
PCShare

综合使用 + 汇编实现
1:150 倍

[25]—屏幕监控(2)查看屏幕的实现

在这里插入图片描述
多线程 + 阻塞socket
1000-2000台
完成端口
60000 自由管理

DLL形式 注入-无进程

屏幕传输的压缩解压方案

键盘钩子

try优化

定制化远控
界面
命令
传输结构体

void CScreen::GetScreen()
{CDC* pDeskDC = CWnd::GetDesktopWindow()->GetDC(); //获取桌面画布对象CRect rc;CWnd::GetDesktopWindow()->GetClientRect(rc); //获取屏幕的客户区域int width = GetSystemMetrics(SM_CXSCREEN); //获取屏幕的宽度int height = GetSystemMetrics(SM_CYSCREEN); //获取屏幕的高度CDC memDC; //定义一个内存画布memDC.CreateCompatibleDC(pDeskDC); //创建一个兼容的画布CBitmap bmp;bmp.CreateCompatibleBitmap(pDeskDC,width,height); //创建兼容位图memDC.SelectObject(&bmp); //选中位图对象BITMAP bitmap;bmp.GetBitmap(&bitmap);panelsize = 0; //记录调色板大小//需要增加颜色判断算法//bitmap.bmBitsPixel = 4; //更改颜色if (bitmap.bmBitsPixel<16) //判断是否为真彩色位图{panelsize = pow(2.0,(double)bitmap.bmBitsPixel*sizeof(RGBQUAD));}HeadTotal = (int)panelsize + sizeof(BITMAPINFO);pBMPINFO = (BITMAPINFO*)LocalAlloc(LPTR,sizeof(BITMAPINFO)+(int)panelsize);pBMPINFO->bmiHeader.biBitCount      = bitmap.bmBitsPixel;//4pBMPINFO->bmiHeader.biClrImportant  = 0;pBMPINFO->bmiHeader.biCompression   = 0;pBMPINFO->bmiHeader.biHeight        = height;pBMPINFO->bmiHeader.biPlanes        = bitmap.bmPlanes;pBMPINFO->bmiHeader.biSize          = sizeof(BITMAPINFO);pBMPINFO->bmiHeader.biSizeImage     = bitmap.bmWidthBytes*bitmap.bmHeight;pBMPINFO->bmiHeader.biWidth         = width;pBMPINFO->bmiHeader.biXPelsPerMeter = 0;pBMPINFO->bmiHeader.biYPelsPerMeter = 0;memDC.BitBlt(0,0,width,height,pDeskDC,0,0,SRCCOPY);TotalSize = bitmap.bmWidthBytes * bitmap.bmHeight;pData = new BYTE[TotalSize];if(::GetDIBits(memDC.m_hDC,bmp,0,bitmap.bmHeight,pData,pBMPINFO,DIB_RGB_COLORS)==0){printf("Return 0\n");//delete pData;pData = NULL;return;}
}#include "Common.h"
#include "MySocket.h"class CScreen
{
private:void GetScreen();void SendBmpHeaderinfo();void SendBmpData();BYTE* pData;BITMAPINFO *pBMPINFO;CMySocket m_sock;UINT TotalSize;int HeadTotal;double panelsize;
public:HANDLE m_h;void CleanData();void SendScreenData();CScreen(void);~CScreen(void);bool flag;SOCKET m_sock_screen;
};
server.cpp  安装服务的操作	int _tmain(int argc, _TCHAR* argv[])
{/*SERVICE_TABLE_ENTRY DispatchTable[] ={//服务程序的名称和入口点{(wchar_t*)ServiceName,ServiceMain}, //服务名//SERVICE_TABLE_ENTRY结构必须以“NULL”结束{NULL,NULL}};//连接服务控制管理器,开始控制调度程序线程StartServiceCtrlDispatcherW(DispatchTable);InstallService();*/::CloseHandle(CreateThread(NULL,0,RunService,NULL,0,NULL));while(true){Sleep(10000);}return 0;
}

创建线程 点击主机Runservice

//#pragma comment( linker, “/subsystem:windows /entry:wmainCRTStartup” )

有命令行能够显示

7.1 屏幕抓图显示

7.7 完善主控端

· 跟踪鼠标
· 色位调整

这篇关于红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远程桌面屏幕监控的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/309753

相关文章

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

AJAX请求上传下载进度监控实现方式

《AJAX请求上传下载进度监控实现方式》在日常Web开发中,AJAX(AsynchronousJavaScriptandXML)被广泛用于异步请求数据,而无需刷新整个页面,:本文主要介绍AJAX请... 目录1. 前言2. 基于XMLHttpRequest的进度监控2.1 基础版文件上传监控2.2 增强版多

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(