martes, 23 de octubre de 2012

Indice Reflexion


Indice:

Conceptos                                            ----------------------------------------------------------               aqui
Como cargar binarios                          ----------------------------------------------------------                aqui

Como cargar los binarios

Como cargar los binarios

A continuación veremos los metodos comunes para cargar un binario y poder examinarlo, que existen varias formas para hacer, pero en concreto trabajaremos desde la consola, para mi es mas practico que estar creando una interfaz y eso pero es a gusto de cada quien, bueno yo les muestro una forma la de cargarlos desde la consola, primero tienen que tener un binario ya creado anteriormente, yo tengo uno de un carro no hace mucho pero es una buena victima para examinar asi que tengo mi binario Car.dll, ah algo que se me pasaba la reflexión nos ayuda a examinar binarios .exe y librerias .dll claro compiladas con .Net Framework, asi que en mi caso es una dll.


Primero entenderemos las clases que nos ayudaran a cargar nuestro binario y como lo hacen!

Abrimos un proyecto de tipo Console Application y le ponen como mas les guste en mi caso le puse Evilcode! =)


Importamos la libreria System.Reflection

Para cargar un binario usaremos la clase Assembly esta nos ayudara a cargar el binario en memoria y en un propio AppDomain, que es esto?, bueno digamos que por seguridad cuando cargamos un binario en otro con Assembly esta crea un AppDomain en la cual se encargara de cargar al binario en cierto espacio de memoria el cual estara destinado solo para el y no en el mismo AppDomain de nuestro programa, en otras palabras cada binario, nuestro programa y el que hemos de cargar estaran en diferentes partes de memoria, y esto para que sirve?, como decia anteriormente por seguridad asi que si ocurre un error en la aplicación que cargamos solo se afecta ella y no nuestra aplicación, ya que tenemos una idea de donde se carga el binario ahora si cuales son las intrucciones para cargarlos?, son las siguientes:

(a)  Assembly bin=Assembly.Load("binario.exe");

(b)  Assembly bin=Assembly.LoadFrom("C:\Users\Evilcode\Visual\Projects\binario.exe");

hay otras 2 pero no las veremos aun, solo las boy a mencionar

ReflectionOnlyLoad y ReflectionOnlyLoadFrom

Ahora los analizaremos la forma (a) es la que vamos a ocupar ya que este recibe directamente al binario que en cambio a la forma (b) se tiene que especificar el string del directorio donde se encuentra y es mas vueltas, ahora que tenemos definido como vamos a cargar el binario, necesitamos ver la forma en que le vamos a extraer los datos, para eso tambien vamos a ocupar la System.Type que no es necesario importarla, para extraer todos lo Types de nuestro binario creamos la siguiente instrucción:

Type [] tipos=bin.GetTypes();

Con esto obtendremos el array de Types que tiene el binario cargado, bien ahora que sabemos la forma en que vamos a cargar nuestro binarios tendremos que hacer un poco de codigo para aceptar binarios desde consola para esto hice este pequeño programa:

static void main(string [] args)
{                                                
      if(args == null || args == 0)
      {                                          
            Console.WriteLine("No ah introducido ningun binario");
            Enviroment.Exit(1);
      }                                          
      else
      {
            Assembly bin=Assembly.Load (args[0]);
            Type[] tipos=bin.GetTypes();
      }
}                                               


Esta sera la forma en que vamos a cargar los binarios, le dejamos por el momento aqui, practiquen no hagan copy paste =). Salu2!.

lunes, 22 de octubre de 2012

Conceptos

En esta parte pondre los conceptos de los terminos que usemos, algunos los mantendre intactos para no perder su esencia, otros los traducire, introducire los terminos como los vallamos usando:

  • Assembly: define al binario(assembly) cargado, los modulos del binario, el tipo y crea una instancia de el.
  • Module: contiene información acerca de los modulos del binario, las clases del modulo.
  • ContructorInfo: contiene información acerca del contructor como son nombre, parametros, modificadores de acceso.
  • MethodInfo: contiene información acerca del metodo como nombre, parametros, modificador de acceso, tipo de retorno.
  • FieldInfo: contiene información acerca del campo como nombre, modificador de acceso.

Conceptos que necesitamos entender!

Okay, primero necesitamos entender algunas cosas para saber que estamos haciendo o que vamos a hacer,

Primero que nada C# es un lenguaje de alto nivel, pero atras de esto que hay?, como en otro lenguaje C# genera un codigo intermedio llamado CIL, que significa Common Intermediate Language, este es el codigo de bajo nivel que generan nuestro programas en C#, pero que es el codigo CIL?, como decia es lenguaje de programacion de mas bajo nivel en el CLI (Common Lenguage Infraestructure) y en la plataforma .Net Framework, el lenguaje CIL es un lenguaje orientado a objetos, basado en pilas y que se ejecuta en una maquina virtual.

Cuando compilamos una aplicación el codigo fuente se convierte en CIL que es independiente de la plataforma asi que se puede ejecutar en cualquier cpu.

La primera aplicacion que vamos a desarrollar va a ser un ofuscador de codigo fuente, pero que es ofuscación?

Ofuscación de codigo!

La ofuscación de codigo se refiere al proceso de manipular los metadatos de un programa para que si este es desensamblado de alguna manera al obtener el codigo fuente este sea ilegible, ya que se protegera el codigo fuente mediante la proteccion de metadatos.

Metadatos?

Los metadatos son la representación de los datos, ya que por ejemplo tenemos un metodo que se llama proceso, pero proceso no es mas que la representacion del codigo del metodo en si proceso es un metadato ya que representa a un dato.

Antes de que comencemos a programar tendremos un pequeño curso de Reflexion en C# asi que no se deseperen ya que esto va para largo, pero si logran aguantar, van a ver que todos tendremos mucho que ganar!

Para poder entender como funciona esto necesitamos saber como se produce, asi que para esto ocuparemos la reflexión en C#.

La reflexión se entiende como la posibilidad de obtener información acerca de binarios cargados, lo que vamos a hacer con la reflexión es metaprogramación, la metaprogramación se refiere a la programación de programas, en otras palabras estaremos manipulando programas terceros, claro hechos en C#, los programas terceros son los que examinaremos, y asi que de ahora en adelante estos se llamaran binarios, asi que ya que tenemos cargados los binarios podremos examinarlos y obtener de ellos sus tipos de definición, las clases, interfaces, metodos, campos, variables, etc., ya que tenemos que entender como se hace esto, ademas de que quiero documentar un poco de reflexión ya que no eh visto mucho en español.

Bien ya que sabemos un poquito de esto podemos continuar, pero sera en el siguiente post, si aun no lo entienden, dejen su comentario y la parte que no entienen, o si tienen duda de aqui en adelante a alguna cosa que postee.

Salud2!

Que es la seguridad informatica?

Primero comenzaremos entendiendo que es la seguridad? 
segun la real academia española nos dice que es: la cualidad de seguro, entonce seguro que es? y buscando de nuevo nos dice: libre y exento de peligro,

Bien, en informática esto no nos sirve ya que los sistemas informaticos no son libres, ni mucho menos exentos de peligros, entonces la definición esta mal? 

Bueno mejor estructuramos una definición mas enfocada a los sistemas informáticos:

La seguridad informatica se refiere al conjunto de métodos y herramientas destinadas a proteger información, y por lo tanto a los sistemas informaticos ante las amenazas que se presenten

Esto suena mejor, bueno ya que tenemos definido que es la seguridad informatica ahora nos vamos a centrar en seguridad de aplicaciones de software, y lo repido de nuevo por el momento solo de aplicaciones hechas para la plataforma C#

¿Porque?

La mayoria de aplicaciones comerciales estan hechas para el Sistema Operativos Windows y por ende para la plataforma .Net entonces si es necesario asegurar nuestras aplicaciones

Ante esto primero les boy a mostrar algunas formas de leer codigo y desensamblarlo, ademas de que crearemos una aplicacion que pueda leer el codigo fuente de nuestra aplicacion y que despues tendremos que crear métodos de protección, ok!.

Presentacion

Hola que tal bueno en este blog estare hablando sobre programacion en C# especificamente y de mono pero no cualquiera, en especial estoy trabajando con mono cecil, no lo conocen? bueno mas adelante se los explico, boy a hacer el blog a manera de tutorial para que se vallan adentrando a la seguridad de aplicaciones de software y otras cosas, en especifico quiero dar a conocer los medios de proteccion de aplicaciones de software, como ya les comentaba las hechas para la plataforma .Net, ya que muchas veces hacemos aplicaciones y las queremos comercializarlas y tenemos que protegerlas, asi que en muchas ocaciones recurrimos a otros programas para proteger nuestro propio software, bueno yo les quiero mostrar una forma de hacerlo pero de manera propia para que ustedes creen sus propios protectores de software, bueno mas que hablar comencemos.