小白也能学会的RustDesk服务端搭建与客户端修改

cocibilin6个月前工具4700

主包也不是专业的,自己也是小白,小白教小白。

对Rust和fltter一窍不通,通过自己的研究得出的经验,请多多指教。

bilibili教程地址:点击观看


关于搭建Rust编程、编译环境的部分主包也是参考一位台湾网友在此感谢~~


附件在文章末尾。

转载请注明出处。

拿了就留个言吧~


//----------部署教程.txt--------------//

服务端部署:
    1、服务端下载地址:https://github.com/rustdesk/rustdesk-server
    2、(可选)NSSM工具下载地址:https://nssm.cc/release/nssm-2.24.zip
    
    使用CMD执行以下命令:
        CD "服务端所在目录"
        nssm install "RustDesk hbbs service" "服务端所在目录\hbbs.exe" 
        nssm install "RustDesk hbbr Service" "服务端所在目录\hbbr.exe" 

    
客户端编译环境部署:
    1、使用VS Code 编辑源代码文件或使用其他文本编辑软件都行
        VS CODE下载地址:https://code.visualstudio.com/
    
    2、Git管理工具下载地址:https://git-scm.com/downloads/win
        一路下一步安装
    
    3、Microsoft C++ 生成工具下载地址:https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/
        打勾:
            使用C++的桌面开发
            Windows10 SDK
            对 v143 生成工具(最新)的C++/CLI支持
            适用于 v143 生成工具的C++模块(x64/x86)
            适用于 Windows 的 C++ Clang 工具
        
    4、Rust语言下载:https://www.rust-lang.org/tools/install
        选1安装
        
    5、安装vcpkg包管理工具
        使用git命令执行:
            cd c:\
            git clone https://github.com/microsoft/vcpkg
            cd vcpkg
            bootstrap-vcpkg.bat
            vcpkg install libvpx:x64-windows-static
            vcpkg install aom:x64-windows-static
            vcpkg install opus:x64-windows-static
            vcpkg install libyuv:x64-windows-static
            setx VCPKG_ROOT C:\vcpkg
            
    6、安装FlutterUI 框架
        使用git命令执行:
            cd c:\
            git clone https://github.com/flutter/flutter.git -b 3.27.2
            setx PATH "%PATH%;C:\flutter\bin"
            cargo install flutter_rust_bridge_codegen --version 1.80.1 --features uuid --locked

    7、安装LLVM编译工具:https://github.com/llvm/llvm-project/releases/download/llvmorg-20.1.7/LLVM-20.1.7-win64.exe
        选择第二个
        
    8、安装Python 3.13.5 语言:https://www.python.org/downloads/
        勾选 Add python.exe to PATH
        
    9、下载RustDesk源码(两个都要下):
        https://github.com/rustdesk/rustdesk
        https://github.com/rustdesk/hbb_common
        把hbb_common解压到*:\RustDesk\libs\里
        
    10、在RustDesk目录下以CMD执行如下命令补齐库
      cd "RustDesk目录"
      flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart --c-output ./flutter/macos/Runner/bridge_generated.h
      
    11、在RustDesk目录下以CMD执行编译命令
      cd "RustDesk目录"
      python build.py --portable --flutter --skip-portable-pack




//----------修改文档.txt--------------//

置入中继服务器IP及Key:
    定位文件:RustDesk\libs\hbb_common\src\config.rs
    搜:rs-ny.rustdesk.com
    改成你的服务器IP,下面的RS_PUB_KEY改成服务器的Key


去掉官方的API接口
    定位文件:RustDesk\src\common.rs
    搜:https://admin.rustdesk.com
    改成空
    
    
删除地址簿、可访问的设备
    定位文件:RustDesk\flutter\lib\models\peer_tab_model.dart
    删:'Address book',
    删:'Accessible devices',
    删:IconFont.addressBook,
    删:IconFont.deviceGroupFill,
    删:!(bind.isDisableAb() || bind.isDisableAccount()),
    删:!(bind.isDisableGroupPanel() || bind.isDisableAccount()),
    将:static const int maxTabCount = 5;
    改:static const int maxTabCount = 3;
    
    
去掉底部“如果需要更快连接速度,你可以选择自建服务器”
    定位文件:RustDesk\flutter\lib\desktop\pages\connection_page.dart
    搜:translate('setup_server_tip'),
    删:
                child: Row(
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: [
                    Text(', ', style: TextStyle(fontSize: em)),
                    Flexible(
                      child: InkWell(
                        onTap: onUsePublicServerGuide,
                        child: Row(
                          children: [
                            Flexible(
                              child: Text(
                                translate('setup_server_tip'),
                                style: TextStyle(
                                    decoration: TextDecoration.underline,
                                    fontSize: em),
                              ),
                            ),
                          ],
                        ),
                      ),
                    )
                  ],
                ),
                
                
删掉设置里的账户
    定位文件:RustDesk\flutter\lib\desktop\pages\desktop_setting_page.dart
    搜:if (!bind.isDisableAccount()) SettingsTabKey.account,
    删:if (!bind.isDisableAccount()) SettingsTabKey.account,
    
    
删掉设置里的关于
    定位文件:RustDesk\flutter\lib\desktop\pages\desktop_setting_page.dart
    搜:SettingsTabKey.about,
    删:SettingsTabKey.about,
    
    
删除标题栏的设置按钮
    定位文件:RustDesk\flutter\lib\desktop\pages\desktop_tab_page.dart
    搜:Widget build(BuildContext context) {
    删:
                  tail: Offstage(
                    offstage: bind.isIncomingOnly() || bind.isDisableSettings(),
                    child: ActionIcon(
                      message: 'Settings',
                      icon: IconFont.menu,
                      onTap: DesktopTabPage.onAddSetting,
                      isClose: false,
                    ),
                  ),
                  
                  
删除一次性密码中的设置按钮
    定位文件:RustDesk\flutter\lib\desktop\pages\desktop_home_page.dart
    搜:message: translate('Change Password'),
    删:
                          if (!bind.isDisableSettings())
                            InkWell(
                              child: Tooltip(
                                message: translate('Change Password'),
                                child: Obx(
                                  () => Icon(
                                    Icons.edit,
                                    color: editHover.value
                                        ? textColor
                                        : Color(0xFFDDDDDD),
                                    size: 22,
                                  ).marginOnly(right: 8, top: 4),
                                ),
                              ),
                              onTap: () => DesktopSettingPage.switch2page(
                                  SettingsTabKey.safety),
                              onHover: (value) => editHover.value = value,
                            ),
                            
                            
删除你的桌面下面ID旁边的设置
    定位文件:RustDesk\flutter\lib\desktop\pages\desktop_home_page.dart
    搜:Widget buildPopupMenu(BuildContext context) {
    将:
                Widget buildPopupMenu(BuildContext context) {
                  final textColor = Theme.of(context).textTheme.titleLarge?.color;
                  RxBool hover = false.obs;
                  return InkWell(
                    onTap: DesktopTabPage.onAddSetting,
                    child: Tooltip(
                      message: translate('Settings'),
                      child: Obx(
                        () => CircleAvatar(
                          radius: 15,
                          backgroundColor: hover.value
                              ? Theme.of(context).scaffoldBackgroundColor
                              : Theme.of(context).colorScheme.background,
                          child: Icon(
                            Icons.more_vert_outlined,
                            size: 20,
                            color: hover.value ? textColor : textColor?.withOpacity(0.5),
                          ),
                        ),
                      ),
                    ),
                    onHover: (value) => hover.value = value,
                  );
                }
    改为:
    Widget buildPopupMenu(BuildContext context) {
        return Container();
      }
                            
                            
删除主页上的整个含【最近访问过、收藏、已发现、地址簿、可访问的设备】
    定位文件:RustDesk\flutter\lib\desktop\pages\connection_page.dart
    搜:final isOutgoingOnly = bind.isOutgoingOnly();
    删:
        Divider().paddingOnly(right: 12),
        Expanded(child: PeerTabPage()),
        
        
删除主页上控制远程桌面
    定位文件:RustDesk\flutter\lib\desktop\pages\connection_page.dart
    搜:final isOutgoingOnly = bind.isOutgoingOnly();
    删:
              children: [
                Row(
                  children: [
                    Flexible(child: _buildRemoteIDTextField(context)),
                  ],
                ).marginOnly(top: 22),
                SizedBox(height: 12),
              ],
              
              
加上自定义Logo(必须先删除以上两个方法即:删除最近访问过、收藏、已发现、地址簿、可访问的设备、删除控制远程桌面)
    定位文件:RustDesk\flutter\lib\desktop\pages\connection_page.dart
    搜:final isOutgoingOnly = bind.isOutgoingOnly();
    在”child: Column(“和”).paddingOnly(left: 12.0)),“之中添加以下代码:
                children: [
                Expanded(
                  child: Center(
                    child: Image.asset(
                      'assets/rustdesk.png',
                      width: 399, 
                      height: 106, 
                      fit: BoxFit.contain,
                    ),
                  ),
                ),
              ],
    图片文件放到RustDesk\flutter\assets中并改名:rustdesk.png
      
      
删掉设置里的网络-ID/中继服务器
    定位文件:RustDesk\flutter\lib\desktop\pages\desktop_setting_page.dart
    搜:title: 'ID/Relay Server',
    删:
                  if (!hideServer)
                    listTile(
                      icon: Icons.dns_outlined,
                      title: 'ID/Relay Server',
                      onTap: () => showServerSettings(gFFI.dialogManager),
                    ),
                  if (!hideServer && (!hideProxy || !hideWebSocket))
                    Divider(height: 1, indent: 16, endIndent: 16),
                    
                    
删除主页上的临时连接密码
    定位文件:RustDesk\flutter\lib\desktop\pages\desktop_home_page.dart
    搜:buildPasswordBoard2(BuildContext context, ServerModel model) {
    将:buildPasswordBoard2(BuildContext context, ServerModel model)  
    这个函数改为:
    buildPasswordBoard2(BuildContext context, ServerModel model) {
        return Container();
      }
      
      
将设置里的 常规-启用UDP打洞 默认打勾
    定位文件:RustDesk\libs\hbb_common\src\config.rs
    搜:Config::load_::<LocalConfig>("_local")
    改:let mut config = Config::load_::<LocalConfig>("_local");
    然后在下一行新增:
    let mut store = false;
    
    if !config.options.contains_key("enable-udp-punch") {
      config.options.insert("enable-udp-punch".to_string(), "Y".to_string());
      store = true;
    }
    
    if store {
      onfig.store();
    }
    config
    
    
将设置里的 常规-主题 改为默认主题为暗黑
    定位:RustDesk\libs\hbb_common\src\config.rs
    搜:let mut config = Config::load_::<LocalConfig>("_local");
    在下俩行新增:
            if !config.options.contains_key("theme") {
                config.options.insert("theme".to_string(), "dark".to_string());
                store = true;
            }
    注意:默认您已经改了上面的“启用UDP打洞”
    如果没改,自行把 Config::load_::<LocalConfig>("_local") 改 let mut config = Config::load_::<LocalConfig>("_local");
    并在上面的代码末尾加上config
    具体参考“将设置里的 常规-启用UDP打洞 默认打勾”
    
    
将设置里的 常规-启动时检查软件更新 默认去勾
    定位:RustDesk\libs\hbb_common\src\config.rs
    搜:let mut config = Config::load_::<LocalConfig>("_local");
    在下俩行新增:
    if !config.options.contains_key("enable-check-update") {
    config.options.insert("enable-check-update".to_string(), "N".to_string());
    store = true;
    }
    注意:默认您已经改了上面的“启用UDP打洞”
    如果没改,自行把 Config::load_::<LocalConfig>("_local") 改 let mut config = Config::load_::<LocalConfig>("_local");
    并在上面的代码末尾加上config
    具体参考“将设置里的 常规-启用UDP打洞 默认打勾”
    
    
将设置里的 常规-启用 IPv6 P2P 连接 默认打勾
    定位文件:RustDesk\libs\hbb_common\src\config.rs
    搜:let mut config = Config::load_::<LocalConfig>("_local");
    在下俩行新增:
            if !config.options.contains_key("enable-ipv6-punch") {
                config.options.insert("enable-ipv6-punch".to_string(), "Y".to_string());
                store = true;
            }
    注意:默认您已经改了上面的“启用UDP打洞”
    如果没改,自行把 Config::load_::<LocalConfig>("_local") 改 let mut config = Config::load_::<LocalConfig>("_local");
    并在上面的代码末尾加上config
    具体参考“将设置里的 常规-启用UDP打洞 默认打勾”
    
    
将设置里的 安全-拒绝局域网发现 默认打勾
    定位文件:RustDesk\libs\hbb_common\src\config.rs
    搜:let mut config = Config::load_::<Config2>("2");
    在下两行新增:
            if !config.options.contains_key("enable-lan-discovery") {
                config.options.insert("enable-lan-discovery".to_string(), "N".to_string());
                store = true;
            }
            
            
将设置里的 安全-允许远程修改配置 默认打勾
    定位文件:RustDesk\libs\hbb_common\src\config.rs
    搜:let mut config = Config::load_::<Config2>("2");
    在下两行新增:
            if !config.options.contains_key("allow-remote-config-modification") {
                config.options.insert("allow-remote-config-modification".to_string(), "Y".to_string());
                store = true;
            }
            
            
将设置里的 安全-使用PIN码解锁设置 默认打勾
    定位文件:RustDesk\libs\hbb_common\src\config.rs
    搜:config.unlock_pin = unlock_pin;
    在下两行新增:
    if config.unlock_pin.is_empty() {
                config.unlock_pin = "!!!加密后的PIN码!!!".to_string();
                store = true;
            }
    注:PIN码是经过加密的才能填进去,怎么加密?先在RustDesk软件里设置一个PIN码
    然后打开配置文件C:\Users\当前Windows账户\AppData\Roaming\RustDesk\config\RustDesk2.toml
    把其中的unlock_pin = '1V8AS4/+EWF84A85WD4AW=='(假设) 把加密后的PIN码“1V8AS4/+EWF84A85WD4AW==”复制出来填进去
    
    
将设置里的【安全-密码】设置默认的固定密码
    1、定位文件:RustDesk\libs\hbb_common\src\config.rs
        搜:config.unlock_pin = unlock_pin;
        在下两行新增:
                if !config.options.contains_key("trusted_devices") {
                    config.options.insert("trusted_devices".to_string(), "!!!加密后的密码!!!".to_string());
                    config.store();
                }
        注:密码是经过加密的才能填进去,怎么加密?先在RustDesk软件里的设置一个密码
        然后打开配置文件C:\Users\当前Windows账户\AppData\Roaming\RustDesk\config\RustDesk2.toml
        把其中的trusted_devices = '1V8AS4/+EWF84A85WD4AW=='(假设) 把加密后的密码“1V8AS4/+EWF84A85WD4AW==”复制出来填进去
        
    2、搜:log::error!("Failed to generate new id");
        在3个“}”后新增代码
        if config.password.is_empty() {
                    config.password = "!!!加密后的密码!!!".to_string();
                    store = true;
                }
        注:密码是经过加密的才能填进去,怎么加密?先在RustDesk软件里的设置一个密码
        然后打开配置文件C:\Users\当前Windows账户\AppData\Roaming\RustDesk\config\RustDesk.toml
        把其中的password = '1V8AS4/+EWF84A85WD4AW=='(假设) 把加密后的密码“1V8AS4/+EWF84A85WD4AW==”复制出来填进去
        
        
将设置里的【安全-密码】切换成【使用固定密码】方式
    定位文件:RustDesk\libs\hbb_common\src\config.rs
    搜:let mut config = Config::load_::<Config2>("2");
    在下两行新增:
            if !config.options.contains_key("verification-method") {
                config.options.insert("verification-method".to_string(), "use-permanent-password".to_string());
                store = true;
            }
            
            
将设置里的【安全-密码】改为成【只允许密码访问】方式
    定位文件:RustDesk\libs\hbb_common\src\config.rs
    搜:let mut config = Config::load_::<Config2>("2");
    在下两行新增:
            if !config.options.contains_key("approve-mode") {
                config.options.insert("approve-mode".to_string(), "password".to_string());
                store = true;
            }


部署教程.txt

修改文档.txt

RustDesk打包模板.zip


返回列表

上一篇:[节目编排] 年会节目编排和播放的工具

没有最新的文章了...

相关文章

[远程打印] 完美解决共享打印机11b错误,采用TCP的共享打印工具

[远程打印] 完美解决共享打印机11b错误,采用TCP的共享打印工具

不知道这个工具能不能给人帮上忙因为有点鸡肋:哪个地方鸡肋呢,电脑设置开机密码后在开机锁屏状态就不能正常使用了如果是进入桌面在锁屏就可以用,但是开机的锁屏就没法用详我细细道来:我本是将打印服务作为Win...

[过时项目]哔哩哔哩互动姬,互动直播好帮手

[过时项目]哔哩哔哩互动姬,互动直播好帮手

注:此工具开发于2021年,目前已停止更新且不在维护2020年的时候,互动直播玩法才刚刚初露苗头,彼时的B站的互动直播间不超过5个当时的我也想参与一下,于是开发了互动直播五子棋、中国象棋。反响还不错但...

[锁屏工具] Windows桌面锁屏工具,挂机锁

[锁屏工具] Windows桌面锁屏工具,挂机锁

这又是我作为医院信息科中所使用到的小工具了起因是医院里有某个挂号系统极为垃圾,数据库采用的是Windows用户名登录的。最主要是写死到程序里,还不能设置。也就是说服务器不能设置密码,使用的客户机也不能...

[节目编排] 年会节目编排和播放的工具

[节目编排] 年会节目编排和播放的工具

今年年初,继疫情之后。公司打算办一场年会。也是今年的一个总结,年会上免不了表演节目、玩小游戏、还有优秀员工的颁奖。找到酒店之后,就定了酒店最大的礼堂。在年会的前一天,公司开始进入酒店进行彩排。彩排必然...

[U盘打印]离线断网的打印工具

[U盘打印]离线断网的打印工具

本工具怎么说呢,说是用的上,但是好像用处也不大。起因是我在医院信息科工作,但是医院每一个办公室不一定都有网,也不是每一台设备都配备了打印机。就比如说医院的病房,一般是没有内网的,更不用说病房配备打印机...

评论列表

jmdbd
2025-11-17 03:57:35

求更新最新的固定密码修改方法。

LeoJunLee
2025-12-26 20:20:00

666感谢分享省去很多时间

cmth
2026-01-15 10:23:12

666很有帮助

spark
2026-01-21 14:55:22

大佬有几个地方需要求证一下,文章中219行 少了一个c , 是config,不然编译会出错,另外 config.unlock_pin = "!!!加密后的PIN码!!!".to_string(); 这个加pin码这个,我试了把加密码的pin 码放到config.rs然后编译,客户端安装到其它电脑上后无法用PIN解锁,每个机器的PIN码都不一样,但是取加密码的机器没问题,估计这个PIN码有其它验证加密。

spark
2026-01-22 14:04:48

config.rs修改 打开远程修改,关闭局域网发现,强制PIN码
impl Config2 {
fn load() -˃ Config2 {
let mut config = Config::load_::("2");
let mut store = false;
if !config.options.contains_key("enable-lan-discovery") {
config.options.insert("enable-lan-discovery".to_string(), "N".to_string());
store = true;
}
if !config.options.contains_key("allow-remote-config-modification") {
config.options.insert("allow-remote-config-modification".to_string(), "Y".to_string());
store = true;
}
// ==== 核心修改点:强制覆盖 unlock_pin 为明文 123456 ====
if config.unlock_pin != "abcd" {
config.unlock_pin = "abcd".to_string(); // 硬编码明文 PIN
store = true; // 强制触发存储
}
if let Some(mut socks) = config.socks {
let (password, _, store2) =
decrypt_str_or_original(&socks.password, PASSWORD_ENC_VERSION);
socks.password = password;

spark 回复:
班门弄斧,给大佬的修改调整了一下,把PIN强制明文,经测试可以用,小伙伴们可以少走点弯路。
2026-01-22 14:06:28
spark 回复:
把里面的两个abcd换成你想要的PIn码就行
2026-01-22 14:07:37
https://www.cocibilin.cn/
2026-03-28 18:05:49

拿走喽

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。