首页 > 数据库 >c# 利用数据库将程序加密隐藏?

c# 利用数据库将程序加密隐藏?

时间:2023-08-15 21:00:35浏览次数:27  
标签:files 加密 string c# 数据库 LiteDB var new

下面将介绍如何通过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<MethodInfo>();

        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 <StartupObject> project property.");
            }
            FindMainMethodCandidates(typeInfo, candidates);
        }
        else
        {
            foreach (var type in assembly
                         .DefinedTypes
                         .Where(t => t.IsClass)
                         .Where(t => t.GetCustomAttribute<CompilerGeneratedAttribute>() 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<MethodInfo> 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<FileAssembly>("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<FileAssembly>("files");
    col.InsertBulk(files);
}

// 实现一个方法,扫描指定目录下所有文件和子目录,返回一个集合。
List<FileAssembly> ScanDirectory(string path)
{
    var files = new List<FileAssembly>();
    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
{
    /// <summary>
    /// 文件名
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// 文件的内容
    /// </summary>
    public byte[] Bytes { get; set; }
}

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

<Project Sdk="Microsoft.NET.Sdk.Web">

    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net7.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
    </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

 

出处:https://www.cnblogs.com/hejiale010426/p/17631103.html

标签:files,加密,string,c#,数据库,LiteDB,var,new
From: https://www.cnblogs.com/mq0036/p/17632423.html

相关文章

  • 网页设计与网站建设连接数据库
    网页设计与网站建设连接数据库是实现动态网站的重要环节。通过连接数据库,网站可以实现用户数据的存储和读取、动态内容的生成和更新、用户交互的实现等功能。本文将介绍网页设计与网站建设连接数据库的基本步骤和要点。首先,选择合适的数据库管理系统。常见的数据库管理系统包括MyS......
  • Tree Distances I
    TreeDistancesI思路先考虑只算节点\(1\)的答案,我们发现如果要每个节点都这么算一次的话,绝对会我们发现,这种算法的瓶颈在于必须要每个节点都算一遍,而每算一遍都需要\(O(n)\),所以才会超时,那么可以思考如何快速的求出答案(总共\(O(1)\)是不肯能的,别妄想了),对于相连的两个点,似......
  • DACTF 2023 七月赛 websever
    解题过程IDA打开,函数很多,而且全是sub_没有符号,查看下字符串,看到了/flag/check,还有很多oatpp3的字符串,查了下,这是个C++的web库和名字很符合,先编译一份,参考[] https://blog.csdn.net/qq_44519484/article/details/123250415 编译完使用IDA打开,然后bindiff导入,全选导入符号......
  • cbblogs博客导出为PDF
    vscode安装这个插件:名字:博客园cnblogs客户端地址:https://marketplace.visualstudio.com/items?itemName=cnblogs.vscode-cnb教程看上面网址就行,安装完成登录后,右键文章有"导出PDF"选项,也可以全选当前页所有文章"导出PDF"。 ......
  • csp模拟<反思>3
    csp模拟21ARC141F首先上结论:如果一个串能用其他串消完那么这个串可以删去;剩下的串中有\(S_i\)是\(S_j\)的子串,那么答案是Yes;如果存在\(S_i=A+B\)和\(S_j=B+C\),且\(A\neqC\)则答案是Yes.第一部分:如何判断一个串\(S_i\)是否能被消完。建AC自动机,预处理\(ma......
  • R语言实现MCMC中的Metropolis–Hastings算法与吉布斯采样|附代码数据
    原文链接:http://tecdat.cn/?p=3772原文出处:拓端数据部落公众号 最近我们被客户要求撰写关于MCMC的研究报告,包括一些图形和统计输出。创建测试数据第一步,我们创建一些测试数据,用来拟合我们的模型。我们假设预测变量和因变量之间存在线性关系,所以我们用线性模型并添加一些噪音......
  • 【源码研读】MLIR Dialect 分层设计
    以「疑问-求解」的形式来组织调研,此处记录整个过程。1.MLIR中的Dialect是「分层」设计的么?先问是不是,再谈为什么。从LLVM社区可以看出,至少在做Codegen时,是采用了「分层」的思想来逐步Lowering的(具体见下图)。MLIR为编译优化而生,分层Lowering是比较符合设计直觉......
  • C++ STL iota 使用方法
    C++STLiota用法介绍c++11引入的函数,C++20后小更新使用#include<numeric>头文件引用功能std::iota[aɪ'otə]输入一个值和一个容器的开始地址和结束地址,对该容器进行自增填充。Example点击查看代码#include<numeric>#include<vector>usingnamespacestd;intma......
  • 2021 ICPC 上海 DEHI
    2021ICPC上海DEHI链接:The2021ICPCAsiaShanghaiRegionalProgrammingContestD.StrangeFractions题意:给你\(p,q\),让你找正整数\(a,b\),使得\(\dfrac{p}{q}=\dfrac{a}{b}+\dfrac{b}{a}\)。如果不存在,输出\(0\)\(0\)。思路:简单数学。推柿子+\(\gcd\)因为有\(\dfrac{......
  • docker部署jenkins
    开始安装1.启动docker,下载Jenkins镜像文件dockerpulljenkins/jenkins2.创建Jenkins挂载目录并授权权限(我们在服务器上先创建一个jenkins工作目录/var/jenkins_mount,赋予相应权限,稍后我们将jenkins容器目录挂载到这个目录上,这样我们就可以很方便地对容器内的配置文件进行修......