elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Píldoras formativas en seguridad de la información


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  [Source] Crypter Simple
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [Source] Crypter Simple  (Leído 6,768 veces)
Ferсhu


Desconectado Desconectado

Mensajes: 1.214

Menos palabras y Mas codigos.


Ver Perfil WWW
[Source] Crypter Simple
« en: 14 Marzo 2008, 02:06 »

Hola, En base algunos post y viendo que a muchos les interesa el tema les traigo un ejemplo de un crypter muy simple, solo codifica la primera sección de codigo con un Xor, el q quiera puede modificar la encriptacion a su gusto pero la idea es mostrar como empezar.

Bueno al grano, ya q en el codigo se explica un poco el funcionamiento.

Código
  1. #include <stdio.h>
  2. #include <windows.h>
  3.  
  4. void descifrar(unsigned char *inicio, unsigned char *final){
  5.  
  6.     while(inicio<final){
  7.     *inicio=*inicio ^ 85;
  8.     inicio++;
  9.     }
  10. }    
  11.  
  12. int main(int argc, char *argv[])
  13. {
  14.    FILE *fp,*fn;
  15.    IMAGE_DOS_HEADER dosheader;
  16.    IMAGE_NT_HEADERS ntheader;
  17.    IMAGE_SECTION_HEADER section;
  18.    unsigned char c;
  19.    unsigned char *buffer,buf[50],p[5],*func;
  20.  
  21.    unsigned long i,oep,inicio,final,pos,tam;
  22.  
  23.    fp=fopen("prueba.exe","rb+");
  24.    fn=fopen("cifrado.exe","wb");  
  25.  
  26.    // Copiamos el archivo a otro para trabajar con este.
  27.    while(!feof(fp)){
  28.                 putc(getc(fp),fn);
  29.                 }
  30.  
  31.  
  32.    if(!fp){ printf("Error al abrir"); return 0;}
  33.  
  34.    // Guardamos la informacion q vamos a usar de la cabecera en estructuras.
  35.    fseek(fp, 0x80,0); // empieza cabecera "PE..."
  36.    fread(&ntheader, sizeof(ntheader), 1, fp);        
  37.    fread(&section, sizeof(section), 1, fp);        
  38.  
  39.    // direccion fisica de la sección y tamaño, en el ejecutable.
  40.    printf("inicio Section code: %d\n",section.PointerToRawData);
  41.    printf("Tamaño Section code: %d\n",section.SizeOfRawData);    
  42.  
  43.    buffer=(unsigned char *)malloc(section.SizeOfRawData);
  44.    // vamos hasta donde comienza el codigo de la sección q vamos a codificar.
  45.    fseek(fp, section.PointerToRawData, 0);  
  46.    // leemos y hacemos una encriptacion simple.    
  47.    fread(buffer, section.SizeOfRawData, 1, fp);        
  48.    for(i=0;i<section.SizeOfRawData;i++)buffer[i]^=85;
  49.  
  50.    //Tamaño de la funcion q descifra
  51.    tam = (long unsigned int) main - (long unsigned int)descifrar;
  52.    //Usamos el final de la sección para meter nuestro codigo.
  53.    pos=section.Misc.VirtualSize ;
  54.  
  55.    /*
  56.     Bueno aca hay q explicar por q se hace esto. Es para emular la llamada a la funcion
  57.     "descifrar" y q se comporte correctamente. Para eso lo q hacemos es
  58.     crear los opcodes de:
  59.          
  60.     push "direccion final del codigo"
  61.     push "direccion inicial del codigo"    
  62.     push "direccion de retorno de la funcion"  // obviamente aca ponemos el OEP del prog
  63.  
  64.     Para hacerlo dinamico se crean los opcodes en base a las direcciones de OEP y de
  65.     la sección usada.              
  66.     */
  67.  
  68.    final  = ntheader.OptionalHeader.ImageBase + section.VirtualAddress + section.Misc.VirtualSize;
  69.    *((unsigned long *)p)=final;
  70.    buffer[pos]=0x68; // opcode de push
  71.    pos++;
  72.    for(i=0;i<4;i++,pos++)buffer[pos]=p[i];
  73.  
  74.    inicio = ntheader.OptionalHeader.ImageBase + section.VirtualAddress;  
  75.    *((unsigned long *)p)=inicio;      
  76.    buffer[pos]=0x68; // push
  77.    pos++;    
  78.    for(i=0;i<4;i++,pos++)buffer[pos]=p[i];
  79.  
  80.    oep=ntheader.OptionalHeader.ImageBase+ntheader.OptionalHeader.AddressOfEntryPoint;
  81.    *((unsigned long *)p)=oep;  
  82.    buffer[pos]=0x68; // push
  83.    pos++;    
  84.    for(i=0;i<4;i++,pos++)buffer[pos]=p[i];
  85.  
  86.    // Obtenemos la direccion donde comienza la funcion y la guardamos.
  87.    func=(unsigned char *) &descifrar;      
  88.    for(i=0;i<tam;i++,pos++)buffer[pos]=func[i];
  89.  
  90.    // Cambiamos el OEP por el nuestro. Para q al cargarse el programa empieze ahi.
  91.    ntheader.OptionalHeader.AddressOfEntryPoint=section.VirtualAddress+section.Misc.VirtualSize;;
  92.    // Le damos permiso de escritura a la sección. Si no hacemos esto nos dara error.
  93.    section.Characteristics = section.Characteristics | IMAGE_SCN_MEM_WRITE;
  94.  
  95.    // Vamos hasta la posicion de el header y reemplazamos con los nuevos.
  96.    fseek(fn, 0x80,0);    
  97.    fwrite(&ntheader,sizeof(ntheader), 1, fn);
  98.    fwrite(&section, sizeof(section), 1, fn);
  99.    fseek(fn, section.PointerToRawData , 0);        
  100.    fwrite(buffer, section.SizeOfRawData, 1, fn);  // reemplazo con la sección codificada.
  101.  
  102.    fclose(fp);
  103.    fclose(fn);    
  104.    printf("Codigo cifrado.\n");    
  105.  
  106.    return EXIT_SUCCESS;
  107. }
  108.  
  109. By Ferchu
  110.  

Trate de hacerlo lo mas entendible posible, sin cosas raras ni caprichos. Seguramente  cualkiera q tenga minimos conocimientos de ing inversa puede revertir el algoritmo ya q es muy simple, pero la idea no es hacer algo ultra complicado, sino aprender, como siempre.

En el ejemplo se utiliza la misma sección para alojar el algoritmo q descifra, sin agrandarla ni nada, aprovechando q siempre se redondea y sobra espacio al final.

Como seguro estaran pensando se puede cambiar el metodo de encriptacion por uno mas eficiente y repetir el procedimiento con otras secciones.

Bueno espero q les sirva.

Saludos!!


« Última modificación: 14 Marzo 2008, 02:22 por Adamantyum » En línea

Override

Desconectado Desconectado

Mensajes: 242



Ver Perfil WWW
Re: [Source] Crypter Simple
« Respuesta #1 en: 15 Marzo 2008, 08:52 »

Una pregunta

Código:
    fseek(fp, 0x80,0); // empieza cabecera "PE..."

por que te posicionas en la offset 0x80?
no deberías posicionarte en la 0x3C y de ahi obtener la offset que apunta al inicio de la PE HEADER?

Un saludo solo esa duda y buen código!


En línea

Ferсhu


Desconectado Desconectado

Mensajes: 1.214

Menos palabras y Mas codigos.


Ver Perfil WWW
Re: [Source] Crypter Simple
« Respuesta #2 en: 15 Marzo 2008, 23:52 »

Citar
por que te posicionas en la offset 0x80?
no deberías posicionarte en la 0x3C y de ahi obtener la offset que apunta al inicio de la PE HEADER?

me posiciono ahi para leer el Header NT, como veras dsp de eso se lee el archivo y se guarda el contenido en esa estructura. Si no se posiciona correctamente la informacion q se carga en la estructura seria invalida.
En línea

yovaninu


Desconectado Desconectado

Mensajes: 349



Ver Perfil
Re: [Source] Crypter Simple
« Respuesta #3 en: 16 Marzo 2008, 17:14 »

me voy iniciando en esto, no me queda de otra y como imaginaran estoy lleno de dudas, por ejemplo, el codigo Adamntyum lo hice correr con un simple exe, en efecto se crea un segundo ejecutable de nombre cifrado.exe, pero al darle doble clic no hace nada, se supone que deberia ejecutar al igual que "prueba.exe" verdad?

En línea

Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 5.512


La mano invisible del mercado me robo la billetera


Ver Perfil WWW
Re: [Source] Crypter Simple
« Respuesta #4 en: 16 Marzo 2008, 19:07 »

Es tal como indicas Override. Ese campo al que aludis - e_lfanew - esta en la estructura IMAGE_DOS_HEADER, que - extrañamente - tiene una variable de ese tipo declarada en ese codigo pero no se usa para nada.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Ferсhu


Desconectado Desconectado

Mensajes: 1.214

Menos palabras y Mas codigos.


Ver Perfil WWW
Re: [Source] Crypter Simple
« Respuesta #5 en: 16 Marzo 2008, 19:56 »

Citar
extrañamente - tiene una variable de ese tipo declarada en ese codigo pero no se usa para nada.

extrañamente la puse para usarla pero dsp no la necesite jajaj  :xD

Citar
me voy iniciando en esto, no me queda de otra y como imaginaran estoy lleno de dudas, por ejemplo, el codigo Adamntyum lo hice correr con un simple exe, en efecto se crea un segundo ejecutable de nombre cifrado.exe, pero al darle doble clic no hace nada, se supone que deberia ejecutar al igual que "prueba.exe" verdad?

Teoricamente no deberias tener problema, aunke la primera sección de todas no sea de codigo, igual funciona ya q la descifra e igual vuelve al entry point, de todas formas este codigo no es para saltarse AV ni nada de eso, solo es para aprender y tener una minima idea.
En línea

invisible_hack


Desconectado Desconectado

Mensajes: 978


Invisible_Hack™ Nick Registrado ^^


Ver Perfil WWW
Re: [Source] Crypter Simple
« Respuesta #6 en: 16 Marzo 2008, 20:22 »

Excelente code  ;D

Si me permites, lo pondré en mi foro, con los respectivos créditos  :D

Un saludo...
En línea

"Si no visitas mi blog, Chuck te dará una patada giratoria"
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 5.512


La mano invisible del mercado me robo la billetera


Ver Perfil WWW
Re: [Source] Crypter Simple
« Respuesta #7 en: 16 Marzo 2008, 20:26 »

extrañamente la puse para usarla pero dsp no la necesite jajaj  :xD

Eso sera unicamente hasta que te encuentres un ejecutable cuya cabecera PE no este en esa direccion ...
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Freeze.


Desconectado Desconectado

Mensajes: 2.731



Ver Perfil WWW
Re: [Source] Crypter Simple
« Respuesta #8 en: 16 Marzo 2008, 21:23 »

Compilado con VC++ 6.0

A mi me da error (de no enviar :xD) pero supuestamente cifra.

Voy a probar y posteo de nuevo ;)
En línea

Ferсhu


Desconectado Desconectado

Mensajes: 1.214

Menos palabras y Mas codigos.


Ver Perfil WWW
Re: [Source] Crypter Simple
« Respuesta #9 en: 17 Marzo 2008, 00:36 »

Citar
Si me permites, lo pondré en mi foro, con los respectivos créditos

Si, no hay problema.

Citar
Eso sera unicamente hasta que te encuentres un ejecutable cuya cabecera PE no este en esa direccion ...

Es verdad eso, deberia leer antes el offseet del pe, q esta en 3c, para q no tenga inconvenientes con otros archivos

Citar
Compilado con VC++ 6.0

A mi me da error (de no enviar ) pero supuestamente cifra.

El error q te da creo q es por la forma en la q obtengo la direccion de la funcion q descifra, igualmente tmb puede aver otros inconvenientes, yo uso dev-c++.

tmb hay q aclarar q si sizeofrawdata es igual a virtualsize no va a sobrar nada de espacio y no va a funcionar (hay q agrandar la sección), eso pude pasar con la mayoria de los archivos q tiene windows.

« Última modificación: 17 Marzo 2008, 00:38 por Adamantyum » En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[SOURCE][ACTUALIZADO] Karcrack Project Crypter, cifra tus proyectos en VB « 1 2 3 4 »
Programación Visual Basic
Karcrack 34 19,853 Último mensaje 9 Febrero 2015, 15:54
por Arlex
[Source] Crypter Simple Vr 2(?) FIX 1
Programación C/C++
Karman 1 2,454 Último mensaje 16 Febrero 2012, 22:50
por Maurice_Lupin
Ares Codigo Source de un B0t Simple en c#
.NET
offefman 0 1,340 Último mensaje 10 Agosto 2011, 19:43
por offefman
[SOURCE] DoCrypt (Document Crypter, Protege documentos de texto)
.NET
Eleкtro 0 591 Último mensaje 20 Septiembre 2013, 18:43
por Eleкtro
[SOURCE] - Cactus VBS Crypter 1.0
Programación Visual Basic
Mad Antrax 2 1,399 Último mensaje 5 Marzo 2014, 12:26
por 79137913
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines