|
Ver temas sin respuesta | Ver temas activos
Foros Linux » Desarrollo » Programación
Página 1 de 1
|
[ 15 mensajes ] |
|
| Autor |
Mensaje |
akodo

Moderador
Registrado: Mié Nov 28, 2007 12:00 am Mensajes: 1361 Ubicación: En la X del explorer (pulse para llamar)
|
 Publicado: Jue Ago 26, 2010 5:27 pm |
|
|
Realmente no sé si el título es apropiado, pero les explico lo que quiero:
Tengo un programa, el cual se distribuye felizmente por todos lados. Lo que quiero es, de alguna forma, identificar el programa que está en la máquina del vecino y distinguirle del mío o del de otro vecino. Esto hay que hacerlo de forma transparente al usuario y a la vez evitar de alguna forma que dicha identificación se borre.
La identificación la quiero de cara a informes y estadísticas, con lo que la información se mandará a una dirección específica.
Un saludo y gracias por las ideas.
_________________ Descargue el gestor de mp3 "Music Manager" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)
|
|
|
|
 |
maiku

Moderador
Registrado: Mié Abr 18, 2007 11:00 pm Mensajes: 1209 Ubicación: Cojutepeque, El Salvador C. A.
|
 Publicado: Vie Ago 27, 2010 11:49 am |
|
|
hay un comando que genera "id" únicos, se llama uuid y se lanza uuidgen
en java está soportado.... (java, por qué dije java O_o? )
Bien se podría generar el uuid en la primer ejecución guardarlo como variable y tenerla disponible para enviar información.
Recomendación: Antes de enviar información desde la pc del usuario hay que preguntar al usuario si quiere enviar información por internet. (eso sono como una frase de churchill )
_________________ Grüße...
Maiku
Full linux alchemist!!!
|
|
|
|
 |
akodo

Moderador
Registrado: Mié Nov 28, 2007 12:00 am Mensajes: 1361 Ubicación: En la X del explorer (pulse para llamar)
|
 Publicado: Vie Ago 27, 2010 2:37 pm |
|
|
El problema está en las siguientes ejecuciones. El identificador debería ser el mismo, lo cual exige que sea almacenado en el disco. Si lo guardas en el disco es posible que te modifiquen dicho identificador, con lo que los informes no serían muy válidos. Entonces, ¿cómo leer el identificador y asegurarte de que no te lo han cambiado?
PD: Tenía pensado enviar por omisión: si el usuario no lo deshabilita se envía. Que para algo me molesto en hacer un manual.
_________________ Descargue el gestor de mp3 "Music Manager" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)
|
|
|
|
 |
mcun

Moderador
Registrado: Dom Abr 18, 2010 4:30 pm Mensajes: 2790 Ubicación: En una de las nalgas del culo del mundo (según la Bersuit Vergarabat)
|
 Publicado: Vie Ago 27, 2010 2:53 pm |
|
|
si te planteas un modelo del tipo programa--->BBDD creo que no es difícil que le agregues un identificador (usuario. pass, nº de programa) ya que el negocio seria directamente entre el programa y la BBDD
El nº de programa seria adjudicado cuando el usuario re registre para acceder a actualizaciones o lo que fuere, e incorporado en la aplicación a modo de parche.
Yo tengo pensado implementar es modelo en un proyecto que estoy elaborando, pero aun estoy lejos de ese punto, es pura teoría.
_________________ ... reinstalar un SO cuando produce un error es como tirar un bebe a la basura cuando se hace caca..
Trusted Network and Developer | Reglamento General de los Foros |WIKI-EL | Twitter @SISIAM Debian| ArchLinux |Linux User #508809
|
|
|
|
 |
hipersayan_x

Forista Distinguido
Registrado: Jue Abr 26, 2007 11:00 pm Mensajes: 1426
|
 Publicado: Vie Ago 27, 2010 5:22 pm |
|
Yo quise hacer algo como lo que vos queres, la idea era que mi programa se ejecutara de una forma u otra, según en que maquina se estuviera ejecutando. akodo escribió: El problema está en las siguientes ejecuciones. El identificador debería ser el mismo, lo cual exige que sea almacenado en el disco.
Haber, podrías generar alguna firma basada en la identificación de hardware, y distribución de archivos y carpetas de la computadora, pero el problema es que si bien es muy poco probable, aun así podrían existir 2 computadoras con exactamente las mismas configuraciones, por eso se le agrega alguna variable aleatoria, y de esa manera la firma cambia cada vez. akodo escribió: Si lo guardas en el disco es posible que te modifiquen dicho identificador, con lo que los informes no serían muy válidos. Entonces, ¿cómo leer el identificador y asegurarte de que no te lo han cambiado?
Al principio yo había pensado en jugar con los permisos del sistema, pero como ves, es bastante fácil de modificar la firma y mas aun siendo un programa portable. Una manera bastante retorcida, pero tal vez un poquito mas segura de proteger la firma, sería incrustándola en algún área vaciá dentro del binario ejecutable de tu aplicación, obviamente tendrías que disimularlo lo mejor posible para que después no sea tan fácil crackearla. Y rogá para que nadie del elhacker se ensañe con tu aplicación 
_________________ "Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit."
"Finibus Bonorum Et Malorum", Cicerón
|
|
|
|
 |
akodo

Moderador
Registrado: Mié Nov 28, 2007 12:00 am Mensajes: 1361 Ubicación: En la X del explorer (pulse para llamar)
|
 Publicado: Lun Ago 30, 2010 1:34 pm |
|
|
Pues una cosa tan simple como volcar el objeto UUID en cuestión puede que sea lo que necesito. He hecho alguna prueba y a parte de que se puede ver que es un objeto UUID, no se puede ver mucho más (no veo nada que pueda considerarse como identificador en el archivo donde dejo el objeto). Habría que cifrar el fichero, pero para lo que vamos utilizar el programa no creo que sea necesario.
De todas formas seguré buscando algo mejor en base a lo dicho.
_________________ Descargue el gestor de mp3 "Music Manager" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)
|
|
|
|
 |
akodo

Moderador
Registrado: Mié Nov 28, 2007 12:00 am Mensajes: 1361 Ubicación: En la X del explorer (pulse para llamar)
|
 Publicado: Jue Sep 09, 2010 3:47 pm |
|
Tras varias pruebas (en java, por supuesto  ), me ha surgido una duda. Les explico la situación: En base a la idea de hipersayan_x, he conseguido crear una clase al vuelo ("on the fly", queda mejor) que contenga el identificador en cuestión, e integrar esa clase en la aplicación, de forma que después de la primera ejecución del programa (en la cual no se detecta la clase, y por tanto hay que crearla) se pueda conseguir ese identificador desde la clase que se ha creado. La clase se acaba perdiendo entre las del programa en sí, con lo que al menos en teoría estaría "enmascarada". El problema es que, pensando otra vez en volcar el objeto UUID a un archivo, no sé que ventajas proporciona un método respecto a otro. He de decir que, según parece, crear la clase al vuelo consume muchos recursos (creo que el tiempo es apreciable), con lo que la opción de volcar el objeto parece más ligera. Creo que me he dejado llevar un poco por lo interesante de crear clases en tiempo de ejecución, cuando lo que necesito o lo que tengo ahora mismo se puede hacer de una manera más simple. A ver si me sacan de la duda... PD: Si alguien quiere probar el código se lo puedo mandar, a ver si consiguen modificar el identificador.
_________________ Descargue el gestor de mp3 "Music Manager" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)
|
|
|
|
 |
hipersayan_x

Forista Distinguido
Registrado: Jue Abr 26, 2007 11:00 pm Mensajes: 1426
|
 Publicado: Jue Sep 09, 2010 9:45 pm |
|
akodo escribió: Tras varias pruebas (en java, por supuesto  ), me ha surgido una duda. Les explico la situación: En base a la idea de hipersayan_x, he conseguido crear una clase al vuelo ("on the fly", queda mejor) que contenga el identificador en cuestión, e integrar esa clase en la aplicación, de forma que después de la primera ejecución del programa (en la cual no se detecta la clase, y por tanto hay que crearla) se pueda conseguir ese identificador desde la clase que se ha creado. La clase se acaba perdiendo entre las del programa en sí, con lo que al menos en teoría estaría "enmascarada". Ara?, yo decía de meter la firma dentro del ejecutable, en algún espacio libre o algo así, pero me has simplificado la idea, me parece genial Yo mucho de java no conozco, pero se parece mucho a lo que hace python así que quizás nos podamos entender. Lo que has hecho entonces es, crear un archivo de código fuente al vuelo, que contiene la clase para Java y en su interior la firma única, luego apartir de este archivo haces que Java lo compile a byte code y genere el archivo de código objeto al vuelo, al momento de ejecutar la aplicación. Ahora me queda una duda, vos recopilas el ejecutable con el CO de la firma o queda como un archivo separado? y en caso de recompilar el ejecutable junto con el CO, entonce este se inflaría, lo que implica que en ambos casos sería posible realizar ingeniería inversa para modificar la firma. akodo escribió: El problema es que, pensando otra vez en volcar el objeto UUID a un archivo, no sé que ventajas proporciona un método respecto a otro. He de decir que, según parece, crear la clase al vuelo consume muchos recursos (creo que el tiempo es apreciable), con lo que la opción de volcar el objeto parece más ligera.
mmm..., que raro, tanto tarda el compilador en crear el CO? no sera que la firma que estas generando es demasiado grande o algo parecido?. akodo escribió: Creo que me he dejado llevar un poco por lo interesante de crear clases en tiempo de ejecución, cuando lo que necesito o lo que tengo ahora mismo se puede hacer de una manera más simple. A ver si me sacan de la duda...
Formas seguro que hay muchas mas pero es el único que se me ocurre por ahora y que sea mas o menos infalible y difícil de detectar akodo escribió: PD: Si alguien quiere probar el código se lo puedo mandar, a ver si consiguen modificar el identificador. Me interesa, quiero saber de que manera has construido la firma, como has generado el CO y como lo integras al programa, si es demasiado largo el código te agradecería que lo comentaras.
_________________ "Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit."
"Finibus Bonorum Et Malorum", Cicerón
|
|
|
|
 |
akodo

Moderador
Registrado: Mié Nov 28, 2007 12:00 am Mensajes: 1361 Ubicación: En la X del explorer (pulse para llamar)
|
 Publicado: Vie Sep 10, 2010 4:16 am |
|
Código: public void genId() throws IOException { ClassPool cp = ClassPool.getDefault();
//creamos una nueva clase CtClass nueva = cp.makeClass("mp3.IdWrapper"); UUID id = UUID.randomUUID(); try { //añadimos el constructor nueva.addConstructor(CtNewConstructor.defaultConstructor(nueva));
//añadimos los atributos necesarios para obtener el identificador nueva.addField(CtField.make("public static final long mostBits = " + id.getMostSignificantBits() + ";", nueva)); nueva.addField(CtField.make("public static final long leastBits = " + id.getLeastSignificantBits() + ";", nueva));
//añadimos el método que nos devuelve el identificador nueva.addMethod(CtMethod.make("public static java.util.UUID getUuid() { return new java.util.UUID(mostBits, leastBits);}", nueva));
if (Utilidades.getExecutionLocalization().endsWith(".jar")){ String plugDir = Utilidades.getExecutionFolder() + File.separator + "plugins"; //escribimos la clase en ese directorio nueva.writeFile(plugDir);
String newClassLoc = plugDir + File.separator + "mp3" + File.separator + "IdWrapper.class"; //tratamos del actualizar el jar con la nueva clase String[] cmd = {"jar", "uf", Utilidades.getExecutionLocalization(), "-C", plugDir, "mp3" + File.separator + "IdWrapper.class"}; Process p = Runtime.getRuntime().exec(cmd); p.waitFor();
//borramos archivos innecesarios new File(plugDir + File.separator + "mp3").deleteOnExit(); new File(plugDir + File.separator + "mp3" + File.separator + "IdWrapper.class").deleteOnExit(); } else { nueva.writeFile(Utilidades.getExecutionLocalization()); } nueva.detach(); } catch (Exception ex) { Logger.getLogger(IdGen.class.getName()).log(Level.SEVERE, null, ex); } }
public UUID getId(){ try { ClassLoader ucl = Utilidades.addPluginsFolderToClasspath(); //cargamos la clase dinámicamente Class c = Class.forName("mp3.IdWrapper",false, ucl); //obtenemos el método que nos da el identificador Method m = c.getMethod("getUuid", new Class<?>[0]); //invocamos el método return (UUID) m.invoke(null, new Object[0]); } catch (Exception ex) { Logger.getLogger(IdGen.class.getName()).log(Level.SEVERE, null, ex); return null; } }
Para generar el identificador utilizo javassist ( http://www.csg.is.titech.ac.jp/~chiba/javassist/), lo que me permite generar el bytecode correspondiente (el archivo .class). El archivo que me genera contiene un par de atributos y un método para obtener el uuid en base a esos atributos. Dependiendo de si el programa se ejecutar en un jar o no, la clase se escribe en un sitio o en otro: si no es un jar escribe la clase donde le corresponde, si es un jar lo escribe en otro sitio e intenta actualizar el jar (no puedo escribir directamente en el jar) Para recuperar el identificador cargamos la clase dinámicamente e invocamos el método que nos devuelve el identificador. El problema: con ese código el usuario necesita tener jar (el empaquetador) cosa que, yo por lo menos, no tengo en windows (o no lo tengo, o no me lo encontró). Al menos el usuario no necesita compilar el código (ya lo hace javassist por todos). No hace falta regenerar el ejecutable, de hecho mover el archivo dentro del jar es una cuestión estética (tener un .class suelto no me gusta) hypersayan_x escribió: mmm..., que raro, tanto tarda el compilador en crear el CO? no sera que la firma que estas generando es demasiado grande o algo parecido?. Realmente no lo sé. Lo que tengo es que al cerrar la aplicación se obtenga el identificador (y lo genere si es necesario) y mande el identificador a una web. Este proceso es apreciable (tarda 1 o 2 segundos) pero no sé decirte si es por mandar el identificador, que será lo más probable, o por generarlo.
_________________ Descargue el gestor de mp3 "Music Manager" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)
|
|
|
|
 |
hipersayan_x

Forista Distinguido
Registrado: Jue Abr 26, 2007 11:00 pm Mensajes: 1426
|
 Publicado: Vie Sep 10, 2010 8:34 am |
|
Me costo entender el código, pero lo entendí Código: if (Utilidades.getExecutionLocalization().endsWith(".jar")) { /* Insertando la clase dentro del jar no sería modificable por el usuario, pero sería notable el cambio de tamaño del archivo y por lo tanto todavía sería posible crackear la firma y modificarla */
/* Esta opción me parece mas aceptable */ } else { /* Si escribís la clase en un archivo separado, y peor aun, visible para el usuario, entonces este la puede borrar o alterar, y por lo tanto pierde su valor como firma */ }
akodo escribió: El problema: con ese código el usuario necesita tener jar (el empaquetador) cosa que, yo por lo menos, no tengo en windows (o no lo tengo, o no me lo encontró).
No podes distribuir el compilador jar junto con el programa o tiene muchas dependencias? Yo conozco el dolor de huevos que es crear un programa portable y que por problemas de dependencias el programa deja de ser 100% portable ¬¬ akodo escribió: Realmente no lo sé. Lo que tengo es que al cerrar la aplicación se obtenga el identificador (y lo genere si es necesario) y mande el identificador a una web. Este proceso es apreciable (tarda 1 o 2 segundos) pero no sé decirte si es por mandar el identificador, que será lo más probable, o por generarlo.
Metéle un println() entre cada linea del código y revisá los tiempos, algo así: Código: WriteLn("entrada\n"); /* Código sospechoso. */ println("salida\n");
Y donde se tarde mucho en ejecutar, entonces allí tienes un cuello de botella.
_________________ "Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit."
"Finibus Bonorum Et Malorum", Cicerón
|
|
|
|
 |
akodo

Moderador
Registrado: Mié Nov 28, 2007 12:00 am Mensajes: 1361 Ubicación: En la X del explorer (pulse para llamar)
|
 Publicado: Vie Sep 10, 2010 3:43 pm |
|
hipersayan_x escribió: akodo escribió: El problema: con ese código el usuario necesita tener jar (el empaquetador) cosa que, yo por lo menos, no tengo en windows (o no lo tengo, o no me lo encontró).
No podes distribuir el compilador jar junto con el programa o tiene muchas dependencias? Yo conozco el dolor de huevos que es crear un programa portable y que por problemas de dependencias el programa deja de ser 100% portable ¬¬ El jar forma parte del SDK de SUN, y no sé si es portable (lo dudo mucho). De todas formas, creo que lo tengo solucionado con el paquete TrueZip que sí que me permite insertar el archivo en el jar. No sé cómo lo hará exactamente pero mientras lo haga... Me fastidia tener que añadir casi medio mega por el paquete (más lo que ocupe el javassist) pero bueno, habrá que sacarle provecho para futuras ampliaciones. En cuanto al retardo, poco puedo hacer desde mi posición. Tanto la obtención del identificador como el envío de éste hay que hacerlo tarde el tiempo que tarde. Podría adelantar la obtención del identificador al iniciar el programa... pero el tiempo que tarda en enviar los datos al servidor no puedo controlarlo. Tendré que pensar en hacer agradable la espera 
_________________ Descargue el gestor de mp3 "Music Manager" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)
|
|
|
|
 |
hipersayan_x

Forista Distinguido
Registrado: Jue Abr 26, 2007 11:00 pm Mensajes: 1426
|
 Publicado: Vie Sep 10, 2010 5:04 pm |
|
akodo escribió: Podría adelantar la obtención del identificador al iniciar el programa... pero el tiempo que tarda en enviar los datos al servidor no puedo controlarlo. Revisando la documentación de Java, la función randomUUID() generaría una cadena de 56bytes como mucho, si fuera todavía mas larga tampoco sería mucho problema. El usuario tendría que tener una conexión muy asquerosa como para que tarde en enviar tan poca información :s Para mi, el cuello de botella esta por acá: Código: String[] cmd = {"jar", "uf", Utilidades.getExecutionLocalization(), "-C", plugDir, "mp3" + File.separator + "IdWrapper.class"}; Process p = Runtime.getRuntime().exec(cmd);
O en otra parte del código. Metéle un println entre esa lineas y fijate cuanto tardan en ejecutarse. akodo escribió: Tendré que pensar en hacer agradable la espera  Siéntese y relájese mientras Windows se instala, el proceso solo tardara 2 dias 23 horas 56 minutos 48 segundos unos minutos 
_________________ "Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit."
"Finibus Bonorum Et Malorum", Cicerón
|
|
|
|
 |
akodo

Moderador
Registrado: Mié Nov 28, 2007 12:00 am Mensajes: 1361 Ubicación: En la X del explorer (pulse para llamar)
|
 Publicado: Lun Sep 20, 2010 3:34 pm |
|
Me acaba de surgir un problemón: no puedo sobreescribir el .jar en windows (maldito windows y su erotismo  ). Según e investigado, windows pone un lock en el jar para que sólo pueda leerse, con lo que al intentar que truezip sobreescriba el jar con el identificador me da un error. Para bien o para mal (y a falta de probar que funcione todo bien en linux) el identificador me lo deja fuera del jar, pero lo puedo cargar desde fuera. No es lo que quiero, pero dentro de lo malo....
_________________ Descargue el gestor de mp3 "Music Manager" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)
|
|
|
|
 |
hipersayan_x

Forista Distinguido
Registrado: Jue Abr 26, 2007 11:00 pm Mensajes: 1426
|
 Publicado: Lun Sep 20, 2010 4:24 pm |
|
Entonces tendrías que lanzar un 2° proceso independiente del 1° y que contenga la firma , finalizar el 1° proceso, el 2° sobrescribe el 1°, se lanza nuevamente el 1° proceso independiente del 2°, y se finaliza el 2°. Complicado, eh? 
_________________ "Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit."
"Finibus Bonorum Et Malorum", Cicerón
|
|
|
|
 |
akodo

Moderador
Registrado: Mié Nov 28, 2007 12:00 am Mensajes: 1361 Ubicación: En la X del explorer (pulse para llamar)
|
 Publicado: Jue Sep 23, 2010 3:11 pm |
|
Me reitero en lo que dije en mi último post (maldito windows y su erotismo  ), eso, y que además no sé leer (ni en inglés ni en español). Dos días para hacer que la cosa funcione, y al fin puedo decirlo FUNCIONA!!! y lo que es más importante EN WINDOWS!!!! He tenido que crear un nuevo jar a partir del existente, al que le añado la clase que genero (que tiene el identificador). Borrar el antiguo jar y sustituirlo por el nuevo. Fácil, sencillo y para toda la familia... hasta que aparece windows. He tenido que hacer un pequeño jar que lo único que hace es renombrar el archivo que se le indica para que sea llamado en caso de que no pueda el programa principal no pueda hacerlo  (~ 2 KB de jar) Me he estado 2 días pegándome en plan emoticono  porque al renombrar el archivo, al menos en windows, no me lo permite hacer si ya hay un archivo con ese nombre (no puedo sobreescribirlo). Lo pone en el javadoc (como causa posible de fallo), pero no se leer Me quedo con lo único bueno que tengo por el momento: ya no necesito el paquete truezip! (eso es medio MB que quito al paquete, y que lo cambio por unos pocos KB)
_________________ Descargue el gestor de mp3 "Music Manager" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)
|
|
|
|
 |
|
|
|
Página 1 de 1
|
[ 15 mensajes ] |
|
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados
No puede abrir nuevos temas en este Foro No puede responder a temas en este Foro No puede editar sus mensajes en este Foro No puede borrar sus mensajes en este Foro No puede enviar adjuntos en este Foro
|
|