![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Hola,
Yo de nuevo. ![]() Oyes Neftalí... ¿sabes que lo de comprobar el número de serie por partes puede acaso ser una solución? Pero no se me ocurre cómo... de momento... y puede que nunca. ![]() El caso es que, efectivamente, ni siquiera quitando del medio la función "Resultado", es decir, comparando el número de serie del usuario con la cadena resultante del cálculo del número de serie... es decir, comparando una variable con "un valor" (no una variable) que se conforma en el momento... aun así el número de serie, o sea el "valor" queda en la memoria... Así que como no sea partiendo el número de serie, de modo que quede... pero irreconocible, pudiera ser una buena opción. Ahora toca averiguar cómo demonios hago esto, porque no se me ocurre... no sé... ![]() |
|
#2
|
||||
|
||||
|
Hola,
Joroba... ahora me doy cuenta de que no he terminado de probar el asunto del modo que lo planteaba el compañero basti, es decir, lo hize como Seoane explicó, pero, no llegué a "actualizar" a lo que basti comentaba... y ahora no sé si hacerlo, puesto, que, llegando a estar el número de serie correcto en memoria incluso aunque no esté en una variable... ¿no invalida esto el método propuesto por el compañero basti? Quiero decir, si tras intentar del mejor modo que he sabido lo que propone Seoane llego a la conclusión de que, efectivamente, el número de serie sigue permaneciendo en memoria (si estoy metiendo la pata me corregís por favor), puesto que en algún punto del programa ha de componerse para poderlo comparar con el que propone el usuario... Parece que de todas formas la posible solución pasa (sin ir más allá...) por lo que dice Neftalí (¿o me equivoco?), es decir, no llegar nunca a formar el número de serie completo, sino hacerlo por partes... para que aunque aparezcan estas partes sea complicado reunirlas a todas y conocer así el número de serie. Ahora bien, quedaría entonces cómo comparar el serial del usuario (por partes) con el serial correcto que hemos de generar (también por partes...)... ¡jo, jo, jo, jo! ![]() |
|
#3
|
||||
|
||||
|
Cita:
Lo siguiente es evitar comparaciones directas; Simplemente, porque no siempre se necesita encontrar el Serial, a veces basta con "Parchear". Es decir, si yo no encuentro el Serial, pero veo tres comparaciones que dicen: En este caso optaría por "parchear" los tres != por tres =. Ya se que el tema se va complicando, pero son cosas que hay que tener en cuenta; La mayoría de sistemas anticopia (serios) ya hechos tienen en cuenta estas cosas y muchas más... En ese caso a la hora de comparar dos valores, podemos utilizar por ejemplo la resta para saber si da cero, funciones del tipo CHAR y Ord (aplicándolas a los dos) para no comparar los valores exactos, sumar y restar a ambos un valor,... Aunque desde delphi parece una tontería hacer esto:
Para el que está revisando el código en ensamblador supone uno o varios saltos, cosa que dificulta mucho a la hora de seguir el código (las llamadas a funciones); Pensad que si se van aplicando diferentes a cada comparación, al final la cosa se hace muy compleja para el que está revisando la pila y los registros.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi ![]() P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. Última edición por Neftali [Germán.Estévez] fecha: 27-03-2007 a las 18:30:48. |
|
#4
|
||||
|
||||
|
Cita:
Llegados a este punto, creo que el menor de los problemas sería el como ocultar la forma y el modo de como cotejar una clave, dado que llegados a ese nivel y si resulta de interés, el invasor no se iba a preocupar de la clave, sino que se preocuparía de ver cual es el procedimiento que le hace salir del programa (por ejemplo) y que otras alternativas o saltos de programa tiene para que este funcione adecuadamente, para a continuación parchear y a disfrutar.... Creo yo... ![]()
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO |
|
#5
|
||||
|
||||
|
Una pregunta en cuanto al borrado del dato:
¿Qué no puede usarse simplemente una variable global y asignarle otro valor? No hay stack donde quede nada y la variable se ha reescrito. // Saludos |
|
#6
|
||||
|
||||
|
Cita:
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi ![]() P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
|
#7
|
||||
|
||||
|
Una vez participé en un proyecto de "seguridad" para evitar que "piratearan" los programas de la empresa donde trabajaba. Tuvimos en cuenta lo que habéis comentado y un montón de cositas más, el proyecto duró 7 meses y éramos 3 personas dedicadas únicamente a eso, en su día tuvo un presupuesto de 60.000 euros. Buscamos información de todos los métodos conocidos hasta la fecha, documentos, libros, consultas a algunos expertos, etc.
Entre nosotros había uno, no era yo, que decía constantemente: "no vale la pena tanto tiempo y dinero en protegerlo, lo mejor es que lo copien y lo usen aunque sea gratis y que no use el de la competencia". Pues bien, a la semana de sacar el programa, un chaval ruso que además nos envió un gracioso email, publicó un keygen para el programa, que además de ser más simple que nuestro propio programa, era más rápido, pequeño, cómodo y seguro. Nos quedamos con la boca abierta, nos miramos los unos a los otros y pensamos: "¡¡¡cómo podemos ser tan malos programadores!!!". Moraleja: sin comentarios ![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
|
#8
|
|||
|
|||
|
Cita:
Aqui en Mexico diriamos, "para chingon, chingon y medio". ![]() Salud OS.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney |
|
#9
|
||||
|
||||
|
Y si cambias el planteamiento. Hasta ahora estas comprobando lo que inserta el usuario, tal cual, con un numero "generado". Pues bien yo te propongo lo siguiente: tomar el valor que introduce el usuario y calcular su hash (md5 por ejemplo), entonces comparamos su hash con el que tenemos guardado, en una constante porque no nos importa que lo vean en la RAM. Y no nos importa porque aunque alguien conozca el hash nadie puede saber que numero tiene que introducir para obtener ese hash. Sencillo y efectivo, esta es la magia del Hash
![]() |
|
#10
|
||||
|
||||
|
Y para continuar mi mensaje anterior un poco de código:
La clave correcta en este caso es "Pepe" pero como ves no aparece por ninguna parte, ni en el código, ni en memoria, ni en ningún sitio. Solo aparece su hash, pero a partir de su hash no podemos obtener la clave. PD: La unit hashes se puede encontrar aquí http://www.clubdelphi.com/foros/show...22&postcount=4 |
|
#11
|
||||
|
||||
|
Seoane, como siempre, es brillante la visión de la jugada que aportas....
He estado leyendo el hilo y no me ha dejado hacer la digestión en condiciones. Estuve pensando sobre el tema en un planteamiento relativamente parecido. La idea en sí, es tener un valor previo codificado... Por el sistema que fuera. En este caso mis pocas neuronas pensaron en un algoritmo de movimientos o/y complementos de bits hasta hallar una serie mas o menos complicada, y con la clave introducida, realizar el mismo movimiento y posterior comparación. En definitiva, la codificación por el método que sea. Obviamente la serie codificada e885d567f57b0f87333c25f7f3a1e381 tendría que ser previamente tratada antes de ser introducida en el propio código del programa. Creo que mas o menos el planteamiento tuyo pero obviamente mas sencillo y versátil. Hace años y basándome en esto mismo que digo, hice un pequeño código en ensamblador, pero realmente esta codificación afectaba al propio código del programa, de tal manera que dejaba dentro de la rutina espacios de memoria a cero (NOP), la rutina se auto-descodificaba y se movía a esa porción de memória para seguidamente dar un salto al nuevo código...
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| eliminar datos con dbgrid | UREÑA | Conexión con bases de datos | 20 | 30-03-2007 23:41:32 |
| Eliminar Datos eficientemente | k_rito | Conexión con bases de datos | 5 | 27-11-2006 00:44:45 |
| Cómo obtener ciertos datos de los archivos ejecutables y librerías | StartKill | Varios | 1 | 14-08-2006 23:10:01 |
| Eliminar del memoria los querys | Aura | OOP | 4 | 01-04-2004 17:40:40 |
| Eliminar datos de una tabla DBF | vicvil | Tablas planas | 4 | 16-05-2003 21:17:46 |
|