![]() |
![]() |
![]() |
![]() |
![]() |
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 ocultar información para que no se vea en un ejecutable
Hola amigos tengo una duda ojala alguien de ustedes me pueda ayudar, es algo urgente y delicado para mi trabajo.
Tengo en mi trabajo muchas aplicaciones muy estables desarrolladas en Delphi 7, manejamos dbexpress para las conexiones a la base de datos. No me había dado cuenta que si intentamos abrir el exe desde un block de notas muestra todos los datos de la conexión, servidor, usuario y password. Existe alguna forma de ocultar o encriptar esta información de modo que no sea visible y no ponga en riesgo la seguridad de la empresa. Ejemplo de una parte de datos que me muestra al abrir el exe con el bloc de notas Código:
bvLoweredTabOrder TLabelLabel3Left TopWidth1Height Caption Database: TLabelDatabaseNameLeft[TopWidthHeight TBevelBevelLeftTopWidthþ Height Shape bsTopLine TPanelPanel1LeftTopWidthý HeightAAlignalBottom BevelOuterbvNoneTabOrder TLabelLabel1LeftTopWidth8Height Caption&User Name:FocusControlUserName TLabelLabel2LeftTop$Width1Height Caption &Password:FocusControlPassword TEditUserNameLeftVTopWidth™ Height MaxLengthTabOrder TEditPasswordLeftVTop!Width™ Height MaxLengthPasswordChar*TabOrder TPF0TMDataMDataOldCreateOrderOnCreateDataModuleCreateLeftITopfHeight¸Width÷ TSQLConnectionSQLConnection1ConnectionNamePOWER6 DriverNameCA400 GetDriverFuncgetSQLDriverCA400LibraryNamedbexpca400.dllLoginPromptParams.StringsDriverName=CA400Database=168.1.1.50User_Name=usersisPassword=Ori147HServerCharSet=ErrorResourceFile=LocaleCode=0000BlobSize=-1 RowsetSize=-1 RoleName=CA400 TransIsolation=DirtyReadCommitRetain=TrueAutoCommit=TrueCustom String=/trace=0Connection Timeout=-1Trim Char=True VendorLib cwbdb.dllLeft Top TSimpleDataSetSDSCp11pfGrados Aggregates ConnectionSQLConnection1DataSet.CommandText Última edición por Neftali [Germán.Estévez] fecha: 11-01-2016 a las 11:58:30. Razón: Añadir TAGs al código |
#2
|
||||
|
||||
Lo más simple y rápido, ahora mismo, es usar algo como UPX o similar.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#3
|
||||
|
||||
Ya que usas Sql Server, es mejor que uses "Seguridad Integrada":
http://www.connectionstrings.com/sql-server-2012/ Eso hace que la autenticacion pase por el OS. Es mas seguro. El uso de usuario/clave es desaconsejado para la mayoria de los casos y solo se usa para acceder a BD remotas por fuera del dominio/maquina
__________________
El malabarista. |
#4
|
||||
|
||||
Eso pasa porque esta todo en tiempo de diseño en tu componente connection
Lo mejor que podes hacer es asignar la ConnectionString en runtime, pasando los credenciales como string literales; no los almacenes como constantes o recursos |
#5
|
|||
|
|||
Por la librería de conexión "dbexpca400.dll" pensaría que se está conectando a un IBM ISeries (AS400). Si es así en este caso no aplica la "Seguridad Integrada".
|
#6
|
|||
|
|||
Es correcto la base de datos que manejamos es DBD2 DEL AS/400
|
#7
|
||||
|
||||
No sera mejor indagar en temas de ofuscacion?, o sera algo asi como que exe tambien se va en debug y no release?
Saludos!
__________________
all your base are belong to us |
#8
|
||||
|
||||
En tal caso, la opcion mas recomendada es poner los datos en una ubicacion aparte y leerlo de forma dinamica. Puede ser un archivo que se le aplique los permisos adecuados, o usar mucho mejor el api:
https://msdn.microsoft.com/en-us/library/ms995355.aspx Y esto en delphi: https://stackoverflow.com/questions/...ord-in-windows Esto entonces plantea como alimentar la primera vez esa info. La idea es que puedes por ejemplo pasarlo en un archivo, guardarlo de forma segura en el keylocker y borrar el archivo.
__________________
El malabarista. |
#9
|
||||
|
||||
Yo habitualmente para temas de password, los añado al código (no al DFM) con una encriptación sencilla o en algún fichero de configuración con técnica similar.
Y en tiempo de ejecución se asignan esos parámetros.
__________________
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. |
#10
|
||||
|
||||
Una posible solución de efectos inmediatos podría ser cargar los valores que se desean ocultar llamando a funciones que devuelvan esos valores.
Hace tiempo nos piratearon un programa mediante un debugger. Generábamos la clave de registro y era almacenaba en una variable, luego la comparaba con la que tenía asignada la instalación del programa. Al asignarla a una variable, dicha clave se veía mediante el debuger. Cambiamos a devolverla mediante una función y ya no aparecía en toda la traza. Es algo sencillo y funciona.
__________________
http://www.gestionportable.com |
#11
|
||||
|
||||
Cita:
Hay que tener en cuenta mensajes de error, mensajes al usuario, nombre que se definen en las funciones, nombres que se definen a las constantes/variables, y bastantes cosas más. Normalmente lo primero que se hace es atacar al valor de una variable o constante (como comenta pacopenin), pero también al momento de la comparación. Es decir, que por muy complicada que sea la forma de almacenar la clave o de calcularla, al final lo normal es hacer un... "si este valor es igual a este" o "si son diferentes" dejo ejecutar o no (el registro es correcto o no). Y a ese punto es al que se ataca. Modificando un JZ por un JNZ o JE por JNE, lo que se consigue es "negar" la comparación, por lo tanto, cualquier clave incorrecta pasa a devolver correcta (excepto la buena ![]() ![]() Es un ejemplo, pero si alguien que sepa utilizar un debugger está pirateando nuestro programa, las técnicas y las estrategias para protegerlo o al menos para ponérselo más difícil son diferentes.
__________________
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. |
#12
|
||||
|
||||
Siempre puedes usar una codificación por XOR, de forma que sólo funcionará con la clave correcta y con ninguna otra. Incluso aunque usen depuración les costará.
|
#13
|
||||
|
||||
Cita:
Expongo un ejemplo de esa rutina en delphi, esta función se ejecuta en la app externa y en la aplicación que esconde cadenas u otro tipo de dato:
Saludos. |
#14
|
||||
|
||||
Cita:
Saludos. |
#15
|
|||
|
|||
Haz que las condiciones vayan por llamadas dinámicas de tal manera que si no coinciden el programa no funcione, (esto es para reemplazar condiciones del mismo)
tambien añade un manejador de excepciones para evitar errores cuando la llamada sea incorrecta, Luego para ofuscar las strings, si se trata de un password te recomiendo que uses MD5 para conocerlas por colisión. Última edición por Reasen fecha: 09-01-2016 a las 00:18:03. |
#16
|
||||
|
||||
Cita:
Saludos, |
#17
|
|||
|
|||
hacer copias de la funcion que verifica si esta todo bien y llamarla desde diferentes puntos de codigo es a lo que se refiere
pero es una tecnica poco eficiente pues es tan simple como hacer un script con ollydbg que fixee esos Opcodes. |
#18
|
||||
|
||||
Cita:
Saludos. |
#19
|
||||
|
||||
Cita:
Cita:
O sea, por ejemplo, En lugar de una función Verify() que regresa un boolean.... ¿Tendría que tener N funciones Verify()? ¿Tampoco debería evitarse hacer algo como esto?
Y quizá algo más seguro sea:
Me interesa un poco el tema, pero yo estoy en cero en tema de seguridad anti-copias, anti-cracks, etc. Y por ello me quedé con la duda de a como va la cosa. Saludos, |
#20
|
||||
|
||||
A lo que se refiere es que no hagas esto:
Inicia programa --> validar licencia Ya que es "facil" de encontrar en donde esta la funcion que verifica Mas bien, hay que meter la validacion regada por todos lados Hizo click en guardar como? -> Validar licencia Apreto combinacion de teclas control+3 para usar x funcion? --> Validar licencia Pidio imprimir? --> Validar Y asi |
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Como hacer un ejecutable unico para cada ordenador? | negrokau | Varios | 1 | 14-10-2011 14:21:39 |
Ocultar información en .exe ó .dll | JAV | Varios | 2 | 29-11-2007 23:25:06 |
Como obtener de la información de versión del ejecutable | Alcolea | Varios | 1 | 23-11-2006 23:50:32 |
¿cómo crear un archivo ejecutable para aplicaciones en java? | rls | JAVA | 11 | 12-07-2006 17:42:39 |
Como ocultar los discos duros mediante codigo ( Para Ciber) | IcebergDelphi | OOP | 0 | 17-12-2004 19:00:43 |
![]() |
|