给既有exe程序添加一机一码验证

原文地址:李浩的博客 lihaohello.top


本科期间开发过一款混凝土基本构件设计程序,该程序是一个独立的exe可执行文件,采用VC++静态链接MFC库编制而成。近期,需要为该程序添加用户注册验证的功能,从而避免任何用户获取该程序就能无限制使用的问题。

刚开始,打算在网络上找可直接为单个exe文件添加“一机一码”注册功能的平台软件,但该类软件基本都是付费软件,且生成的加壳程序很容易被杀毒软件误差。好在“一机一码”机制并不复杂,最终决定使用C#编程的方式手动实现该功能。

整体思路

  1. 新建C#控制台程序,将exe嵌入C#的资源文件
  2. 控制台程序启动后,先进行“一机一码”校验:
    • 如果已注册,直接进入第3步
    • 如果未注册,则弹出注册窗口,提示用户输入注册码:注册成功进入第3步;失败继续提示输入注册码或退出
  3. 通过代码从资源文件中释放exe,并启动新进程,控制台进程等待新进程执行完毕再退出

主要问题

“一机一码”的验证策略

  • 先获取硬件(CPU、硬盘等)的序列号,通过序列号组合成机器码
  • 通过某种加密算法从机器码计算得到注册码,并把注册码写入特定的文件或注册表
  • 每次打开加壳程序时,都先获取机器码计算注册码,将计算得到的注册码与保存在本地的注册码进行比较,如果一致就说明注册成功,反之失败

以下是获取CPU和硬盘序列号的函数:

public static string GetCPUId() {try {ManagementObjectCollection collection1 = new ManagementClass("Win32_Processor").GetInstances();string strCpuID = null;foreach (ManagementObject obj1 in collection1) {strCpuID = obj1.Properties["ProcessorId"].Value.ToString();break;}return strCpuID;} catch {return "strCpuID";}
}public static string GetDiskId() {try {ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");String strHardDiskID = null;foreach (ManagementObject mo in searcher.Get()) {strHardDiskID = mo["SerialNumber"].ToString().Trim();break;}return strHardDiskID;} catch {return "strHardDiskID";}
}

释放资源获得原始文件

  • 这里需要指定释放文件的保存路径,可以选择当前用户的临时文件夹
  • 可以设置释放文件的状态为隐藏,为用户拷贝该文件制造额外障碍
byte[] fileBytes = Resource1.program;
string fileName = System.IO.Path.GetTempPath();
if (fileName.EndsWith("\\"))fileName = fileName + "program.exe";
elsefileName = fileName + "\\program.exe";
using (BinaryWriter bw = new BinaryWriter(new System.IO.FileStream(fileName, System.IO.FileMode.Create))) {bw.Write(fileBytes);bw.Flush();bw.Dispose();
}
File.SetAttributes(fileName, FileAttributes.Hidden);

执行释放程序并等待其结束

System.Diagnostics.Process myPro = System.Diagnostics.Process.Start(fileName);
myPro.WaitForExit();

注意事项

  1. 释放exe文件后,该文件必定存在于本机某个路径,高级用户可以找到该路径并拷贝exe文件,从而轻松破解。这是本方法的硬伤,只能通过选择隐蔽路径、设置文件隐藏等方法加大定位该文件的难度。
  2. 由于采用C#语言进行加壳,很容易反编译得到加壳逻辑,这样从机器码到注册码的算法逻辑就非常容易被破解者发现,从而自己计算实现注册。解决该方法的办法是:使用C+ +编写机器码到注册码的算法逻辑,然后封装给C#程序调用;或者使用C+ +来进行加壳;或者更彻底一些,将注册码计算过程部署到服务器,通过网络来进行验证。
  3. 软件开发者端需要额外的注册码计算程序,从而实现软件分发控制。

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

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

相关文章

python从入门到精通:函数

目录 1、函数介绍 2、函数的定义 3、函数的传入参数 4、函数的返回值 5、函数说明文档 6、函数的嵌套调用 7、变量的作用域 1、函数介绍 函数是组织好的,可重复使用的,用来实现特定功能的代码段。 name "zhangsan"; length len(nam…

Java八股整合(MySQL+Redis+Maven)

MySQL 数据库设计三范式 不可再分,部分依赖,传递依赖 主键和外键区别 主键非空约束,唯一性约束,唯一标识一个字段 外键用于和其他表建立连接,是另一张表的主键,可重复可为空可以有多个 为什么不推荐使…

链表---数据结构-黑马

链表 定义 链表是数据元素的线性集合,其每个元素都指向下一个元素,元素存储上是不连续的。 分类 单向链表,每个元素只知道自己的下一个元素是谁。 双向链表,每个元素知道自己的上一个元素和下一个元素。 循环链表,…

10W数据导入该如何与库中数据去重?

使用的是PostgreSQL 在做大数据量(十万级)导入时,某些字段和数据库表里数据(千万级)重复的需要排除掉,把表数据查询出来用程序的方式判断去重效率很低,于是考虑用临时表。 先把新数据插入到临时…

【深度学习】单层神经网络

单层神经网络 神经元感知机 1943年,心理学家McCulloch和数学家Pitts共同发表了神经网络的开山之作A Logical Calculus of the Ideas Immanent in Nervours Activity1,提出了神经网络的第一个数学模型——MP模型。该模型也成为了人工神经网络的基础。 神经…

AXI DMA IP的MICRO DMA模式和去掉SG(Scatter-Gather)功能的模式

AXI DMA IP的MICRO DMA模式和去掉SG(Scatter-Gather)功能的模式确实有一些区别。让我们详细比较这两种模式: 功能复杂度: MICRO DMA模式:设计为更简单、更轻量级的DMA解决方案。无SG模式:仍保留了基本DMA的…

Error hdl vendor backen is missing

跑vcs时报这个错, // hdl vendor backends are defined for VCS,QUESTA,INCA #if defined(VCS) || defined(VCSMX) #include "uvm_hdl_vcs.c" #else #ifdef QUESTA #include "uvm_hdl_questa.c" #else #if defined(INCA) || defined(NCSC) #in…

leetcode-448. 找到所有数组中消失的数字

题目描述 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。 示例 1: 输入:nums [4,3,2,7,8,2,3,1] 输出:[5,6…

代码随想录算法训练营第十四天| 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度

目录 一、LeetCode 226.翻转二叉树思路:C代码 二、LeetCode 101. 对称二叉树思路C代码 二、LeetCode 104.二叉树的最大深度思路C代码 二、LeetCode 111.二叉树的最小深度思路C代码 总结 一、LeetCode 226.翻转二叉树 题目链接:LeetCode 226.翻转二叉树 …

Redis缓存配置

redis缓存 使用redis缓存的原因是因为在可能的高并发环境下,mysql数据库无法承受大量的请求,可能会导致数据库崩溃。而这些请求很大一部分都是查询请求,因此采用redis这样的以内存作为存储数据空间的数据库来存储查询请求的数据,…

springboot静态资源访问问题归纳

以下内容基于springboot 2.3.4.RELEASE 1、默认配置的springboot项目,有四个静态资源文件夹,它们是有优先级的,如下: "classpath:/META-INF/resources/", (优先级最高) "classpath:/reso…

【Android】android,震动一下,50ms,震动等级设置低一点

要在Android中实现震动50ms,并将震动等级设置为低,你可以使用Vibrator类。下面是一个简单的代码示例,展示如何实现这个功能: import android.content.Context; import android.os.VibrationEffect; import android.os.Vibrator

React+Vis.js(03):设置节点形状

文章目录 Vis支持的形状类型代码实现完整代码实现效果Vis支持的形状类型 circle(圆形)box(盒子)dot(点)star(五角星)triangle(三角形)ellipse(椭圆形)triangleDown(倒三角形)diamond(菱形)代码实现 通过shape属性来定义每个节点的形状 const nodes = new vis…

Unified 阻抗控制 architecture、framework、approach

Unified 阻抗控制(Unified Impedance Control)作为一种控制策略,其architecture(架构)、framework(框架)和approach(方法)为: 一、Unified 阻抗控制 Archite…

骨板和螺钉市场分析:前五大厂商占有大约78.0%的市场份额

据QYResearch调研团队最新报告“全球骨板和螺钉市场报告2024-2030”显示,预计2030年全球骨板和螺钉市场规模将达到76.2亿美元,未来几年年复合增长率CAGR为3.7%。 根据QYResearch头部企业研究中心调研,全球范围内骨板和螺钉生产商主要包括J &a…

视频美颜SDK与直播美颜工具的开发详解与技术优化

本篇文章,小编将为开发者提供一份详细的美颜指南。 一、视频美颜SDK的核心功能 视频美颜SDK是一种嵌入式软件开发工具包,允许开发者在应用中轻松实现实时美颜效果。其核心功能主要包括: 1.实时磨皮 2.美白功能 3.瘦脸与大眼 4.智能滤镜…

AWS 消息队列服务 SQS

AWS 消息队列服务 SQS 引言什么是 SQSSQS 访问策略 Access Policy示例:如何为 DataLake Subscription 配置 SQS 引言 应用系统需要处理海量数据,数据发送方和数据消费方是通过什么方式来无缝集成消费数据的,AWS 提供 SQS 消息队列服务来解决…

设计模式21-组合模式

设计模式21-组合模式(Composite Pattern) 写在前面 动机定义与结构定义结构主要类及其关系 C代码推导优缺点应用场景总结补充叶子节点不重载这三个方法叶子节点重载这三个方法结论 写在前面 数据结构模式 常常有一些组件在内部具有特定的数据结构。如何…

相机光学(三十四)——色差仪颜色观察者视角

1.为什么会有观察者视角 颜色观察角度主要涉及到人眼观察物体时,‌视角的大小以及屏幕显示颜色的方向性对颜色感知的影响。‌ 人眼观察物体的视角:‌在黑暗条件下,‌人眼主要依靠杆体细胞来分辨物体的轮廓,‌而杆体细胞分布在视网…