Ver Mensaje Individual
  #28  
Antiguo 28-03-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.141
Reputación: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Muchísimas gracias a todos por vuestro interés en el asunto que planteo en este Hilo. Voy a tratar de continuar respondiendo a lo que se ha comentado en mi ausencia.

Román, dices de hacer uso de una variable global en donde se almacenaría el número de serie correcto (generado en el programa) para compararlo con el introducido por el usuario. Acto seguido habría que dar a dicha variable global otro valor. ¿Pero esto funcionaría?

Lo digo porque esta mañana comprobé que el número de serie correcto (insisto, generado en el propio programa) aparecía en la memoria incluso cuando este no era albergado en ninguna variable. O por mejor decir, el algoritmo que construye el número de serie correcto ofrecía su resultado a la propia función ("StrLCopy") encargada de copiarlo a cierta variable... que era ¿liberada? de la memoria acto seguido de utilizarla.

Es decir, que parece que sólo conque el número de serie sea generado este ya aparecerá completo en la memoria... o eso se deduce de las pruebas que he llevado a cabo, si omitimos el echo de que no llegué a hacer uso de las funciones que propuso el compañero basti más arriba. Tal vez esto último es algo que tendría que comprobar antes de nada.

Seoane, dices de utilizar un "hash", de comparar el "hash" del número de serie con el introducido por el usuario. Y dices que podríamos guardar dicho "hash" incluso en una constante, puesto que, como bien dices, del "hash" no se puede colegir el número de serie. Es cierto, pero, también lo es que no podemos guardar el número de serie correcto como una constante, sencillamente, porque este no es un valor constante: no hay un número de serie correcto para todos y con el que podamos comparar los intentos del usuario.

De hecho el número de serie ha de generarse por el propio programa, a partir de un número base y una clave de usuario. Es decir, un número de serie se "calcula" a partir de la clave de un usuario. Sin conocer esta última no es posible generar el número de serie correspondiente. Entonces, si al cabo hay que generar el número de serie (para luego obtener su "hash"), ¿no estaríamos en el mismo problema en que estamos? Es decir, a partir de que podamos calcular el "hash" de un número de serie quiere decirse que habremos generado dicho número de serie... y ya estará en la memoria... o me equivoco.

Casimiro, dices que acaso no merezca la pena trabajar en estos menesteres, y puede que lleves razón. Es algo que me he planteado también. Liberar el programa, adjuntar incluso su código fuente, y, bueno, que quien quiera pueda realizar una donación o "algo" para que uno (que trabaja en el programa) se vea compensado de algún modo. El problema es este, precisamente: que uno se quiera ver recompensado, es decir, que no se vea así ya. De hecho como digo es una opción más la de liberar el programa, hacer innecesario el uso de ningún número de serie y aquí paz y después que salga el sol por donde salga.

Sin embargo ahora mismo esto que se trata en este Hilo es más bien una especie de reto: se plantea un problema y quiere encontrarse su solución. Independientemente de que en el futuro se quite el problema del medio (y no haya que buscarle solución) lo cierto es que no quisiera evitar el problema... es decir quitarle del medio sin saber antes que al fin y al cabo es algo que tiene solución o soluciones. No digo que tú quieras deshacerte del problema, o no lo digo en ese sentido: creo que sé por dónde vas y ya digo que en cierto modo estoy bastante de acuerdo contigo.

Continúo. Veo que antes de publicar esto Seoane ha conseguido "romper" su propia protección... Aunque no de la misma forma en que yo he propuesto, es decir, según yo aunque comparemos "hashes" el número de serie ha de calcularse en el programa y pasará a poder verse en la memoria con un programa como WinEx. Se verán los "hashes" y no se podrá hacer nada con ellos, de acuerdo, pero también se verá el número de serie, si no estoy metiendo la pata con mi planteamiento, claro está.

Y esto me hace pensar que acaso logre solucionar el problema que me ocupa pero todavía pueda obtenerse un número de serie válido o a lo menos evitar el registro del programa. Probablemente esto sea así. Pero ahora me preocupa cómo quitar el número de serie de la memoria RAM. Si luego hay otros modos o no los hay de saltarse la protección del programa... eso se verá en su momento llegado el caso.

Habéis hablado también (Neftalí mayormente) de que el programa no debería dejar ver a las claras que ha sido o no registrado correctamente. De hecho así es. En el caso del programa que nos ocupa es el usuario quien se encarga de abrir el diálogo para registrarlo. En este diálogo (formulario) el usuario ha de proporcionar su clave de usuario y su número de serie. Si el registro es correcto... no pasa nada, aparentemente. Si es equivocado, tampoco damos al usuario ninguna señal de que el programa no se ha registrado correctamente.

La advertencia de que el programa no está registrado digamos que se produce cuando el usuario ejecuta ciertas acciones. Vale que alguien que sepa de estas cosas puede tratar de localizar el "salto" de dicha advertencia, y quitarla del medio antes de que aparezca. Esto seguramente puede hacerse. También es verdad que yo podría tratar de complicar un poco las cosas. Es decir, en lugar de avisar con una advertencia al usuario de que el programa no está registrado... tal vez podría además hacer que mientras el programa lleva a cabo alguna de sus acciones (o varias de ellas) se compruebe su registro y "salte" en el momento.

Esto haría las cosas más complicadas al "cracker"... porque en lugar de evitar una advertencia tendría que evitar más de una, y además no sabría, hasta que no lo pudiera comprobar por sí mismo como usuario del programa, cuántas advertencias existen, y dónde existen. Pero en fin, como he dicho, comprendo que alguien con los suficientes conocimientos y la paciencia de rigor conseguiría saltarse las advertencias que se le pusieran por delante: no soy yo mejor que los que diseñan la protección de Windows, por ejemplo, y esta siempre acaba "saltándose" de varias formas además...

Pero me preocupa ahora lo del número de serie. Cómo demonios hacer que un dato que conocemos tras un cálculo en el programa, y que luego utilizamos, sin embargo desaparezca de la memoria, no deje rastro alguno y no pueda ser averiguado, por lo tanto. Esto es lo que me preocupa ahora. Y después de escribir todo esto (aunque estanto un poco dormido aún) sigo pensando en que una posible solución puede ir por donde Neftalí apunta: tal vez generar "trozos" del número de serie, y comparar estos trozos con sus correspondientes pares.

De este modo seguirían viéndose trozos del número de serie correcto en la memoria, pero, ya complicaría el asunto bastante, puesto que a ver cómo y de qué manera se pone uno a "juntar" los trozos a poco que sean unos cuantos... se me hace que el "cracker" tendría entonces que tirar por otro camino y desde luego no podría obtener el número de serie "completo", mondo y lirondo, de la memoria ocupada por el programa.

Bueno. No sé. Digo que lo de partir el número de serie correcto en trozos podría funcionar, pero, lo cierto es que aún no sé cómo llevar a cabo esto. Se admiten ideas y sugerencias y yo por mi parte os mantendré informados en caso de avanzes o retrocesos en este sentido.

Otra vez muchas gracias a todos por vuestro interés. Y disculpad el rollazo.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita