![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
¿Cómo evitar que una DLL se ejecute antes que cualquier otra cosa de mi programa?
¡Hola a todos!
Pues eso. Hace poco me propuse validar las licencias de mis programas "online", de modo que los "keygen" que había por ahí ya no funcionan. Sé perfectamente que la lucha contra la piratería está perdida de antemano, pero, me ha resultado curioso el "crack" que se ha ideado cierto "cracker" (por lo visto español) para saltarse las licencias de mis programas. Veréis. El "crack" de este hombre consiste en una DLL de nombre "shfolder.dll" que hay que situar al lado de los ejecutables de mis programas. Dicha DLL, en efecto, hace su trabajo, y, mis programas aparecen como "registrados". Pero este no es el tema que yo quiero tratar. El caso es que yo he tratado de contrarestar el "crack" de estos modos: 1º En el formulario principal, en el evento "OnCreate", comprobando que exista cualquier DLL en el directorio del programa, y, si es así, cerrar el programa. Este "contraparche" no tardó nada en saltárselo el "cracker", publicando una nueva versión de su "parche" que hacía inútil mi comprobación. 2º En el bloque "inicialización" de una unidad situada en primer lugar en mi programa, de modo que, según yo (equivocadamente) es el primer código que se ejecuta. De nuevo, se trata de comprobar si existe un archivo DLL, y, cerrar el programa si es así. Pero el "cracker" contrarestó de nuevo y dejó mi intento otra vez en nada. Ahora bien, entonces, mi pregunta es, ¿qué demonios pasa? ¿Cualquier DLL (de nombre "shfolder.dll" u otra) situada en el directorio de mi programa se cargará sin más antes que mi programa y podrá hacer con el mismo lo que quiera? A mí me da la risa (literalmente), porque, ciertamente, no es algo que pueda evitarse, según me parece. La DLL en cuestión "shfolder.dll" es en efecto usada en mis programas, puesto que ella se incluye en la unidad "Winapi.SHFolder.pas" de la VCL de Delphi, que sirve para obtener las rutas de ciertos directorios del sistema como "Mis Documentos", etc. Parece ser que, al incluirse dicha DLL sin indicar una ruta absoluta, Windows carga la DLL que se encuentre en el directorio de nuestro programa. Realmente a mí me llama la atención que nuestro programa no pueda hacer nada contra eso, al menos no tratando de localizar dicha DLL previamente, puesto que, como he indicado arriba, aunque uno compruebe la existencia de la DLL en un código que, supuestamente, será el primero en ejecutarse, en realidad no sucede así y el código de la DLL se ejecuta primero. Me parece que esta técnica se llama "DLL hijacking", pero, poca información se encuentra en Google en relación a Delphi, sino es que deberíamos indicar las rutas absolutas de las DLL, lo que implicaría tocar el código de la VCL, y, posibles problemas también, puesto que tal vez no sea tan sencillo indicar las rutas de las DLL de forma absoluta para distintas versiones de Windows, por ejemplo. En fin, ya no os aburro más, porque, como digo, en realidad lo de la piratería es lo que menos me preocupa. En realidad mi "post" surge de la necesidad de saber cómo evitar dichas DLL... pero no tanto por el caso particular del "crack" que han creado para mis programas, sino porque, en efecto, igual que este "crack" podría ser cualquier otro tipo de código "malicioso"... ¡Un saludo a todos, espero que estéis bien y podáis ayudarme en algo! ![]() Última edición por dec fecha: 08-11-2016 a las 19:09:53. |
#2
|
|||
|
|||
Eso se soluciona encryptando las funciones de la dll y los llamados (si la dll es de tu propiedad y cuentas con el codigo), tambien puedes generar la validacion desde hardware id (disco duro, tarjeta de red u otro).
Saludos. |
#3
|
||||
|
||||
Hola,
Cita:
![]() |
#4
|
||||
|
||||
Vaya, qué curioso. Lucha de titanes
![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#5
|
||||
|
||||
¡Hola a todos!
Na... es un caso perdido Casimiro! Peeeeeeeero.... Gracias a la ayuda del proyecto Inno Setup y de esta su unidad, acabo de cargarme el último "crack", es decir, la DLL "shfolder.dll" no es cargada ya antes que el código que comprueba su existencia... de modo que el programa se cierra si la DLL existe. ¿El próximo paso? Lo dará el "cracker", estoy seguro. ¿Mi objetivo? Ahora no lo tengo tan claro (mira que ponerme a perder el tiempo en esto...), pero, hace unos días pensaba que me conformaría conque el "crack" en cuestión tuviese que "tocar" el programa, de modo que "mi firma" se rompiese. Con esto me conformaba hace unos días. Puesto que a partir de ahí... creo que tengo la batalla completamente perdida. P.D. Acabo de actualizar todos mis programas ahora mismo... de momento van tres parches y otros tantos "contraataques". A ver qué pasa mañana. Je je je... me lo tengo que tomar a risa esto. ![]() ![]() |
#6
|
||||
|
||||
Ya te digo, esto da para una película y todo
![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#7
|
||||
|
||||
#8
|
||||
|
||||
¡Hola a todos!
Siguiendo con el tema... no... todavía no he visto el nuevo "crack", aunque tal vez no se tarde mucho. El caso es que me llama la atención lo siguiente, y, es que incluso llamando a la función "SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32)", mejor dicho, sólo con esto, la DLL en cuestión hace su trabajo y consigue "registrar" el programa o "anteponerse" al código del mismo. O sea, que, curiosamente, si después de ejecutar la función de marras, compruebo si existe la DLL, en efecto, parece que la comprobación es correcta y así el programa se cierra. Pero, si no compruebo la existencia de la DLL el programa sigue adelante sin problemas, esto es, cargando la DLL "shfolder.dll" que se encuentra en el directorio de la aplicación y no en el directorio del sistema... La verdad es que esto desconcierta a cualquiera... esto es, se supone que usando la función "SetDefaultDllDirectories" estamos indicando a Windows que busque las DLL en el directorio del sistema, donde, en efecto, se encuentra una DLL "shfolder.dll", pero, aún y con esas la DLL que copiamos en el directorio del ejecutable del programa parece seguir cargándose antes sin problemas... Vamos, que me espero al cuarto "crack", pero no tengo muchas esperanzas. ![]() ![]() |
#9
|
||||
|
||||
¿Estás haciendo pruebas con un programa mínimo, limpio, sin nada más, solamente hecho para probar eso?
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#10
|
||||
|
||||
Cita:
Aquí está la documentación. Por otro lado podrías intentar mirar a otro frente. Imagino que la DLL debe "parchear" en cierta manera el comportamiento del programa en cuanto al registro. Ese comportamiento normalmente se deduce utilizando debuggers. ¿Has probado a dificultar este paso? No es imposible, porque como tú bien dices con tiempo al final todo se consigue, pero se puede llegar a complicar, de forma que quien lo está haciendo llegue a desistir si el esfuerzo es demasiado grande. Esta también va en el mismo sentido. Tú mismo puedes buscar, pero además de herramientas externas, hay mucha otra documentación al respecto.
__________________
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: 09-11-2016 a las 15:14:32. |
#11
|
|||
|
|||
![]() Interesante la trama. Espero con ansias el desenlace.
![]() |
#12
|
||||
|
||||
Hola,
Ciertamente no, Casimiro, aunque, mis programas (porque ojo, hablamos de seis de ellos...) no hacen nada raro con las DLL ni nada... de hecho se distribuyen sin empaquetar siquiera. Creo yo que en un programa "limpio" ocurriría igual, pero, no lo he probado. Fíjate que el proyecto Inno Setup, así como otro instalador, NSIS, se preocupan de esto... en efecto, una simple DLL como "shfolder.dll" pude interponerse en el código de nuestro programa, sin modicar ningún ejecutable, y, conseguir, pues... lo que quiera, digo yo... |
#13
|
||||
|
||||
Hola,
Cita:
Sin embargo, como he dicho, no parece funcionar del todo bien... es cierto que el último "crack" de que tengo constancia no funciona, pero, está lo que no me cuadra: tengo que comprobar que la DLL exista, cuando, en teoría (hasta donde yo llego) no sería necesario, puesto que dicha DLL no se cargaría, puesto que lo haría la que se encuentra en el directorio del sistema. Curiosamente, la función en cuestión se ejecuta sin errores, de modo que tampoco puedo ver si algo falla. Respecto de ponérselo más difícil al "cracker", en efecto, podría intentarse, por ejemplo, usando algún programa "empaquetador" y "protector". Pero, hete aquí que cualquier programa de este tipo que uno busque está a su vez "crackeado"... entonces, ¿qué confianza me ofrece un programa que se supone va a proteger mi ejecutable, si el propio programa no puede protegerse a sí mismo? Ninguna. Por otro lado, me constan programas que usan este tipo de protectores y que están "crackeados". Pudiera ser que este "cracker" en concreto no supiese ir más allá... pero posiblemente otro podría hacerlo. En todo caso, el sistema que uso ahora no me disgusta, en el sentido de que los keygen, por ejemplo, no fucnionan. Como ahora compruebo las licencias "online", ya no sólo vale que uses un número de serie "formalmente" válido, porque este no se encontrará en la base de datos remota. Mi objetivo, como he dicho arriba, es que al menos tengan que "parchear" los propios ejecutables... De este modo la firma de mis ejecutables se perderá, y, bueno, yo con eso me medio conformo, aunque, tengo que reconocer que el medio conformo viene de que no sabría ir más allá: si el "cracker" es capaz de meterse en el código del programa y saltarse la función que valida la licencia "online"... creo que no sabría cómo contrarestarlo. Pero ya digo, al menos tendría que parchear el programa, cosa que ahora mismo (bueno, ya veremos si hay cuarto "crack") no necesita, puesto que con poner al lado del programa una DLL ya le basta y le sobra al cabrito. ![]() ![]() |
#14
|
||||
|
||||
Hola,
Sí, je je je. De momento no he visto un cuarto "crack", pero, seguramente no tardará. ![]() ![]() ![]() |
#15
|
||||
|
||||
Cita:
le indicas a tu aplicación que incluya la dll implícitamente, esto es, añade código que carga automáticamente la dll muy posiblemente antes de que cualquier código tuyo tenga la oportunidad de detenerlo o decirle dónde buscar. Yo creo que lo más seguro sería, en la medida de lo posible, que te olvides de esa unidad y la hagas tú mismo (creo que son pocas funciones). Esto significa que uses tú mismo LoadLibrary y GetProcAddress para cargar la biblioteca exactamente de dónde la quieres e importar las funciones. De todas formas, no me queda claro cómo esto te puede servir. Vamos a suponer que logras forzar la carga del shfolder.dll que está en el sistema. Pero estamos hablando del sistema del cracker. ¿Qué le impide al cracker reemplazar aunque sea temporalmente la bilbioteca del sistema, localizada en su directorio de sistema por la suya propia? LineComment Saludos |
#16
|
||||
|
||||
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. |
#17
|
||||
|
||||
Cita:
LineComment Saludos |
#18
|
||||
|
||||
¡Hola a todos!
Cita:
Cita:
¡Y todo esto para conformarme conque tengan que "tocar" el programa! Porque de llegarse a ese punto... allá el usuario que quisiera usar un programa "parcheado". Y además yo no podría hacer más, la verdad sea dicha. Por otro lado, esto está relacionado con esto otro: Cita:
|
#19
|
||||
|
||||
Hola,
Cita:
![]() |
#20
|
||||
|
||||
Hola,
Cita:
![]() ![]() ![]() ![]() |
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Como evitar q se ejecute el Explorer.exe | ing_arismendy | API de Windows | 3 | 02-02-2009 06:13:08 |
Como evitar que una apicacion se ejecute dos veces. | manitoba | C++ Builder | 4 | 28-05-2007 16:50:04 |
Como evitar que se ejecute el msn | JODELSA | Varios | 7 | 26-12-2005 14:17:22 |
Cualquier cosa me puede servir | cmgenny | Conexión con bases de datos | 1 | 02-07-2003 22:27:24 |
![]() |
|