Pegar data java ignorando a alteração do Relógio do Sistema

Boa tarde,

Gostaria de saber se é possível no Java, ignorar a data alterada do sistema, tipo

Hoje é dia 06/11/2018
O vencimento do meu sistema é dia 06/12/2018

Quando chegar no dia 07/12/2018 o usuário irá alterar a data para 06/11/2018, sendo assim voltou a data podendo utilizar novamente, teria alguma opção para pegar a data correta, sem a utilização da internet?, caso não poderia me passar também via internet obrigado :slight_smile:

Se seu sistema vai executar sem acesso à internet, não vejo como você poder obter a data atual.

Nesse caso eu partiria para alguma outra estratégia.
Por exemplo se seu sistema funciona por uma certa quantidade de dias, você poderia contabilizar o tempo restante para o sistema ser bloqueado.
Essa informação você guarda em algum arquivo oculto ou registro do sistema operacional, de repente de forma encriptada.
Enquanto seu sistema executa você pode ter um relógio interno que vai decrementando esse arquivo a cada minuto por exemplo.
Quando a informação no arquivo estiver zerada, você bloqueia seu sistema.

Isso foi só uma dica de como você poderia fazer, não necessariamente é a melhor forma, mas pode ser que atenda sua necessidade.

Entendi a forma que explicou, mas, para o meu caso não iria resolver, pensei que tivesse alguma forma de pegar a data na BIOS ou algo do tipo, se não tiver outra maneira acho que devo colocar para buscar em um servidor online

Se for código em aplicação Java local, não importa o que fizer, podem descompilar facilmente e burlar qualquer regra que esteja impedindo a continuidade da execução.

Por isso a importância de utilizar ofuscadores de código.

Tem algum código básico, para registrar em arquivo oculto ou registro do sistema operacional?

Em linux, basta que o nome do arquivo comece com '.' e ele será automagicamente oculto.

No windows você pode ocultar um arquivo da seguinte forma:

File file = <aqui você inicializa o objeto File correspondente ao seu arquivo>;
Files.setAttribute(file.toPath(), "dos:hidden", Boolean.TRUE, LinkOption.NOFOLLOW_LINKS);

Pra salvar no registro você pode usar a classe Preferences, exemplo:

Preferences prefs = Preferences.userRoot();
Preferences node = prefs.node("minha_configuracao"); // HKEY_CURRENT_USER\Software\JavaSoft\Prefs\minha_configuracao
long umMes = 2592000000L; // quantos milissegundos há em um mês
node.putLong("tempo_execucao_restante", umMes);

Isso nao impede de eliminar a parte do código que está impedindo a continuidade da execução nesses bloqueios, ofuscado ou não, vai debugando e comenta.

Não, não impede, mas até hoje nunca vi ninguém conseguir recompilar um sistema em Java que foi ofuscado, principalmente se o ofuscador insere const, goto e faça aggressive overloading.

Se conseguiram compilar assim, qual o impedimento? O código está aberto, pra quem tem má intensão isso é o melhor dos mundos.

Isso já pode me ajudar muito obrigado ^^

O impedimento é justamente a ofuscação, que insere instruções que após descompiladas não são válidas para o compilador.

Veja o fonte abaixo por exemplo, fruto de uma descompilação de bytecode ofuscado.
Conhece alguém ou alguma ferramenta que consiga recompilar isso?

package a;

import java.util.Vector;

class a {

    private Vector a;
    public static int b;

    a() {
        a = new Vector();
    }

    int a(String s) {
        int i;
        int j;
        j = b;
        i = 0;
        if(j == 0) goto _L2; else goto _L1
_L1:
        String s1 = (String)a.elementAt(i);
        s1.equals(s);
        if(j != 0) goto _L4; else goto _L3
_L3:
        JVM INSTR ifeq 48;
           goto _L5 _L6
_L5:
        break MISSING_BLOCK_LABEL_37;
_L6:
        continue;
        a.remove(i);
        i;
_L4:
        return;
_L2:
        if(i >= a.size())
            return -1;
        if(true) goto _L1; else goto _L7
_L7:
    }

A própria ferramenta que ofuscou conseguiu compilar dessa forma. A JVM aceita.

O ofuscador não compila arquivos .java, ele modifica instruções diretamente no .class.
Seria necessário desenvolver um compilador que aceite arquivos .java com instruções inválidas para o compilador mas válidas para a JVM.
Impossível não é, mas é tão trabalhoso.

Se desenvolvem vários ofuscadores entregando isso pra JVM, longe de impossível. Aqui é proibido desenvolver em Java ou .NET desktop para por exemplo conectar diretamente a banco de dados, é uma falha de segurança muito básica.