【安全研究】银狐远控远程屏幕使用场景和优化建议

admin 2026-04-10 01:48:20 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 银狐远控提供差异、高速、娱乐三种远程屏幕模式,分别采用zlib、JPEG、H.264编码技术,适用于不同带宽场景。文档详细分析各模式的技术原理、性能优劣及适用场景,并提出扫描策略优化、编码器复用、自适应码率等六项具体改进方案,建议根据网络条件选择对应模式以实现最佳性能。 综合评分: 75 文章分类: 恶意软件,红队,安全工具,安全开发,技术标准


cover_image

【安全研究】银狐远控远程屏幕使用场景和优化建议

原创

安全研究员 安全研究员

CppGuide

2026年4月9日 17:57 上海

特别申明:

本文内容仅限于用作技术交流,请勿使用本文介绍的技术做任何其他用途,否则后果自负,与本号无关。

银狐远控除了提供了后台桌面这种非正常屏幕,还提供了差异屏幕、高速屏幕和娱乐屏幕三种远程屏幕。

下面从总体和关键实现逻辑上介绍一下它们的区别和使用场景。

三种屏幕模式技术分析

核心参数对比

| 特性 | 差异屏幕 | 高速屏幕 | 娱乐屏幕 | | — | — | — | — | | 压缩算法 | zlib deflate | JPEG (libjpeg) | H.264 (x264) | | 默认色深 | 8-bit (可选 4/8/16/32) | 32-bit BGRA (固定) | 32-bit BGRA (固定) | | 默认帧率 | 1 fps | 1 fps | 30 fps | | 差异检测单元 | 扫描线,步长19行,偏移24px | 网格,Y步长10行,X步长32px | 无(整帧编码) | | 线程模型 | 2线程 (工作+控制) | 2线程 (工作+控制) | 3线程流水线 (采集→编码→发送) | | 首帧传输 | 全屏 bitmap → zlib压缩 | 全屏 → JPEG压缩 | SPS/PPS + IDR帧 | | 后续帧 | 仅变化矩形 → zlib | 仅变化矩形 → 各自JPEG | 连续 P/B 帧流 | | 质量调节 | 无(色深切换代替) | 60 / 85 / 100 三档 | 码率 + preset | | 多显示器 | 不支持 | 不支持 | 支持 (Monitor 枚举) | | 录制 | 无 | 无 | MP4 录制 |

一、差异屏幕 (ScreenSpy.cpp — DEF_STEP=19, OFF_SET=24)

工作原理:

全屏抓图 → 逐行扫描(步长19行) → 和上帧对比单像素 →
找到变化行 → 向上下各扩展 OFF_SET(24) → zlib压缩矩形 → 发送

关键代码 (差异屏幕/ScreenSpy.cpp:161):

::SetRect(&m_changeRect, -1, nStartLine-DEF_STEP, -1, nStartLine+DEF_STEP*2);
// 对比时按 m_nIncSize 步长跳跃(32/biBitCount 个像素)
for&nbsp;(int&nbsp;j =&nbsp;0; j < m_nFullWidth; j += m_nIncSize)
&nbsp; &nbsp;&nbsp;if&nbsp;(*p1 != *p2) { ... }

适用场景: 网络带宽极差(拨号/低速网络)、被控端屏幕静止内容多(文档操作、命令行)、需要低色深节省流量

缺点: 步长19行会漏检两次扫描之间的变化行;矩形合并策略粗糙,一行有变化就扩展整个宽度带来大量无用数据

二、高速屏幕 (ScreenSpy.cpp — DEF_YSTEP=10, DEF_XSTEP=32)

工作原理:

双缓冲采集(last/curr) → 网格扫描(10行×32像素块) →
对比上一帧 → 对每个变化矩形独立JPEG编码 →
按需zlib二次压缩 → 发送 [矩形JPEG长度+数据+坐标]

关键代码 (高速屏幕/ScreenSpy.cpp:325):

for&nbsp;(int&nbsp;y = m_nScanLine; y < m_nFullHeight; y += DEF_YSTEP)
&nbsp; &nbsp;&nbsp;for&nbsp;(int&nbsp;x =&nbsp;0; x < m_nFullWidth; )
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(*p1 != *p2) {&nbsp;/* JPEG压缩该矩形 */&nbsp;}

首帧和后续帧都发送算法标识字节,支持运行时切换到 XVID(预留接口)。JPEG质量默认85,可动态调整。

适用场景: 普通宽带环境、屏幕有持续动态内容(视频窗口、游戏界面)、需要较好画质同时保持响应速度

优势: JPEG对自然图像压缩率高于zlib raw bitmap,32-bit真彩色画质好;双缓冲避免撕裂

三、娱乐屏幕 (H264ScreenManager.cpp — x264 ultrafast+zerolatency)

工作原理:

采集线程: BitBlt → BGRA帧 → libyuv转YUV420 → 入YUV队列
编码线程: YUV队列 → x264编码(ultrafast预设) → NAL单元 → 入H264队列
发送线程: H264队列 → TCP发送 [PacketHead+NAL数据]

关键初始化 (H264ScreenManager.cpp:141):

std::string&nbsp;x264_preset =&nbsp;"ultrafast";
std::string&nbsp;x264_tune &nbsp;=&nbsp;"zerolatency";
fps =&nbsp;30; btl =&nbsp;9000;&nbsp;// 9000 kbps

x264 库从内存中加载(MemoryLoadLibrary),不依赖系统安装。

适用场景: 高带宽局域网环境、被控端有视频/游戏等高动态内容、需要录制操作过程(MP4)、多显示器切换

可优化方向

1. 差异屏幕 — 扫描策略粗糙

问题: 步长19行 + 固定 OFF_SET 24px 导致漏检+过量传输

// 当前:以整行宽度作为变化矩形宽度
::SetRect(&m_changeRect,&nbsp;-1, nStartLine-DEF_STEP,&nbsp;-1, nStartLine+DEF_STEP*2);
m_changeRect.left = j - OFF_SET; &nbsp;// 仅左右收缩,不收缩上下

优化: 先做 dirty region 汇总,合并相邻小矩形后再压缩,避免一行小变化触发整宽矩形传输

2. 高速屏幕 — 每帧重新 JPEG 编码开销

问题: 每个变化矩形独立调用 jpeg_create_compress/jpeg_destroy_compress,在变化区域多时重复创建/销毁压缩器开销大

// BMP_JPG() 每次创建、销毁 jcs
jpeg_create_compress(&jcs);
// ... 编码 ...
jpeg_destroy_compress(&jcs);

优化: 复用 jpeg_compress_struct(libjpeg 支持 reinit),或改用 libjpeg-turbo 的 tjhandle 池

3. 高速屏幕 — 增量扫描行轮转未实现

问题:m_nScanLine 字段存在但 getNextScreen 中扫描始终从0开始,没有真正做分帧轮转

// 初始化
m_nScanLine =&nbsp;0;
// getNextScreen 中
ScanChangedRect(TRUE);&nbsp;// 每次全屏扫描

优化: 实现 scanline 轮转(每帧只扫 1/N 行,N帧完成全屏),降低单帧CPU占用

4. 娱乐屏幕 — 码率固定 9000kbps,无自适应

问题:btl = 9000 硬编码,网络差时会导致 NAL 队列积压、延迟增大

fps =&nbsp;30; btl =&nbsp;9000;&nbsp;// 固定码率

优化: 监测发送队列深度,动态调整 x264_param.rc.i_bitrate,实现简单的 ABR/CBR 自适应

5. 三种模式共同问题 — FPS 控制用 Sleep 忙等

// 差异屏幕 / 高速屏幕
while&nbsp;(GetTickCount() - m_dwLastCapture < m_dwSleep)
&nbsp; &nbsp; Sleep(10);

GetTickCount 精度 15ms,Sleep(10) 实际睡 ~15ms,导致帧率不精确。优化: 改用 timeSetEvent 或 CreateWaitableTimer 实现精确帧率定时

6. 差异屏幕 — 色深切换重启线程代价高

问题:ResetScreen() 在切换色深时完全销毁重建 CScreenSpy 对象

void&nbsp;CScreenDifManager::ResetScreen(int&nbsp;biBitCount)&nbsp;{
&nbsp; &nbsp; m_bIsWorking =&nbsp;false;
&nbsp; &nbsp; WaitForSingleObject(m_hWorkThread, INFINITE);&nbsp;// 阻塞等待
&nbsp; &nbsp;&nbsp;delete&nbsp;m_pScreenSpy;
&nbsp; &nbsp; m_pScreenSpy =&nbsp;new&nbsp;CScreenSpy(biBitCount);
&nbsp; &nbsp; m_hWorkThread = _beginthreadex(...);&nbsp;// 重新启动
}

优化:CScreenSpy 内部支持动态切换色深,无需重建对象和线程


选用建议

带宽 < 512Kbps &nbsp;→ 差异屏幕(8-bit灰度模式)
带宽 1-10Mbps &nbsp; → 高速屏幕(质量85,动态fps)
带宽 > 10Mbps &nbsp; → 娱乐屏幕(适合视频/游戏,支持录制)
局域网实时控制 &nbsp; → 高速屏幕(延迟最低,无编码器初始化延迟)

关于银狐远控的可以优化点很多,维护这一年多以来,我总共修复了100+问题,github提交记录就有568次之多。

当然,虽然这套源码bug挺多的,但瑕不掩瑜,它仍然是学习C/C++开发、多线程编程、网络编程、安全工程、综合项目实践、红蓝攻防非常好的材料。

为了更方便排查和优化代码,我除了修复以上bug以外,还将这套代码从原来的Visual Studio 2010工程全部升级成Visual Studio 2022,并补全和重编译了所有依赖库代码,并去掉所有后门,现在它是一款可以放心使用的远控软件。

由于篇幅有限,本次分享就到这里了,后续我将会更新更多的C/C++开发知识,欢迎关注公众号CppGuide。

源码获取

如果对银狐(winos)有兴趣,可以通过下面的方式获取全套源码:

关注后回复【winos】即可获取源码

推荐阅读

银狐远控问题排查与修复——Viusal Studio集成Google Address Sanitizer排查内存问题

银狐远控代码中差异屏幕bug修复

银狐远程屏幕内存优化方法探究

银狐远程软件bug修复记录 第03篇

银狐远程软件 UDP 断线无法重连的bug排查和修复

银狐远程软件代理映射功能优化思路分享

银狐远程软件去后门方法

银狐远控一键编译调试与开发教程

银狐远控免杀与shellcode修复思路分析 01

银狐ShellCode混淆怪招


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:CppGuide 安全研究员 安全研究员《【安全研究】银狐远控远程屏幕使用场景和优化建议》

评论:0   参与:  0