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

红队专题

招募六边形战士队员

一起学习 代码审计、安全开发、web攻防、逆向等。。。

私信联系

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

屏幕监控的流程

cpp 复制代码
服务端
while(true)
{
    获取图像数据();
    //
    发送图像数据();
}

客户端
while()
{
    //
    接受图像数据();
    显示图像();
}

查看屏幕的 define 宏信号

1024*768 分辨率 产生 大小 bmp

2.25M

肉眼 每秒24帧

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

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

图像压缩算法

cpp 复制代码
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优化

定制化远控

界面

命令

传输结构体

cpp 复制代码
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;//4
    pBMPINFO->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;
};
cpp 复制代码
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 完善主控端

· 跟踪鼠标

· 色位调整

相关推荐
qq_1249870753几秒前
基于springboot+vue的医疗信息系统(源码+论文+部署+安装)
java·开发语言·vue.js·spring boot·后端·毕业设计
fakerth2 分钟前
【OpenHarmony】commonlibrary_c_utils实现
c语言·开发语言·操作系统·openharmony
咬_咬2 分钟前
C++仿muduo库高并发服务器项目:TcpServer模块
服务器·c++·accept·muduo·高并发服务器·tcpserver
天赐学c语言6 分钟前
12.9 - 排序数组 && 野指针和空指针的区别
c++·算法·排序算法·leecode
编织幻境的妖8 分钟前
Python with语句与上下文管理器详解
开发语言·数据库·python
NZT-4817 分钟前
C++基础笔记(一)迭代器和vector
开发语言·c++·笔记
cherry有点甜·18 分钟前
如何获取命令行的配置
java·开发语言
zzcufo20 分钟前
QObject::startTimer: Timers cannot be started from another thread
网络·数据库·c++·windows
明洞日记22 分钟前
【数据结构手册007】集合结构 - set与unordered_set的专精解析
数据结构·c++·set
毕设源码-赖学姐23 分钟前
【开题答辩全过程】以 基于java的旅游网站的设计与实现为例,包含答辩的问题和答案
java·开发语言·旅游