.NET Reactor 混淆 C# 的序列化和反序列化存在的问题

.NET Reactor 混淆 C# 的序列化和反序列化存在的问题

1、使用二进制格式化器进行序列化和反序列化

1.1、定义可序列化对象

csharp 复制代码
[Serializable]  // 对象可序列化标记
 public class AppConfig
{
            /// <summary>程序开发者</summary>
            public string RLStudio { get; set; } = "雨水工作室";
            /// <summary>ADCP项目MMT文件</summary>
            public string AdcpMmtPathFile { get; set; } = Environment.CurrentDirectory;
            /// <summary>ADCP项目目录</summary>
            public string AdcpProjectPath { get; set; } = Environment.CurrentDirectory;
            /// <summary>长江航道局水位数据文件</summary>
            public string CJHDJDataPathFile { get; set; } = Environment.CurrentDirectory;
            /// <summary>Hypack 数据文件</summary>
            public string HypackPathFile { get; set; } = Environment.CurrentDirectory;
            /// <summary>YAC9900 SD卡数据文件</summary>
            public string YAC9900SdPathFile { get; set; } = Environment.CurrentDirectory;
            /// <summary>RTK 数据文件</summary>
            public string RtkDataPathFile { get; set; } = Environment.CurrentDirectory;
            //省略......
}

1.2、使用对象的序列化和反序列化保存和读取配置文件

csharp 复制代码
using System.Runtime.Serialization.Formatters.Binary;
partial class HypackDataProce : Form
{   
        AppConfig appConfig = new AppConfig();
        private void HypackDataProce_Load(object sender, EventArgs e)
        {
            string ConfigFile = Application.StartupPath + "\\config.cfg";

            if (File.Exists(ConfigFile))
            {
                try
                {
                    //创建二进制格式化器
                    BinaryFormatter formatter = new BinaryFormatter();

                    //创建文件流
                    using (FileStream fs = new FileStream(ConfigFile, FileMode.Open, FileAccess.Read, FileShare.Read))
                    {
                       appConfig = (AppConfig)formatter.Deserialize(fs);//调用序列化方法,获取配置
                    }
                }
                catch
                {
                }
            }
        }

       public void SaveAppConfig()
        {
            try
            {
               string ConfigFile = Application.StartupPath + "\\config.cfg";
               //创建二进制格式化器
               BinaryFormatter formatter = new BinaryFormatter();
               //创建文件流
               using (FileStream fs = new FileStream(ConfigFile, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
               {
                    formatter.Serialize(fs, appConfig);  //调用序列化方法,保存配置
               }
            }
            catch
            {
            }
        }
}

1.3、使用 .NET Reactor 混淆程序后,无法读取配置

没有混淆的程序,运行没有任何错误,使用 .NET Reactor 混淆程序后,无法读取配置,查看配置文件,与不混淆保存的配置文件存在很大的差别。

没有混淆时的配置文件,使用文本打开:

bash 复制代码
              FHypackDataProce, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null   )HypackDataProce.UserPublicClass+AppConfig   <RLStudio>k__BackingField <AdcpMmtPathFile>k__BackingField <AdcpProjectPath>k__BackingField"<CJHDJDataPathFile>k__BackingField<HypackPathFile>k__BackingField"<YAC9900SdPathFile>k__BackingField <RtkDataPathFile>k__BackingField(<MeasureParamMenuChecked>k__BackingField(<MeasurePlaneMenuChecked>k__BackingField,<MeasureDataSheetMenuChecked>k__BackingField*<MeasureProfileMenuChecked>k__BackingField"<MeasureParamWidth>k__BackingField#<MeasureParamHeight>k__BackingField!<MeasureParamLeft>k__BackingField <MeasureParamTop>k__BackingField&<MeasureDataSheetWidth>k__BackingField'<MeasureDataSheetHeight>k__BackingField%<MeasureDataSheetLeft>k__BackingField$<MeasureDataSheetTop>k__BackingField"<MeasurePlaneWidth>k__BackingField#<MeasurePlaneHeight>k__BackingField!<MeasurePlaneLeft>k__BackingField <MeasurePlaneTop>k__BackingField$<MeasureProfileWidth>k__BackingField%<MeasureProfileHeight>k__BackingField#<MeasureProfileLeft>k__BackingField"<MeasureProfileTop>k__BackingField                          闆ㄦ按宸ヤ綔瀹?   &F:\Source Code\HydroDatPro\bin\Release   &F:\Source Code\HydroDatPro\bin\Release   &F:\Source Code\HydroDatPro\bin\Release    8E:\2024澶ф柇闈鍗楀拃20240311\鍗楀拃涓柇闈0003.RAW   &F:\Source Code\HydroDatPro\bin\Release	   &F:\Source Code\HydroDatPro\bin\Release?         ?   4  ?  ~      ?  ?  ?      ?  ?  ?   h  

可以发现 PublicKeyToken=null ,HypackDataProce.UserPublicClass+AppConfig ,混淆后保存的配置文件,这 2 项内容也被混淆,可见 .NET Reactor 对二进制格式化器 BinaryFormatter 的序列化和反序列化存在漏洞。

C# 2017 net.framework 框架下,谁有二进制序列化和反序列化更好的方法呢?

2、改用 XML 进行序列化和反序列化避免混淆出错

2.1、定义对象

csharp 复制代码
 public class AppConfig
{
            /// <summary>程序开发者</summary>
            public string RLStudio { get; set; } = "雨水工作室";
            /// <summary>ADCP项目MMT文件</summary>
            public string AdcpMmtPathFile { get; set; } = Environment.CurrentDirectory;
            /// <summary>ADCP项目目录</summary>
            public string AdcpProjectPath { get; set; } = Environment.CurrentDirectory;
            /// <summary>长江航道局水位数据文件</summary>
            public string CJHDJDataPathFile { get; set; } = Environment.CurrentDirectory;
            /// <summary>Hypack 数据文件</summary>
            public string HypackPathFile { get; set; } = Environment.CurrentDirectory;
            /// <summary>YAC9900 SD卡数据文件</summary>
            public string YAC9900SdPathFile { get; set; } = Environment.CurrentDirectory;
            /// <summary>RTK 数据文件</summary>
            public string RtkDataPathFile { get; set; } = Environment.CurrentDirectory;
            //省略......
}

2.2、使用 XML 序列化和反序列化保存和读取配置文件

csharp 复制代码
using System.Xml.Serialization;
partial class HypackDataProce : Form
{   
        AppConfig appConfig = new AppConfig();
        private void HypackDataProce_Load(object sender, EventArgs e)
        {
            string ConfigFile = Application.StartupPath + "\\config.cfg";

            if (File.Exists(ConfigFile))
            {
                try
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(AppConfig));// 创建XmlSerializer实例,指定要反序列化的类型
                    using (FileStream fileStream = new FileStream(ConfigFile, FileMode.Open))
                    {
                        appConfig = (AppConfig)serializer.Deserialize(fileStream);// 反序列化 XML 到 AppConfig 对象
                    }
                }
                catch
                {
                }
            }
        }

       public void SaveAppConfig()
       {
            try
            {
               string ConfigFile = Application.StartupPath + "\\config.cfg";
               
               XmlSerializer serializer = new XmlSerializer(typeof(AppConfig));// 创建XmlSerializer实例,指定要反序列化的类型
               using (TextWriter writer = new StreamWriter(ConfigFile))
              {
                serializer.Serialize(writer, appConfig);
              }
           }
           catch
           {
           }
     }
}

2.3、使用 .NET Reactor 混淆程序后,读取程序配置正常

bash 复制代码
<?xml version="1.0" encoding="utf-8"?>
<AppConfig xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <RLStudio>雨水工作室</RLStudio>
  <AdcpMmtPathFile>F:\Source Code\HydroDatPro\bin\Release</AdcpMmtPathFile>
  <AdcpProjectPath>F:\Source Code\HydroDatPro\bin\Release</AdcpProjectPath>
  <CJHDJDataPathFile>F:\Source Code\HydroDatPro\bin\Release</CJHDJDataPathFile>
  <HypackPathFile>F:\Source Code\HydroDatPro\bin\Release</HypackPathFile>
  <YAC9900SdPathFile>F:\Source Code\HydroDatPro\bin\Release</YAC9900SdPathFile>
  <RtkDataPathFile>F:\Source Code\HydroDatPro\bin\Release</RtkDataPathFile>
  <MeasureParamMenuChecked>true</MeasureParamMenuChecked>
  <MeasurePlaneMenuChecked>true</MeasurePlaneMenuChecked>
  <MeasureDataSheetMenuChecked>true</MeasureDataSheetMenuChecked>
  <MeasureProfileMenuChecked>true</MeasureProfileMenuChecked>
  <MeasureParamWidth>216</MeasureParamWidth>
  <MeasureParamHeight>793</MeasureParamHeight>
  <MeasureParamLeft>0</MeasureParamLeft>
  <MeasureParamTop>180</MeasureParamTop>
  <MeasureDataSheetWidth>564</MeasureDataSheetWidth>
  <MeasureDataSheetHeight>1022</MeasureDataSheetHeight>
  <MeasureDataSheetLeft>1150</MeasureDataSheetLeft>
  <MeasureDataSheetTop>0</MeasureDataSheetTop>
  <MeasurePlaneWidth>436</MeasurePlaneWidth>
  <MeasurePlaneHeight>367</MeasurePlaneHeight>
  <MeasurePlaneLeft>483</MeasurePlaneLeft>
  <MeasurePlaneTop>0</MeasurePlaneTop>
  <MeasureProfileWidth>959</MeasureProfileWidth>
  <MeasureProfileHeight>662</MeasureProfileHeight>
  <MeasureProfileLeft>206</MeasureProfileLeft>
  <MeasureProfileTop>360</MeasureProfileTop>
</AppConfig>
相关推荐
SEO-狼术44 分钟前
Infragistics now supports .NET 10
pdf·.net
南無忘码至尊1 小时前
Unity学习90天-第2天-认识键盘 / 鼠标输入(PC)并实现WASD 移动,鼠标控制物体转向
学习·unity·c#·游戏开发
William_cl2 小时前
C# ASP.NET 分层架构实战:BLL (Service) 业务层从入门到封神(规范 + 避坑)
架构·c#·asp.net
喵叔哟2 小时前
7.【.NET10 实战--孢子记账--产品智能化】--API 文档迁移 — Swashbuckle → OpenAPI + Scalar
.net
无风听海2 小时前
.NET10之 HttpClient 使用指南
.net
qq_454245033 小时前
图数据标准化与智能去重框架:设计与实现解析
数据结构·架构·c#·图论
leonkay3 小时前
关于.NET中的队列理解
数据库·性能优化·.net·个人开发·设计规范·队列
CSharp精选营3 小时前
C# 如何减少代码运行时间:7 个实战技巧
性能优化·c#·.net·技术干货·实战技巧
hhh3u3u3u16 小时前
Visual C++ 6.0中文版安装包下载教程及win11安装教程
java·c语言·开发语言·c++·python·c#·vc-1
加号316 小时前
【C#】实现沃德普线光控制器通信控制(附完整源码)
开发语言·c#