java 物理地址校验软件试用版控制问题以及非法拷贝到其他机子上运行
2005-06-13 01:40
435 查看
我们开发出一个系统之后,经常有很多方法来保护我们的系统不受别人非法使用,比如说采用注册码,根据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,不如有的话,那我们就可以认为系统的注册码正确了。
开发原理
其中这个原理比较简单,首先我们是根据用户提供的物理地址***出一个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,不如有的话,那我们就可以认为系统的注册码正确了。
相关文章推荐
- vc2005/2008编写的软件无法在其他机子上运行问题的解决方案
- Java配置环境以及Editplus运行程序方法及问题
- 前端发送ajax请求以及源地址校验(java + JavaScript)
- java笔记:关于复杂数据存储的问题--基础篇:数组以及浅拷贝与深拷贝的问题(上)
- 关于在Windows Server2003上面配置虚拟目录物理路径为局域网内其他机器地址的若干问题
- 使用Sublime Text 3 编译并运行Java程序以及常见的问题
- 关于JAVA中的static方法、并发问题以及JAVA运行时内存模型
- 软件项目或者产品有时候会用到本机网卡的物理MAC地址、IP地址、硬盘序列号加上使用软体名称和地址进行安全加密验证,例如结合MAC地址进行登录验证等等,当然这种项目一般在局域网内运行,能相对提高系统的安全性
- 校园网上网问题(ubuntu 9.10)-- 物理地址 ip 以及DNS的修改
- 关于JAVA中的static方法、并发问题以及JAVA运行时内存模型
- 在 Sublime Text 2 中编译和运行 Java 程序,以及输出中文出错问题解决办法
- Java web:SSH项目拷贝产生问题以及解决(getContextPath() xml hibernate等报错)
- 基本名词认识,Java环境配置,打包jar命令,以及在dos下运行一系列问题,Java注释,javadoc命令
- Java混乱器Zelix KlassMaster逆向工程(二)软件运行流程以及爆破去除时间限制
- 关于JAVA中的static方法、并发问题以及JAVA运行时内存模型
- 依赖JDK的Java软件运行问题
- ubuntu17.10解决fcitx输入法不能在idea或者其他java软件环境下使用中文的问题
- Symantec pcAnyWhere 试用版安装之后,安装其他版本无法运行的问题
- Linux后台启动程序以及打开XShell连接运行java -jar然后关闭连接程序不再运行问题
- Extjs 树的动态更改加载地址,以及动态加载已有子节点其他节点问题!