软件试用 防破解 防软件调试(C# )

news2025/3/6 2:38:31

防破解&防软件调试 实现思路

这里采用C#语言为例:

  1. 获取网络北京时间:向百度发送 HTTP 请求,从响应头中提取日期时间信息,将其转换为本地时间。
  2. 记录试用开始时间:首次运行软件时,将获取的百度北京时间作为试用开始时间,并加密存储在本地文件中。
  3. 检查试用是否过期:每次运行软件时,再次获取百度北京时间,与存储的试用开始时间进行比较,判断试用是否过期。
  4. 防破解措施
    • 检查文件是否被篡改:通过计算文件的哈希值并与之前存储的哈希值进行比较,判断文件是否被修改。
    • 检查系统时间是否被篡改:比较当前获取的百度北京时间和系统时间,如果差异过大,则认为系统时间可能被篡改。
    • 软件代码混淆和加壳处理。(防破解 这条很重要,这条做不好,其他都是徒劳)。
    • 防软件调试。

using System;
using System.IO;
using System.Net;
using System.Security.Cryptography;
using System.Runtime.Serialization.Formatters.Binary;

class Program
{
    private static readonly string trialInfoFilePath = "trialInfo.dat";
    private static readonly string hashFilePath = "hash.dat";

    static void Main()
    {
        // 获取百度北京时间
        DateTime beijingTime = GetBeijingTimeFromBaidu();

        if (IsSystemTimeTampered(beijingTime))
        {
            Console.WriteLine("检测到系统时间被篡改,软件无法正常使用。");
            return;
        }

        if (IsTrialExpired(beijingTime))
        {
            Console.WriteLine("试用已到期,请购买正式版本。");
        }
        else
        {
            Console.WriteLine("当前北京时间:" + beijingTime);
            Console.WriteLine("软件仍在试用期限内。");
        }

        Console.ReadLine();
    }

    // 从百度获取北京时间
    private static DateTime GetBeijingTimeFromBaidu()
    {
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.baidu.com");
            request.Method = "HEAD";
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                string dateHeader = response.GetResponseHeader("Date");
                return DateTime.ParseExact(dateHeader, "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AssumeUniversal | System.Globalization.DateTimeStyles.AdjustToUniversal).ToLocalTime();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"获取北京时间时出错:{ex.Message},将使用本地时间。");
            return DateTime.Now;
        }
    }

    // 检查系统时间是否被篡改
    private static bool IsSystemTimeTampered(DateTime beijingTime)
    {
        TimeSpan difference = beijingTime - DateTime.Now;
        return Math.Abs(difference.TotalHours) > 1; // 允许 1 小时的误差
    }

    // 检查试用是否到期
    private static bool IsTrialExpired(DateTime currentTime)
    {
        DateTime startTrialTime;
        if (File.Exists(trialInfoFilePath))
        {
            if (IsFileTampered(trialInfoFilePath))
            {
                Console.WriteLine("检测到试用信息文件被篡改,软件无法正常使用。");
                return true;
            }

            using (FileStream fs = new FileStream(trialInfoFilePath, FileMode.Open))
            {
                BinaryFormatter formatter = new BinaryFormatter();
                startTrialTime = (DateTime)formatter.Deserialize(fs);
            }
        }
        else
        {
            // 首次运行,记录开始试用时间
            startTrialTime = currentTime;
            using (FileStream fs = new FileStream(trialInfoFilePath, FileMode.Create))
            {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(fs, startTrialTime);
            }
            SaveFileHash(trialInfoFilePath);
        }

        // 计算试用天数
        int trialDays = (currentTime - startTrialTime).Days;
        return trialDays >= 15;
    }

    // 检查文件是否被篡改
    private static bool IsFileTampered(string filePath)
    {
        if (!File.Exists(hashFilePath))
        {
            return true;
        }

        string storedHash = File.ReadAllText(hashFilePath);
        string currentHash = CalculateFileHash(filePath);

        return storedHash != currentHash;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2310307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【文献阅读】The Efficiency Spectrum of Large Language Models: An Algorithmic Survey

这篇文章发表于2024年4月 摘要 大语言模型(LLMs)的快速发展推动了多个领域的变革,重塑了通用人工智能的格局。然而,这些模型不断增长的计算和内存需求带来了巨大挑战,阻碍了学术研究和实际应用。为解决这些问题&…

OpenGL ES -> GLSurfaceView纹理贴图

贴图 XML文件 <?xml version"1.0" encoding"utf-8"?> <com.example.myapplication.MyGLSurfaceViewxmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height…

DE2115实现4位全加器和3-8译码器(FPGA)

一、配置环境 1、Quartus 18.1安装教程 软件&#xff1a;Quartus版本&#xff1a;Quartus 18.1语言&#xff1a;英文大小&#xff1a;5.78G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09; 下载通道①百度网盘丨64位下载…

【AI大模型】DeepSeek + Kimi 高效制作PPT实战详解

目录 一、前言 二、传统 PPT 制作问题 2.1 传统方式制作 PPT 2.2 AI 大模型辅助制作 PPT 2.3 适用场景对比分析 2.4 最佳实践与推荐 三、DeepSeek Kimi 高效制作PPT操作实践 3.1 Kimi 简介 3.2 DeepSeek Kimi 制作PPT优势 3.2.1 DeepSeek 优势 3.2.2 Kimi 制作PPT优…

run方法执行过程分析

文章目录 run方法核心流程SpringApplicationRunListener监听器监听器的配置与加载SpringApplicationRunListener源码解析实现类EventPublishingRunListener 初始化ApplicationArguments初始化ConfigurableEnvironment获取或创建环境配置环境 打印BannerSpring应用上下文的创建S…

面试-----每日一题

一、字节一面&#xff08;操作系统&#xff09; 什么是死锁&#xff1f;如何处理死锁问题&#xff1f; 死锁是指两个或两个以上的进程在执行过程中&#xff0c;由于竞争资源或者由于彼此通讯而造成的一种阻塞的现象&#xff0c;若无外力作用&#xff0c;它们都将无法推进下去。…

CentOS 7中安装Dify

Dify 是一个开源的 LLM 应用开发平台。其直观的界面结合了 AI 工作流、RAG 管道、Agent、模型管理、可观测性功能等&#xff0c;让您可以快速从原型到生产。尤其是我们本地部署DeepSeek等大模型时&#xff0c;会需要用到Dify来帮我们快捷的开发和应用。 大家可以参考学习它的中…

qt-C++笔记之Linux下Qt环境变量设置及与QtCreator的关系

qt-C++笔记之Linux下Qt环境变量设置及与QtCreator的关系 code review! 文章目录 qt-C++笔记之Linux下Qt环境变量设置及与QtCreator的关系一.Qt关键的环境变量1.1.PATH1.2.LD_LIBRARY_PATH1.3.QML2_IMPORT_PATH二.若不手动设置这三个环境变量2.1.PATH 的默认路径2.2.LD_LIBRARY_…

Flutter 学习之旅 之 flutter 使用 carousel_slider 简单实现轮播图效果

Flutter 学习之旅 之 flutter 使用 carousel_slider 简单实现轮播图效果 目录 Flutter 学习之旅 之 flutter 使用 carousel_slider 简单实现轮播图效果 一、简单介绍 二、简单介绍 carousel_slider 三、安装 carousel_slider 四、简单案例实现 五、关键代码 一、简单介…

【JavaScript—前端快速入门】JavaScript 对象与函数

JavaScript 对象 1. JavaScripe 数组 创建数组的方式 使用 new 关键字创建 使用字面量方式创建 [常用] 注意&#xff0c;JavaScipt 不要求数组元素类型都相同&#xff1b; 数组操作 读&#xff1a;使用下标的方式访问数组元素&#xff08;从0开始) 保存代码&#xff0c;打开…

java中的局部变量

文章目录 一、定义二、作用域和作用位置三、声明周期和初始化四、内存管理五、Java内存区域划分六、例子 一、定义 在java中&#xff0c;局部变量指在方法、构造方法、代码块&#xff08;如{}包裹的语句块&#xff09;内部声明的变量 class work {{int a 10;}public work() {i…

(IDE接入DeepSeek)简单了解DeepSeek接入辅助开发与本地部署建议

重点&#xff1a;IDE接入DeepSeek是否收费 收费&#xff01; 本文章主要是为了给小白避雷&#xff0c;目前很多文章告诉大家怎么接入DeepSeek&#xff0c;但是并未告知大家是否收费。如果是想白嫖的&#xff0c;就可以不用去接入了。 一、引言 最近爆火的AI人工智能工具DeepSe…

【算法学习之路】5.贪心算法

贪心算法 前言一.什么是贪心算法二.例题1.合并果子2.跳跳&#xff01;3. 老鼠和奶酪 前言 我会将一些常用的算法以及对应的题单给写完&#xff0c;形成一套完整的算法体系&#xff0c;以及大量的各个难度的题目&#xff0c;目前算法也写了几篇&#xff0c;题单正在更新&#xf…

0x03 http协议和分层架构

HTTP协议 简介 Hyper Text Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则 http协议基于TCP协议&#xff1a;面向连接&#xff0c;安全基于请求-响应模型&#xff1a;一次请求对应一次响应HTTP协议是无状态的协议&#xff…

智能合约安全指南 [特殊字符]️

智能合约安全指南 &#x1f6e1;️ 1. 安全基础 1.1 常见漏洞类型 重入攻击整数溢出权限控制缺陷随机数漏洞前后运行攻击签名重放 1.2 安全开发原则 最小权限原则检查-生效-交互模式状态机安全失败保护机制 2. 重入攻击防护 2.1 基本防护模式 contract ReentrancyGuarde…

【Python项目】基于Python的书籍售卖系统

【Python项目】基于Python的书籍售卖系统 技术简介&#xff1a;采用Python技术、MYSQL数据库等实现。 系统简介&#xff1a;书籍售卖系统是一个基于B/S结构的在线图书销售平台&#xff0c;主要分为前台和后台两部分。前台系统功能模块分为&#xff08;1&#xff09;用户中心模…

【Linux】【网络】UDP打洞-->不同子网下的客户端和服务器通信(未成功版)

【Linux】【网络】UDP打洞–>不同子网下的客户端和服务器通信&#xff08;未成功版&#xff09; 上次说基于UDP的打洞程序改了五版一直没有成功&#xff0c;要写一下问题所在&#xff0c;但是我后续又查询了一些资料&#xff0c;成功实现了&#xff0c;这次先写一下未成功的…

(1)udp双向通信(2)udp实现文件复制(3)udp实现聊天室

一.udp双向通信 1.fork进程实现双向通信 【1】head.h 【2】client客户端 &#xff08;1&#xff09;父进程从键盘获取字符串 &#xff08;2&#xff09;输入quit&#xff0c;发送结束子进程信号 &#xff08;3&#xff09;exit退出父进程 &#xff08;1&#xff09;子进程接受…

c高级第五天

1> 在终端提示输入一个成绩&#xff0c;通过shell判断该成绩的等级 [90,100] : A [80, 90) : B [70, 80) : C [60, 70) : D [0, 60) : 不及格 #!/bin/bash# 提示用户输入成绩 read -p "请输入成绩&#xff08;0-100&#xff09;&#xff1a;" score# 判断成…

【JQuery—前端快速入门】JQuery 操作元素

JQuery 操作元素 1. 获取/修改元素内容 三个简单的获取元素的方法&#xff1a; 这三个方法即可以获取元素的内容&#xff0c;又可以设置元素的内容. 有参数时&#xff0c;就进行元素的值设置&#xff0c;没有参数时&#xff0c;就进行元素内容的获取. 接下来&#xff0c;我们需…