criei um sistema de expiração para um software que estou fazendo… Não consegui burlar, e nem sei se é possível…
Como acho (ACHO) que deu certo e se Deus quiser vai continuar dando, gostaria de compartilhar o método usado.
Eu deveria criptografar o arquivo, mas mesmo assim não fiz isso… Até por que ainda não pesquisei sobre… Masss, vamos ao que importa…
Criei uma classe controladora, que contém alguns atributos:
Date dataAnterior, dataExpiracao;
int contador, max;
Ele utiliza o contador e a data de expiração para travar o sistema… O contador como um ‘backup’, caso o cara mude a data do sistema ou algo assim…
O contador é sempre incrementado quando a data atual for diferente da data anterior [significa que não é o mesmo dia]…
Se o contador for maior que max, então expirou…
Crio um objeto a partir dessa classe, e o serializo em um arquivo. Ao iniciar o programa, ele carrega o arquivo e verifica se já expirou e pronto. Qualquer Exception gerada na hora de recuperar o arquivo, trava o sistema como se tivesse expirado [por segurança].
É possível usar o procmon para descobrir que sistema ou chave de registro seu programa está gravando. Com isso em mãos, o que impede que seu usuário simplesmente substitua o arquivo com um backup, com uma data definida?
eu ainda não fiz, mas minha ideia é que eu determino uma data e a qtd de dias que ele tem, tudo via banco, e verifica a data a cada um segundo, quando a data é alterada (automatico, ou pelo usuário) a qtd de dias muda, aí quando eu gero a licença(Criptografada), Muda no banco a data e a qtd de dias. Entedeu ?
Cara eu estou fazendo a mesma coisa… só não manjo essa parte de serialização de objetos e tal…
Eu coloquei uma data de validade caso chegue nela o programa trava, e outra verificação onde verifico a data do sistema e ele tem que estar dentro de duas datas que criei… Mas se ele ficar alterando a data do sistema dentro destes dias o programa funciona… precisava muito dessa sua solução… vc me ajudaria??
Aqui estão os métodos que criei:
public boolean validaDataDeUso() throws ParseException {
boolean dataNaValidade = false;
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
// Data atual recuperada do sistema
Date dataAtual = new Date(System.currentTimeMillis());
// Data informada pelo usuário
Date dataValidade = sdf.parse("11/04/2014");
// Verifica se a data atual é posterior a data informada
if (dataAtual.after(dataValidade)) {
dataNaValidade = false;
}
// Verifica se a data atual é anterior a data informada
if (dataAtual.before(dataValidade)) {
dataNaValidade = true;
}
// Verifica se as datas são iguais
if (dataAtual.compareTo(dataValidade) == 0) {
dataNaValidade = true;
}
return dataNaValidade;
}
public boolean validaDataAlterada() throws ParseException {
boolean dataAlterada = true;
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
// Data atual recuperada do sistema
Date dataAtual = new Date(System.currentTimeMillis());
// Data Mínima que o sistema pode ter, se alterarem a data do PC para
// antes desta (data da criação do arquivo) da erro
Date dataMinima = sdf.parse("27/03/2014");
Date dataMaxima = sdf.parse("29/03/2014");
if (dataAtual.after(dataMinima) && dataAtual.before(dataMaxima)) {
dataAlterada = false;
} else {
dataAlterada = true;
}
return dataAlterada;
}
// NO MAIN EU MANIPULO:
public static void main(String[] args) throws ParseException {
if (metodo.validaDataAlterada() == false) {
if (metodo.validaDataDeUso() == true) {
telaConectar.rdc();
} else {
JOptionPane.showMessageDialog(null, "Tempo de uso esgotado.","Aviso", javax.swing.JOptionPane.WARNING_MESSAGE);
}
} else {
JOptionPane.showMessageDialog(null,
"Tempo alterado indevidamente.", "Aviso",javax.swing.JOptionPane.WARNING_MESSAGE);
}
}