Como curiosidad hice un programa de consola bajo C# Express 2013. Consiste en introducir '1234' para acceder.
Código
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
namespace Password
{
class Program
{
staticvoid Main(string[] args)
{
Console.Title="Contraseńa";// Título de la ventana.
int password_fijo =1234;// Contrasela preficaja.
Console.WriteLine("Introduce contraseńa o password: ");//Mostrar texto.
int contraseńa = Convert.ToInt32(Console.ReadLine());// Leer contraseńa que pulsas en el teclado y lo almacena en una variable 'contraseńa'.
// Si 'contraseńa' introducida en el teclado es igual a 'password_fijo' o '1234' se cumple la condición.
if(contraseńa == password_fijo)
{
Console.WriteLine("La contraseńa es correcta.");
}
else
{
Console.WriteLine("INCORRECTO. Vuelva a intentarlo.");
}
Console.ReadKey();// Pulse una tecla cualquiera para salir.
}
}
}
El programa es muy sencillo. Supuestamente este código fuente no lo tienes. Pero si su ejecutable que lo habrí con H&D, un editor hexadecimal y lo pasé a un txt. Este txt indicado abajo no es fiable porque es en binario, y leerlo en txt no sirve, pero si con el H&D, es para coger un ejemplo.
Código
MZ ˙˙ ¸ @ ş ´ Í!¸LÍ!This program cannot be run in DOS mode.
$ PE L ˝Č{R ŕ
~) @ @ ` 0) K @ @ ` ř' H .text
`.rsrc @ @ @ @.reloc ` @ B `) H ź < 0 V r p(
Ň
r p(
(
(
ţţ- r[ p(
+
r p(
(
&*(
* BSJB v4.0.30319 l #~ x Ŕ #Strings 8 Ô #US #GUID #Blob G ú%3
81 i O Ť Č ç 4 O h h Š ňß? 5 U s1 1 ¨1 P ?
˛ D J D D ! D ) D 1 D 9 D A D I D Q D Y D a D i D q D y D D $ D {) ) . Ą 2 ˇ7 D . B . . . # . + . 3 . ; . C . S . [ ¸ . k â . s ď . { ř . < ( <Module> Password.exe Program Password mscorlib System Object Main .ctor args System.Runtime.Versioning TargetFrameworkAttribute System.Reflection AssemblyTitleAttribute AssemblyDescriptionAttribute AssemblyConfigurationAttribute AssemblyCompanyAttribute AssemblyProductAttribute AssemblyCopyrightAttribute AssemblyTrademarkAttribute AssemblyCultureAttribute System.Runtime.InteropServices ComVisibleAttribute GuidAttribute AssemblyVersionAttribute AssemblyFileVersionAttribute System.Diagnostics DebuggableAttribute DebuggingModes System.Runtime.CompilerServices CompilationRelaxationsAttribute RuntimeCompatibilityAttribute Console set_Title WriteLine ReadLine Convert ToInt32 ConsoleKeyInfo ReadKey C o n t r a s e ń a CI n t r o d u c e c o n t r a s e ń a o p a s s w o r d : 5L a c o n t r a s e ń a e s c o r r e c t a . AI N C O R R E C T O . V u e l v a a i n t e n t a r l o . eţSiśýJ˝đçi´N/# ˇz\V4ŕ A UI .NETFramework,Version=v4.5 TFrameworkDisplayName.NET Framework 4.5
RSDS{=@ŽÝ@¤Ă^3$şÔ= c:\Users\Meta\Documents\Visual Studio 2013\Projects\Password\Password\obj\Debug\Password.pdb X) n) `) _CorExeMain mscoree.dll ˙% @ 8 P h @ ° PC ę °4 V S _ V E R S I O N _ I N F O ˝ďţ ? D V a r F i l e I n f o $ T r a n s l a t i o n ° S t r i n g F i l e I n f o ě 000004 b 0 < F i l e D e s c r i p t i o n P a s s w o r d 0 F i l e V e r s i o n 1 . 0 . 0 . 0 <
I n t e r n a l N a m e P a s s w o r d . e x e H L e g a l C o p y r i g h t C o p y r i g h t Š 2013 D
O r i g i n a l F i l e n a m e P a s s w o r d . e x e 4 P r o d u c t N a m e P a s s w o r d 4 P r o d u c t V e r s i o n 1 . 0 . 0 . 08 A s s e m b l y V e r s i o n 1 . 0 . 0 . 0 ďťż<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Le he hechado un ojo por el aire. No me parece muy fácil, ejejejeje. Hay que probarlo como encontrarlo.
Lo encontré buscando 1234, luego compilé 1235 pero no es fácil. Lo encontré porque estaba buscando 1234, es decir, se la contraseńa, la idea es buscarla sin tener idea de saber que contraseńa es.
Comprobé que 1234 es D2 04.
Si lo cambio a 1235 su valor en hex es D3 04.
Por eso se el valor, si cambio directamente en el hexadecimal, no se que contraseńa es.
Las contraseńas en .net se sacan con una facilidad pasmosa, lo que no sabia yo es que dentro del ejecutable se guardaban datos como este:
Código:
c:\Users\Meta\Documents\Visual Studio 2013\Projects\Password\Password\obj\Debug\Password.pdb
Me da que pensar cuando haga un virus, si en vez de Users pusiera .:Weeds:. mal asunto jaja.
Saludos.
Haz aprendido algo nuevo. Hay más información dentro de las palicaciones, sobre todo de Microsoft. Se llama metadatos y e que has podido leer es legible, en cuanto a otros datos, a simplevista parecen NADA y obtienen información más de lo que imaginas.
Con un editor hexadecimal se puede cambiar todo eso por un largo XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, asunto resuelto, en vez de c:\Users\.:Weeds:.\Documents\Visual Studio 2013\Projects\Password\Password\obj\Debug\Password.pdb
Por curiosidad miré Password.pdb y contiene esta información.
Ę18 ˙˙ Ę18 ˙˙˙˙ ˙˙˙˙ ˙˙˙˙ ˙˙˙˙ Ę18 ˙˙˙˙ ˙˙˙˙ ˙˙˙˙ ˙˙˙˙ V V X , @ L ˙˙˙˙(
â0 Hč,÷ŰÎ
S ( â0[JüX R S e ţďţď ¤ c:\Users\Meta\Documents\Visual Studio 2013\Projects\Password\Password\Program.cs c:\users\meta\documents\visual studio 2013\projects\password\password\program.cs R S â0 ń÷ë3öŰÎ S ( â0Ś _X R S e . * X V Main V
No hace falta la magia negra de usar un editor hexadecimal para abrir el ensamblado, buscas un decompiler y abres el ensamblado y ya tienes no sólo la contraseńa sino también el código fuente completo. También puedes obtener el MSIL por reflexión y reconstruir el código (que es lo que realmente hace el decompiler), y si te conoces la estructura de los ensamblados de .Net sabrás donde buscar este tipo de información. No es algo para sorprenderse, evidentemente todo la información que compone el código estará en el ensamblado final, ya que se requiere para su uso en tiempo de ejecución, para el caso especial de la plataforma de lenguajes .Net como lo es C# y el muy conocido Java, son lenguajes intermedios o interpretados, que requieren de una maquina virtual que ayude como intermediario entre el código intermedio y la máquina, a diferencia de C/C++ donde el código es de ejecución directa, donde la única traducción que se hace es al lenguaje de la máquina; debido a esto, el código compilado en .Net o en Java, es fácilmente decompilable usando la misma máquina que lo tradujo, es decir si sabes traducir de Ingles a Espańol también debes saber de Espańol a Ingles, lo que no sucede en C/C++ por ejemplo, ya que obtenemos código ASM, que hay que analizar con un debugger, y en fin terminas necesitando a gente de la NASA, de la NSA o gente de elhacker.net para devolver eso a lo que podría ser una medio interpretación de como era el código antes de ser compilado.
En línea
La Fé Mueve Montańas... ...De Dinero
La programación es más que un trabajo es más que un hobby es una pasión...
Voy hacer pruebas de descompilarlo y encontrar la contraseńa "1234" a ver si es tan fácil como parece. Vaya seguridad tiene el .NET. El de pago que me dieron en clase legalmente, tiene una función que se llama obfuscar. Se usa, pero he leído por Internet que aún con ello, la diferencia es que tarda más tiempo en hackearlo por decirlo de alguna manera.
Eso es debido a que la ofuscación sólo cambia los nombres de las variables, propiedades y métodos que creas dentro del tu aplicación. Si lo que quieres es mantener segura una contraseńa no la incluyas dentro de tu código, además las contraseńas no se usan así como así, se hacen mediante técnicas de cifrado y hash.
Otra cosa, no es sólo cosa del .NET Framework, cualquier aplicación puede ser decompilada y se le puede aplicar ingeniería inversa, esté escrita en el lenguaje en el que esté escrita.
Por lo que he estado leyendo, las contraseńas no se guardan en un .exe, puede ser en un archivo a parte e incluso en el editor de registros de Windows por poner un ejemplo, eso si, muy bien cifrado.
Seguiré haciendo pruebas. Otra cosa, es cambiar un if else desde un ejecutable, eso parece algo más fácil.
Imagina que en el sistema de administración de un banco, dicha aplicación administrativa, guarde internamente un usuario/contraseńa, no importa donde, si en el código, en una base de datos local, en un archivo, en el registro, donde sea. En no más que unos pocos minutos, ya puedes hackear el sistema. La estructura general correcta para este tipo de cosas, es tener un servicio aislado en un servidor, donde se requiere que el usuario se autentique mediante certificados, o usuario/contraseńa, de manera que el cliente sólo hace las solicitudes y el servidor las procesa dependiendo de la autenticidad y autorización del cliente. Es como cuando vas al cajero automático, el software, sólo tiene el código para realizar las solicitudes, pero no tiene la contraseńa e información de la tarjeta de todos los clientes del banco, el cajero automático, envía la información a un servidor que procesa la información y toma decisiones por él, el software del cajero automático no tiene en ninguna parte, comprobaciones, ni operaciones de ningún tipo, sólo envía, recibe y muestra la información.
La seguridad de ensamblados en .Net no tiene nada que ver, es como bien dice El Benjo, todo lo que se compila se puede decompilar.
Ofuscar es una opción, hay diferentes niveles de ofuscación, los más básicos renombran toda la estructura por caracteres UNICODE, otros más avanzados, pueden transformarse en verdaderos dolores de cabeza para la ingeniería inversa, aplicando la reestructuración del código por medio de proxies, generando un código extremadamente desordenado (el código está, pero no se puede recuperar el orden), alterando la estructura de .Net para dejarle irreconocible pero funcional, empaquetando y cifrando el código en un ejecutable compilado en otro lenguaje que no sea de .Net. En fin hay mucha tela que cortar de ahí, y es un mundo muy grande del que no vale hablar mucho sino investigar, porque cada quien puede conseguir su forma de ofuscar, que por razones obvias no puede contar del todo
« Última modificación: 10 Noviembre 2013, 17:57 pm por Keyen Night »
En línea
La Fé Mueve Montańas... ...De Dinero
La programación es más que un trabajo es más que un hobby es una pasión...