Autor
|
Tema: Ofuscación de codigo en VB6 (Leído 21,493 veces)
|
OfTheVara
Desconectado
Mensajes: 46
|
Hola,
He escrito un programa en VB6 que usa una clave de registro, y quiero ponerselo complicado al hacker, en la medida de lo posible. O al menos, no tan facil.
Leí que para ofuscar código conviene cambiar el nombre a las variables y las funciones. Pero he visto en los programas de Decompilación que lo que te aparece son nombres genéricos, como "var_510C91=57".
Osea, ¿cambiar el nombre de las variables y procedidimientos sería una tontada gorda?
Estoy usando VBDecompiler v7.9 (tiene ya 12 años) para entender como se vería el código nativo desde el punto de vista de un decompilador.
Mi segunda pregunta es si conoceís algun Packer para VB6. Creo que esos programas te pueden inflar el código (añadiendo código basura) para dificultar el entendimiento. ¿habría que inflar el código o mejor comprimirlo?
Y ademas de todo eso, se me ocurren preguntas como, por ejemplo, la función crítica que quieres proteger, dividirla en varias funciones esparcidas por muchos modulos diferentes. ¿eso ayudaría? ¿o da igual que esté en un mismo modulo que en modulos diferentes?
Otra pregunta, ¿Si hago que se desborde una variable en mitad del codigo (por ejemplo Variable_Tipo_Byte=3450) para que salte a un "Goto Error", ¿ese tipo de saltos ayudarian a despistar?
muchas gracias
|
|
|
En línea
|
|
|
|
MCKSys Argentina
|
Hola! Osea, ¿cambiar el nombre de las variables y procedidimientos sería una tontada gorda?
El de las variables no es necesario, pero de los procedimientos si, pues se ven en el desensamblado. Mi segunda pregunta es si conoceís algun Packer para VB6. Creo que esos programas te pueden inflar el código (añadiendo código basura) para dificultar el entendimiento. ¿habría que inflar el código o mejor comprimirlo?
En el pasado hubo varios packers para VB6. Como es un producto discontinuado hace años, es difícil saber si los packers siguen soportándolo. En general, el packer agrega codigo, lo que hace que el ejecutable sea mas grande; pero dependiendo del packer, puede que no sea mayor problema. Y ademas de todo eso, se me ocurren preguntas como, por ejemplo, la función crítica que quieres proteger, dividirla en varias funciones esparcidas por muchos modulos diferentes. ¿eso ayudaría? ¿o da igual que esté en un mismo modulo que en modulos diferentes?
Todo lo puedas hacer para que el metodo que estás implementado no sea algo "lineal", mejor. No sólo dividir en varias partes, sinó que hacer chequeos random de cosas que no necesariamente hacen a todo el proceso. Por ej.si escribes algo en el registro, no verificas todo el contendio, sino partes y en distintos momentos. Otra pregunta, ¿Si hago que se desborde una variable en mitad del codigo (por ejemplo Variable_Tipo_Byte=3450) para que salte a un "Goto Error", ¿ese tipo de saltos ayudarian a despistar?
Si, pueden servir. Para reversers inexpertos que no entienden completamente cómo funciona VB6 internamente, suele servir. Pero no pienses que eso solo va a ser suficiente. Una idea: Si lo que escribes en el registro es una clave de activacion del software, puedes hacer que el chequeo de la misma sea en diferentes estados. Por ej: El chequeo "principal" (el que haces despues de hacer click en "registrar") puede hacer un chequeo "de alto nivel": que el codigo tenga largo X, empiece/termine/contenga cierto char o secuencia, que uno o varios de los chars sea un checksum, etc. Y luego, en forma random (por eventos, timers, etc) haces otros chequeos: que una parte del codigo cumpla con una funcion X, que partes del codigo sean igual a una cadena X (menos recomendable), que cierta operacion sobre ciertos chars de un valor numerico, etc. Saludos!
|
|
|
En línea
|
MCKSys Argentina "Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
|
|
|
OfTheVara
Desconectado
Mensajes: 46
|
Hola!
El de las variables no es necesario, pero de los procedimientos si, pues se ven en el desensamblado.
En el pasado hubo varios packers para VB6. Como es un producto discontinuado hace años, es difícil saber si los packers siguen soportándolo. En general, el packer agrega codigo, lo que hace que el ejecutable sea mas grande; pero dependiendo del packer, puede que no sea mayor problema.
Todo lo puedas hacer para que el metodo que estás implementado no sea algo "lineal", mejor. No sólo dividir en varias partes, sinó que hacer chequeos random de cosas que no necesariamente hacen a todo el proceso. Por ej.si escribes algo en el registro, no verificas todo el contendio, sino partes y en distintos momentos.
Si, pueden servir. Para reversers inexpertos que no entienden completamente cómo funciona VB6 internamente, suele servir. Pero no pienses que eso solo va a ser suficiente.
Una idea: Si lo que escribes en el registro es una clave de activacion del software, puedes hacer que el chequeo de la misma sea en diferentes estados. Por ej: El chequeo "principal" (el que haces despues de hacer click en "registrar") puede hacer un chequeo "de alto nivel": que el codigo tenga largo X, empiece/termine/contenga cierto char o secuencia, que uno o varios de los chars sea un checksum, etc. Y luego, en forma random (por eventos, timers, etc) haces otros chequeos: que una parte del codigo cumpla con una funcion X, que partes del codigo sean igual a una cadena X (menos recomendable), que cierta operacion sobre ciertos chars de un valor numerico, etc.
Saludos!
Gracias MCKSys! Entonces, le cambio el nombre a procedimientos, funciones y a los nombres de modulos y formularios. Las variables y Constantes no hace falta. Por ejemplo: PUBLIC Const Contraseña=345 ¿la palabra Contraseña no va a aparecer en ningun decompilador? Respecto al ultimo punto, yo lo que tengo es una key de 8 caracteres que mete el usario, por ejemplo: KeyEntrada="jeb8l9aq" El Hacker va encontrar ese string en el Decompiler. Eso es impepinable. A partir de ese string yo tengo que realizar operaciones con el valor ascii de esos caracteres para comprobar si es correcta. Es decir, al final tengo que componer un vector de 8 bytes: VectorKey(0 to 7) as byte Y sobre ese Vectorkey hacer las operaciones pertinentes. ¿como hago para despistar y que no me siga la pista desde el string hasta la composicion de ese VectorKey? por ejemplo, con un primer timer meto los 4 primeros caracteres en VectorKey. Con un segundo timer meto los ultimos 4. Con un tercer timer creo un VectorKey2 que a su vez copia los datos de VectorKey. Y, finalmente, con un cuarto timer hago las operaciones. ¿sería asi la idea?
|
|
|
En línea
|
|
|
|
MCKSys Argentina
|
Hola! Las variables y Constantes no hace falta. Por ejemplo:
PUBLIC Const Contraseña=345
¿la palabra Contraseña no va a aparecer en ningun decompilador?
No. Y sobre ese Vectorkey hacer las operaciones pertinentes. ¿como hago para despistar y que no me siga la pista desde el string hasta la composicion de ese VectorKey? por ejemplo, con un primer timer meto los 4 primeros caracteres en VectorKey. Con un segundo timer meto los ultimos 4. Con un tercer timer creo un VectorKey2 que a su vez copia los datos de VectorKey. Y, finalmente, con un cuarto timer hago las operaciones. ¿sería asi la idea? Como te dije antes, una buena idea es pensar la operacion de registro de modo que la verificación se pueda hacer en partes, en distintos momentos. Los diferentes chequeos deben ser suficientes para determinar si el registro es correcto, sin tener que ser los mismos entre sí. Además, repartirlos en diferentes modulos/funciones, aumenta la complejidad del análisis. Saludos!
|
|
|
En línea
|
MCKSys Argentina "Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
|
|
|
OfTheVara
Desconectado
Mensajes: 46
|
Hola!
No.
Como te dije antes, una buena idea es pensar la operacion de registro de modo que la verificación se pueda hacer en partes, en distintos momentos. Los diferentes chequeos deben ser suficientes para determinar si el registro es correcto, sin tener que ser los mismos entre sí. Además, repartirlos en diferentes modulos/funciones, aumenta la complejidad del análisis.
Saludos!
Y si ofusco el código con Themida, ¿me puedo despreocupar de los strings, de cambiar nombres, de hacer la verificación por partes, etc...? ¿o debo seguir haciendolo igualmente?
|
|
|
En línea
|
|
|
|
MCKSys Argentina
|
Hola!
Themida es un buen packer, pero VB6 tiene puntos débiles y alguien con experiencia lo puede evitar. No cometas el error de confiar sólo porque has usado un packer (el que sea).
Saludos!
|
|
|
En línea
|
MCKSys Argentina "Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
|
|
|
karmany
|
Efectivamente, como te dice MCKSys Argentina, Themida es un packer brutal pero VB6 tiene puntos débiles y uno de ellos es que todo programa llama a MSVBVM60.dll que está en system32 o sysWOW64, pero si tú creas un archivo modificado MSVBVM60.dll y lo dejas en el mismo directorio de tu programa, tu programa ya no buscará en system y lo hará en tu directorio. Esto es un punto muy débil y yo lo exploté en un VB6 con Themida.
Por otro lado, me ha llamado mucho la atención que uses VB6; estamos hablando de un lenguaje que se lanzó creo que hace un cuarto de siglo... Aunque es un lenguaje muy intuitivo y fácil, igual es mejor usar herramientas más actualizadas...
|
|
|
En línea
|
|
|
|
OfTheVara
Desconectado
Mensajes: 46
|
Efectivamente, como te dice MCKSys Argentina, Themida es un packer brutal pero VB6 tiene puntos débiles y uno de ellos es que todo programa llama a MSVBVM60.dll que está en system32 o sysWOW64, pero si tú creas un archivo modificado MSVBVM60.dll y lo dejas en el mismo directorio de tu programa, tu programa ya no buscará en system y lo hará en tu directorio. Esto es un punto muy débil y yo lo exploté en un VB6 con Themida.
Por otro lado, me ha llamado mucho la atención que uses VB6; estamos hablando de un lenguaje que se lanzó creo que hace un cuarto de siglo... Aunque es un lenguaje muy intuitivo y fácil, igual es mejor usar herramientas más actualizadas...
Karmany, un problema que tengo con Themida es que mi programa me tarda muchísimo en cargar, del orden de 20 segundos!!, y sin usar ninguna macro todavía. ¿conoces otras alternativas a Themida para probar?
|
|
|
En línea
|
|
|
|
OfTheVara
Desconectado
Mensajes: 46
|
Hola!
Themida es un buen packer, pero VB6 tiene puntos débiles y alguien con experiencia lo puede evitar. No cometas el error de confiar sólo porque has usado un packer (el que sea).
Saludos!
En un packer como Themida que usa Macros con virtualización, ¿lo primero donde mira el Hacker son las funciones que estan protegidas con macros? Es decir, posiblemente sea mejor no virtualizar el código que quieres proteger, y usar las macros para código de relleno que no va a ninguna parte. ¿tendría sentido o sería un riesgo?
|
|
|
En línea
|
|
|
|
MCKSys Argentina
|
En un packer como Themida que usa Macros con virtualización, ¿lo primero donde mira el Hacker son las funciones que estan protegidas con macros?
Puede que sí como que no. Depende de quien mire el código. Es decir, posiblemente sea mejor no virtualizar el código que quieres proteger, y usar las macros para código de relleno que no va a ninguna parte. ¿tendría sentido o sería un riesgo?
No conozco mucho sobre el uso de este packer en particular, pero ya te hemos dicho que VB6 tiene problemas con los packers. Incluso karmany te ha confirmado lo anterior con este mismo packer. Saludos!
|
|
|
En línea
|
MCKSys Argentina "Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Introduccion a la ofuscacion de codigo c#
.NET (C#, VB.NET, ASP)
|
aixeiger
|
3
|
4,553
|
30 Agosto 2012, 15:34 pm
por Keyen Night
|
|
|
ofuscación
Scripting
|
CodeSource
|
2
|
3,104
|
5 Marzo 2013, 20:58 pm
por CodeSource
|
|
|
Ofuscacion de codigo
Ingeniería Inversa
|
Hackkemate
|
6
|
5,836
|
14 Mayo 2013, 00:18 am
por mr.blood
|
|
|
Ofuscación
Programación C/C++
|
Caster
|
6
|
3,610
|
10 Noviembre 2013, 15:16 pm
por rir3760
|
|
|
Tecnicas de Ofuscación
Ingeniería Inversa
|
SteelHern
|
1
|
3,338
|
19 Enero 2015, 16:04 pm
por MCKSys Argentina
|
|