• c# 如何将程序加密隐藏?


    下面将介绍如何通过LiteDB将自己的程序进行加密,首先介绍一下LiteDB

    LiteDB

    LiteDB是一个轻量级的嵌入式数据库,它是用C#编写的,适用于.NET平台。它的设计目标是提供一个简单易用的数据库解决方案,可以在各种应用程序中使用。

    LiteDB使用单个文件作为数据库存储,这个文件可以在磁盘上或内存中。它支持文档存储模型,类似于NoSQL数据库,每个文档都是一个JSON格式的对象。这意味着你可以存储和检索任意类型的数据,而不需要预定义模式。

    LiteDB提供了一组简单的API来执行各种数据库操作,包括插入、更新、删除和查询。它还支持事务,可以确保数据的一致性和完整性。

    LiteDB还提供了一些高级功能,如索引、全文搜索和文件存储。索引可以加快查询的速度,全文搜索可以在文本数据中进行关键字搜索,文件存储可以将文件直接存储在数据库中。

    LiteDB的优点包括易于使用、轻量级、快速和可嵌入性。它的代码库非常小,可以很容易地集成到你的应用程序中。此外,它还具有跨平台的能力,可以在Windows、Linux和Mac等操作系统上运行。

    总之,LiteDB是一个简单易用的嵌入式数据库,适用于各种应用程序。它提供了一组简单的API来执行数据库操作,并支持一些高级功能。如果你需要一个轻量级的数据库解决方案,可以考虑使用LiteDB。

    加密封装

    创建LiteDB.Service的WebApi项目。

    右键发布:

    创建控制台LiteDB.Launch项目。

    EntryPointDiscoverer.cs 用于寻找执行方法。

    internal class EntryPointDiscoverer
    {
        public static MethodInfo FindStaticEntryMethod(Assembly assembly, string? entryPointFullTypeName = null)
        {
            var candidates = new List();
    
            if (!string.IsNullOrWhiteSpace(entryPointFullTypeName))
            {
                var typeInfo = assembly.GetType(entryPointFullTypeName, false, false)?.GetTypeInfo();
                if (typeInfo == null)
                {
                    throw new InvalidProgramException($"Could not find '{entryPointFullTypeName}' specified for Main method. See  project property.");
                }
                FindMainMethodCandidates(typeInfo, candidates);
            }
            else
            {
                foreach (var type in assembly
                             .DefinedTypes
                             .Where(t => t.IsClass)
                             .Where(t => t.GetCustomAttribute() is null))
                {
                    FindMainMethodCandidates(type, candidates);
                }
            }
    
            string MainMethodFullName()
            {
                return string.IsNullOrWhiteSpace(entryPointFullTypeName) ? "Main" : $"{entryPointFullTypeName}.Main";
            }
    
            if (candidates.Count > 1)
            {
                throw new AmbiguousMatchException(
                    $"Ambiguous entry point. Found multiple static functions named '{MainMethodFullName()}'. Could not identify which method is the main entry point for this function.");
            }
    
            if (candidates.Count == 0)
            {
                throw new InvalidProgramException(
                    $"Could not find a static entry point '{MainMethodFullName()}'.");
            }
    
            return candidates[0];
        }
    
        private static void FindMainMethodCandidates(TypeInfo type, List candidates)
        {
            foreach (var method in type
                         .GetMethods(BindingFlags.Static |
                                     BindingFlags.Public |
                                     BindingFlags.NonPublic)
                         .Where(m =>
                             string.Equals("Main", m.Name, StringComparison.OrdinalIgnoreCase)))
            {
                if (method.ReturnType == typeof(void)
                    || method.ReturnType == typeof(int)
                    || method.ReturnType == typeof(Task)
                    || method.ReturnType == typeof(Task<int>))
                {
                    candidates.Add(method);
                }
            }
        }
    }
    

    然后打开Program.cs文件,请注意修改SaveDb的参数为自己项目打包的地址

    // 用于打包指定程序。
    SaveDb(@"E:\Project\LiteDB-Application\LiteDB.Service\bin\Release\net7.0\publish");
    
    // 打开db
    var db = new LiteDatabase("Launch.db");
    
    // 打开表。
    var files = db.GetCollection("files");
    
    // 接管未找到的程序集处理
    AppDomain.CurrentDomain.AssemblyResolve += (sender, eventArgs) =>
    {
        try
        {
            var name = eventArgs.Name.Split(",")[0];
            if (!name.EndsWith(".dll"))
            {
                name += ".dll";
            }
    
            var file = files.FindOne(x => x.Name == name);
    
            return file != null ? Assembly.Load(file.Bytes) : default;
        }
        catch (Exception)
        {
            return default;
        }
    };
    
    // 启动程序。
    StartServer("LiteDB.Service", new string[] { });
    
    Console.ReadKey();
    
    void StartServer(string assemblyName, string[] args)
    {
        var value = files!.FindOne(x => x.Name == assemblyName + ".dll");
        var assembly = Assembly.Load(value!.Bytes);
    
        var entryPoint = EntryPointDiscoverer.FindStaticEntryMethod(assembly);
    
        try
        {
            var parameters = entryPoint.GetParameters();
            if (parameters.Length != 0)
            {
                var parameterValues = parameters.Select(p =>
                        p.ParameterType.IsValueType ? Activator.CreateInstance(p.ParameterType) : null)
                    .ToArray();
                entryPoint.Invoke(null, parameterValues);
            }
            else
            {
                entryPoint.Invoke(null, null);
            }
        }
        catch (Exception e)
        {
            
        }
    }
    
    
    // 扫描指定目录下所有文件和子目录,保存到LiteDB数据库中。
    void SaveDb(string path)
    {
        var files = ScanDirectory(path);
        using var db = new LiteDatabase("Launch.db");
        var col = db.GetCollection("files");
        col.InsertBulk(files);
    }
    
    // 实现一个方法,扫描指定目录下所有文件和子目录,返回一个集合。
    List ScanDirectory(string path)
    {
        var files = new List();
        var dir = new DirectoryInfo(path);
        var fileInfos = dir.GetFiles("*", SearchOption.AllDirectories);
        foreach (var fileInfo in fileInfos)
        {
            var file = new FileAssembly
            {
                Name = fileInfo.Name,
                Bytes = File.ReadAllBytes(fileInfo.FullName)
            };
            files.Add(file);
        }
    
        return files;
    }
    
    class FileAssembly
    {
        /// 
        /// 文件名
        /// 
        public string Name { get; set; }
    
        /// 
        /// 文件的内容
        /// 
        public byte[] Bytes { get; set; }
    }
    

    点击LiteDB.Launch项目文件,添加LiteDB依赖,并且修改SDK为Microsoft.NET.Sdk.Web

    <Project Sdk="Microsoft.NET.Sdk.Web">
    
        <PropertyGroup>
            <OutputType>ExeOutputType>
            <TargetFramework>net7.0TargetFramework>
            <ImplicitUsings>enableImplicitUsings>
            <Nullable>enableNullable>
        PropertyGroup>
    
        <ItemGroup>
          <PackageReference Include="LiteDB" Version="5.0.17" />
        ItemGroup>
    
    Project>
    
    

    在启动项目的时候先将LiteDB.Service发布一下。然后修改SaveDb参数为发布的目录(会自动扫描所有文件打包到LiteDB的文件中。)

    然后启动项目;

    当我们启动了LiteDB.Launch以后在StartServer方法里面就会打开创建的LiteDB文件中搜索到指定的启动程序集。

    然后在AppDomain.CurrentDomain.AssemblyResolve中会将启动程序集缺少的程序集加载到域中。

    AppDomain.CurrentDomain.AssemblyResolve会在未找到依赖的时候触发的一个事件。

    在存储到LiteDB的时候可以对于存储的内容进行加密,然后在AppDomain.CurrentDomain.AssemblyResolve触发的时候将读取LiteDB的文件的内容的时候进行解密。

    结尾

    来自token的分享

    qq技术交流群:737776595

  • 相关阅读:
    低代码平台如何为企业降本增效
    三维天地助力实验室夯实完整质量体系管理
    sql6(Leetcode1387使用唯一标识码替换员工ID)
    含文档+PPT+源码等]精品基于Uniapp实现的美食APP[包运行成功]计算机毕业设计安卓项目源码
    Spring面向切面编程(AOP)
    【JavaScript】参考手册-String对象的3个属性和17个方法
    小琳AI课堂:MASS模型——革新自然语言处理的预训练技术
    【再识C进阶2(中)】详细介绍指针的进阶——函数指针数组、回调函数、qsort函数
    企业网络安全:威胁检测和响应 (TDR)
    海量数据处理
  • 原文地址:https://www.cnblogs.com/hejiale010426/p/17631103.html