给你的系统增加对物理地址的验证

给你的系统增加对物理地址的验证

我们开发出一个系统之后,经常有很多方法来保护我们的系统不受别人非法使用,比如说采用注册码,根据IP地址进行限制等。这些都存在一个问题就是容易给人通过拷贝注册码等手段来非法使用系统,现在这里将讲述如何通过判断用户电脑的物理地址来限制系统的使用,这样,就可以做到只在一台电脑上可以使用该系统(通过注册码),如果系统安装在其它电脑上,因为电脑的物理地址已经改变,所以原来所使用的注册码将失效,这样可以防止了系统的非法拷贝。

开发原理

其中这个原理比较简单,首先我们是根据用户提供的物理地址制作出一个license文件(或者是注册码,这个注册码是根据保护了物理地址的信息,不过最好是要先通过编码),就是通过系统的命令来获得电脑的物理地址,比如说windows系统的“ipconfig /all”命令,这样就可以获得该电脑的物理地址;然后我们根据这个物理地址跟注册码中获得的物理地址进行比较,如果相同的话,就允许使用系统,否则,不允许使用系统。

开发代码

首先,让我们先来看看如何获得命令的信息。在java中,有一个Runtime.getRuntime().exec()方法,这个方法可以执行一个系统命令,然后返回命令的相关信息。下面这个类可以获得命令的输出结果:

public class Tools
{
 public static String exec(String command)
 {
 byte buf[];
 //输入流
 InputStream is;
 //错误流
 InputStream es;
 //输出流
 OutputStream os;
 buf = new byte[512];
 is = null;
 es = null;
 os = null;
 String s1;
 //执行命令command,返回结果
 Process p = Runtime.getRuntime().exec(command);
 //获得命令的输入流
 is = p.getInputStream();
 //获得命令的输出流
 os = p.getOutputStream();
 //获得命令的错误流
 es = p.getErrorStream();
 StringBuffer sb = new StringBuffer();
 for(int i = is.read(buf); i != -1; i = is.read(buf))
 sb.append(new String(buf, 0, i));
 s1 = sb.toString();
 try
 {
 is.close();
 os.close();
 es.close();
 }
 catch(Exception ex) { }
 return s1;
 }
}

在这个类中,我们要获得一个命令的输出结果,比如说一个ipconfig命令,那么像这个就可以获得了:String mac = Tools.exec("ipconfig /all");

这里字符串mac就是返回我们在命令行中输入命令ipconfig /all所看到的结果了。

接下来我们就要对这个信息跟注册码里面的信息进行比较了,不过这里有个问题,就是不同的系统获得物理地址的命令是不同的,windows系统是采用ipconfig /all命令,而linux和unix系统是采用netstat –in命令,这里就要对不同的系统进行判断了。在这里,我们采用路径的分隔符来判断,比如说,在windows系统下是采用“/”才分隔目录的,比如:c:/temp/doc,而linux和unix是用“/”来分隔的,比如:/mnt/doc,这样我们就可以判断了。

下面这个方法可以对物理地址进行比较:

private static boolean checkNetAddress(String netAddr, char OSType)
{
 String mac = null;
 if(OSType != '/')
 mac = Tools.exec("ipconfig /all");
 else
 mac = Tools.exec("netstat -in");
 return mac.indexOf(netAddr) >= 0;
}

在这里,参数netAddr是系统的物理地址,它是从注册码中获得的(可能要经过解码等方法),OSType是用来表示系统的类型,用“/”和“/”来分别。

下面这句话:

mac.indexOf(netAddr)

就是判断输入命令获得的结果mac中是否包含有物理地址netAddr,不如有的话,那我们就可以认为系统的注册码正确了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术墨客

Vert.x源码-创建与解析MongDB配置 原

    io.vertx.ext.mongo.impl.MongoClientImpl;

13230
来自专栏10km的专栏

powershell:脚本中检查mingw-w64编译器是否能生成 32/64位代码

mingw-w64提供的编译器不同的版本生成代码的能力是不一样的,有的只能生成32位代码 有的只能生成64位代码,在powershell脚本中,为了自动化执行编...

272100
来自专栏Linux驱动

36.Linux驱动调试-根据oops定位错误代码行

1.当驱动有误时,比如,访问的内存地址是非法的,便会打印一大串的oops出来 1.1以LED驱动为例 将open()函数里的ioremap()屏蔽掉,直接使用物...

31080
来自专栏PPV课数据科学社区

PyCharm 2016.3 公开预览版发布

PyCharm 2016.3 公开预览版发布了,PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比...

27540
来自专栏Java面试笔试题

什么是IoC和DI?DI是如何实现的?

IoC叫控制反转,是Inversion of Control的缩写,DI(Dependency Injection)叫依赖注入,是对IoC更简单的诠释。控制反转...

11530
来自专栏芋道源码1024

分布式作业系统 Elastic-Job-Lite 源码分析 —— 作业监听器

摘要: 原创出处 http://www.iocoder.cn/Elastic-Job/job-listener/ 「芋道源码」欢迎转载,保留摘要,谢谢!

12730
来自专栏程序员互动联盟

linux设备驱动第二篇:如何写一个简单内核驱动?

上一篇介绍了linux驱动的概念,以及linux下设备驱动的基本分类情况及其各个分类的依据和差异,这一篇我们来描述如何写一个类似hello world的简单测试...

42590
来自专栏linux驱动个人学习

Memory barrier 简介

程序在运行时内存实际的访问顺序和程序代码编写的访问顺序不一定一致,这就是内存乱序访问。内存乱序访问行为出现的理由是为了提升程序运行时的性能。内存乱序访问主要发生...

13430
来自专栏菩提树下的杨过

bash/shell编程学习(3)

接上节继续, 1. 从键盘读取输入内容 #!/bin/bash read -p 'please input something:' input echo 'yo...

203100
来自专栏蘑菇先生的技术笔记

WebApiThrottle限流框架使用手册

40650

扫码关注云+社区

领取腾讯云代金券