长春网站建设q479185700棒,代做毕网站,传动设备 技术支持 东莞网站建设,男女做暖暖的时候网站原文地址#xff1a;李浩的博客 lihaohello.top 本科期间开发过一款混凝土基本构件设计程序#xff0c;该程序是一个独立的exe可执行文件#xff0c;采用VC静态链接MFC库编制而成。近期#xff0c;需要为该程序添加用户注册验证的功能#xff0c;从而避免任何用户获取该程…原文地址李浩的博客 lihaohello.top 本科期间开发过一款混凝土基本构件设计程序该程序是一个独立的exe可执行文件采用VC静态链接MFC库编制而成。近期需要为该程序添加用户注册验证的功能从而避免任何用户获取该程序就能无限制使用的问题。
刚开始打算在网络上找可直接为单个exe文件添加“一机一码”注册功能的平台软件但该类软件基本都是付费软件且生成的加壳程序很容易被杀毒软件误差。好在“一机一码”机制并不复杂最终决定使用C#编程的方式手动实现该功能。 整体思路
新建C#控制台程序将exe嵌入C#的资源文件控制台程序启动后先进行“一机一码”校验 如果已注册直接进入第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();注意事项
释放exe文件后该文件必定存在于本机某个路径高级用户可以找到该路径并拷贝exe文件从而轻松破解。这是本方法的硬伤只能通过选择隐蔽路径、设置文件隐藏等方法加大定位该文件的难度。由于采用C#语言进行加壳很容易反编译得到加壳逻辑这样从机器码到注册码的算法逻辑就非常容易被破解者发现从而自己计算实现注册。解决该方法的办法是使用C 编写机器码到注册码的算法逻辑然后封装给C#程序调用或者使用C 来进行加壳或者更彻底一些将注册码计算过程部署到服务器通过网络来进行验证。软件开发者端需要额外的注册码计算程序从而实现软件分发控制。