programar - que es java
Cómo crear una versión de prueba de un programa Java (10)
¿Por qué no simplemente codificar una fecha de caducidad en el programa de prueba para que no tenga que seguir admitiéndolo? Podrías poner esto en main ().
// Die after October 1, 2010
Calendar expireDate = Calendar.getInstance();
// January is 0 (y, m, d)
expireDate.set(2010, 9, 1);
// Get current date and compare
if (Calendar.getInstance().after(expireDate)) {
// Die
System.exit(0);
}
Así es como Microsoft distribuye su software beta a gran escala. Sólo le dan una fecha de caducidad.
Si está hablando de prevenir la ingeniería inversa o modificar el código, no puede. Podría ofuscar el programa compilado, pero esto no detendrá a las personas que, de todos modos, utilizarían ingeniería inversa en su código.
Estoy codificando un software en Java y casi termino, me gustaría saber cómo podemos crear una versión de prueba que funcione, por ejemplo, durante 30 días, porque lo enviaré a algunas compañías.
Entonces, ¿cómo hacerlo como shareware o trialware, también podemos bloquear el acceso a .class en el archivo jar?
Gracias
Aquí hay una idea:
Cree una base de datos (como una base de datos de SQL Server) que esté disponible públicamente en la web. Se mantendrá una lista de claves de licencia de "versión de prueba". Puede usar el mismo sistema para las claves de licencia de la versión completa cuando compre su producto.
Cuando se ejecute por primera vez el software de Java, se creará una licencia de prueba que se almacenará en la base de datos.
El software de Java busca una licencia válida cada vez que se ejecuta. La fecha en que se creó la licencia se almacena en la base de datos, por lo que no importa en qué se configuran los relojes del cliente.
El software deja de funcionar cuando la licencia ha caducado
El software estándar de Windows puede buscar el ID de la CPU y usarlo como parte de la licencia, de modo que cada computadora solo pueda ejecutar el software de prueba una vez. ¿Alguien sabe si existe un "ID de JVM" de algún tipo que pueda usarse para este propósito?
Tal vez ya haya código libre o de código abierto relacionado con la licencia?
Con respecto a los archivos de clase, no puede bloquear el acceso a ellos, pero puede hacer que su versión descompilada sea totalmente ilegible por obfuscation .
El problema al tratar de limitar las fechas es que la solución ingenua de solo verificar la fecha se puede engañar fácilmente si la persona retrasa el reloj de su sistema. Trabajé con un tipo que tenía una caja virtual de VMWare solo para ejecutar un software de tiempo limitado. Un mejor enfoque sería registrar la hora de la última vez que se ejecutó, y si la hora es anterior a esa hora, sabrá que el reloj se retrasó y puede abortar. El problema es descubrir cómo esconder ese archivo en algún lugar donde el usuario no pueda encontrarlo y sobrescribirlo. Nuevamente, en el entorno VMWare o VirtualBox, el usuario podría simplemente retroceder a una instantánea anterior.
En otras palabras, puede limitar algunas de las personas parte del tiempo, pero no todas las personas todo el tiempo.
Hay un producto llamado Rampart que te permite crear una versión de prueba para tu aplicación Java. Solo toma un par de minutos y funciona bastante bien.
Lo puedes encontrar en http://Rampartlicensing.com
He tenido éxito usando True License en el pasado. Tiene un soporte para un periodo de prueba. Úselo en combinación con una herramienta de ofuscación como ProGuard y ciertamente no es fácil de descifrar.
Recomiendo limites funcionales. Tengo poco programa de notas post-it. El programa funciona completamente, pero solo puede crear 10 notas en modo no registrado. Así que trato de ser amable con el usuario. No hay fechas límite, pantallas molestas o alguna otra cosa malvada. Solo una pequeña línea de estado que tiene texto de limitación y un botón de registro.
Simplemente haría algo realmente simple y lo suficientemente duro como para que los no programadores no pudieran resolverlo.
Algo así como escribir en un archivo la cantidad de milisegundos cuando el programa se instaló por primera vez en un archivo de 64 bits en binario. Y haga que su clase principal verifique y haga cumplir el límite de tiempo. Sí, la gente puede cambiar sus relojes para solucionar esto, pero en realidad no quieres venderle a esas personas de todos modos. También asegúrese de que la hora actual sea estrictamente dentro de los 30 días de la instalación. La mayoría de los usuarios solo harán retroceder sus relojes un año y funciona con la mayoría de los programas porque solo hicieron una simple comprobación de la diferencia. También debe verificar que la diferencia en el número de días desde el momento actual hasta la instalación también sea mayor que 0.
Si siente que necesita más protección que esa, entonces tiene un problema de modelo de negocios más que uno de software. Básicamente, es imposible que sea imposible de procesar, especialmente porque solo puedes extraer y desensamblar los archivos de clase.
Trabajo en un software comercial de Java y está protegido.
¿Es obligatoria una conexión a Internet en su caso? En nuestro caso, nuestro software solo tiene sentido si hay una conexión a Internet y, por lo tanto, podemos hacer imposible la ingeniería inversa simplemente siguiendo este mantra:
hacer que una parte suficiente del cálculo se realice en el lado del servidor
No hay nada contra esto que un atacante pueda hacer además:
Reescriba la parte de su software que está sucediendo en el lado del servidor.
pirateando tu servidor
Si nuestros usuarios potenciales no están contentos con el hecho de que nuestro software exige una conexión a Internet siempre activa, pueden comprar o piratear uno de los productos inferiores de nuestros competidores.
Piénsalo de esta manera: nadie ha tenido éxito en jugar en la batalla de Blizzard usando claves de licencia falsas / generadas.
Claro, un pirata podría tratar de falsificar la batalla completa.net, pero entonces la versión pirateada no permitiría a la gente jugar, digamos, en la verdadera economía de WoW ni competir en la escalera real de Starcraft, etc.
¿Por qué nadie logró hacer eso ?: porque Blizzard hizo que una parte suficiente de la computación sucediera en el lado del servidor .
Una parte suficiente del cómputo que ocurre en el lado del servidor significa efectivamente: "buenos juegos piratas" .
Cuanto más nos movemos a un mundo siempre conectado, más fácil es proteger las aplicaciones contra la piratería. Lo mismo para el contenido (DRM), para bien o para mal.
Verifico la fecha de lo que un servidor de hora atómica me enviará al principio en el código. Entonces, compararé esa fecha con una fecha específica. Si el tiempo atómico es menor, entonces System.exit (0).
public static GregorianCalendar getAtomicTime() throws IOException {
BufferedReader in = null;
try {
URLConnection conn = new URL("http://64.90.182.55:13").openConnection();
GregorianCalendar calendar = new GregorianCalendar();
conn.setConnectTimeout(1000);
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String atomicTime;
while (true) {
if ((atomicTime = in.readLine()).indexOf("*") > -1) {
break;
}
}
//System.out.println("DEBUG : " + atomicTime);
String[] fields = atomicTime.split(" ");
String[] date = fields[1].split("-");
calendar.set(Calendar.YEAR, 2000 + Integer.parseInt(date[0]));
calendar.set(Calendar.MONTH, Integer.parseInt(date[1]) - 1);
calendar.set(Calendar.DATE, Integer.parseInt(date[2]));
// deals with the timezone and the daylight-saving-time
TimeZone tz = TimeZone.getDefault();
int gmt = (tz.getRawOffset() + tz.getDSTSavings()) / 3600000;
//System.out.println("DEBUG : " + gmt);
String[] time = fields[2].split(":");
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(time[0]) + gmt);
calendar.set(Calendar.MINUTE, Integer.parseInt(time[1]));
calendar.set(Calendar.SECOND, Integer.parseInt(time[2]));
return calendar;
} catch (IOException e) {
throw e;
} finally {
if (in != null) {
in.close();
}
}
}