吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 365|回复: 3
收起左侧

[经验求助] 求助 C# VMProtect 或 Agile.Net 使用示例

[复制链接]
allcec 发表于 2024-9-4 16:25
70吾爱币
本帖最后由 allcec 于 2024-9-8 03:47 编辑

麻烦各位大佬能否给一份 C# VMProtect 使用示例 我不是很懂 只需要限制时间和限制使用次数就可以 谢谢

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| allcec 发表于 2024-9-6 00:13
或者Agile.NET 添加授权限制时间 给力示例也i行 谢谢各位了,网上找不到一点教程 参考官方文档写一个示例代码 添加上日期总是没有效果
 楼主| allcec 发表于 2024-9-8 03:50
[C#] 纯文本查看 复制代码
    internal class Agile
    {
        // 注册表路径和键名,用于硬件锁验证
        static string registryPath = @"SOFTWARE\Tecnomatix\TUNE\AdminTools\Options\EMS";
        static string registryKeyName = "WinVmp"; // 假设注册表键的名字是 "HardwareInfo"

        // 静态缓存变量,用于保存验证后的结果,避免重复验证
        private static bool? _isLicenseValid = null;

        // 检查许可证的方法,包含硬件锁和时间锁的验证逻辑
        public static int Check()
        {
            // 如果已缓存验证结果,则直接返回
            if (_isLicenseValid.HasValue)
            {
                return _isLicenseValid.Value ? 0 : 2;
            }

            try
            {
                // 1. 首先尝试获取 AgileDotNetLicense 对象
                AgileDotNetLicense license = AgileDotNetLicenseProvider.Validate(null, null, false);

                if (license != null)
                {
                    // 验证时间锁和硬件锁,如果两个都有效,返回 0
                    if (ValidateTimeLock(license) && ValidateHardwareLock(license))
                    {
                        _isLicenseValid = true; // 缓存结果为有效
                        return 0;
                    }
                    else
                    {
                        _isLicenseValid = false; // 缓存结果为无效
                        return 1;
                    }
                }

                // 2. 如果许可证为空,读取 localhost.ini 文件
                string key = null;
                string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
                string filePath = Path.Combine(baseDirectory, "DotNetCommands", "SimTool", "localhost.ini");

                if (File.Exists(filePath))
                {
                    // 读取 localhost.ini 文件中的路径
                    string licensePath = File.ReadAllText(filePath).Trim();

                    // 检查路径是否为局域网路径 (路径以 `\\` 开头)
                    if (licensePath.StartsWith(@"\\"))
                    {
                        string[] licenseFiles = Directory.GetFiles(licensePath, "*.lic");

                        // 遍历所有 .lic 文件并读取第一个许可证文件内容
                        foreach (string licenseFile in licenseFiles)
                        {
                            if (File.Exists(licenseFile))
                            {
                                key = File.ReadAllText(licenseFile).Trim(); // 读取许可证文件内容
                                break;
                            }
                        }
                    }
                }

                // 3. 如果 key 仍然为空,使用固定的 key
                if (key == null)
                {
                    key = "mGTbwQ6uf7rWmM78yGXa7V4PEhE6SvcdFNjikjpEHS6rLoJxUrDJ9Pv4RGvuLXNq4c4u7FfJXXQOYpIUrfsKcp+WjRuILY5wHY0KE7hQCP4mg0hLFQUieZOgprZybM5RwklbW59s";
                }

                // 使用 key 创建 AgileDotNetLicense 对象并验证
                AgileDotNetLicense fallbackLicense = AgileDotNetLicenseProvider.CreateLicenseFromString(key);

                // 如果两个锁都验证成功,返回 0
                if (ValidateTimeLock(fallbackLicense) && ValidateHardwareLock(fallbackLicense))
                {
                    _isLicenseValid = true; // 缓存结果为有效
                    return 0;
                }
                else
                {
                    _isLicenseValid = false; // 缓存结果为无效
                    return 1;
                }
            }
            catch (Exception ex)
            {
                // 捕获异常,记录错误并返回失败状态
                MessageBox.Show("许可证验证失败: " + ex.Message);
                _isLicenseValid = false;
                return 1;
            }
        }

        // 验证时间锁的方法
        private static bool ValidateTimeLock(AgileDotNetLicense license)
        {
            TimeLock[] timeLocks = license.GetLocks<TimeLock>();

            if (timeLocks != null && timeLocks.Length > 0)
            {
                foreach (TimeLock timeLock in timeLocks)
                {
                    // 如果有一个时间锁未过期,则时间锁有效
                    if (timeLock.DaysToExpire > 0)
                    {
                        return true;
                    }
                }
            }
            return false; // 时间锁无效
        }

        // 验证硬件锁的方法,通过注册表匹配硬件信息
        private static bool ValidateHardwareLock(AgileDotNetLicense license)
        {
            HardwareProfileLock hardwareLock = license.GetLocks<HardwareProfileLock>().FirstOrDefault();

            if (hardwareLock != null)
            {
                string hardwareHashFromLicense = hardwareLock.ProfileHash;

                // 打开注册表路径并读取硬件指纹信息
                try
                {
                    using (RegistryKey key = Registry.LocalMachine.OpenSubKey(registryPath))
                    {
                        if (key != null)
                        {
                            object registryValue = key.GetValue(registryKeyName);

                            if (registryValue != null && registryValue.ToString() == hardwareHashFromLicense)
                            {
                                return true; // 硬件信息匹配
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    // 捕获异常,记录错误并返回失败状态
                    MessageBox.Show("读取注册表时发生错误: " + ex.Message);
                }
            }
            return false; // 硬件信息不匹配
        }
    }



自己花了两天研究了一下Agile.Net许可代码,可以实现日期验证和硬件的验证,但是硬件验证会卡几秒 不知道是这个软件的问题还是API用的不对 麻烦有大佬看到帮忙解决下 三克油
shan999abc 发表于 2024-11-23 09:59
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 06:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表