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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Análisis y Diseño de Malware (Moderador: fary)
| | |-+  [?] Duda PE Crypter
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [?] Duda PE Crypter  (Leído 4,605 veces)
MeCraniDOS


Desconectado Desconectado

Mensajes: 337


Sr. Glass


Ver Perfil
[?] Duda PE Crypter
« en: 1 Julio 2014, 00:53 am »

Hello!   ;D

Estoy intentando entender la estructura PE para poder entender como se hacen los crypters y esas cosas, y me he quedado estancado en una parte, llevo dos dias buscando para no preguntar porque quizás es algo obvio...  :rolleyes:

Si yo quiero añadir una sección a un ejecutable, tengo que incrementar el NumberOfSections y el SizeOfImage, y luego añadir los datos de la nueva sección, lo estaba programando y tengo de momento esto


Código
  1. // ....
  2.    IMAGE_DOS_HEADER DOS_Header;
  3.    IMAGE_NT_HEADERS NT_Header;
  4.    IMAGE_SECTION_HEADER *SECTION_Header;
  5.  
  6.    FILE *Archivo = fopen("Test.exe", "rb");
  7.  
  8.    if(Archivo)
  9.    {
  10.  
  11.        CopyFile("Test.exe", "Backup.exe", TRUE);
  12.  
  13.        printf("Basic File Information\n\n");
  14.        printf("File Name: Test.exe\n");
  15.  
  16.        /* Obtenemos el tamaño del fichero */
  17.        fseek(Archivo,0, SEEK_END);
  18.        unsigned long Tamanyo = ftell(Archivo);
  19.        fseek(Archivo,0, SEEK_SET);
  20.  
  21.        printf("File Size: %lu (%lx)", Tamanyo, Tamanyo);
  22.  
  23.        /* Obtenemos la estructura DOS_HEADER */
  24.        fread(&DOS_Header, sizeof(IMAGE_DOS_HEADER), 1, Archivo);
  25.  
  26.        /* Saltamos hasta la posicion donde empieza NT_HEADER, esa posicion se almacena en e_lfanew */
  27.        fseek(Archivo, DOS_Header.e_lfanew, SEEK_SET);
  28.        fread(&NT_Header, sizeof(IMAGE_NT_HEADERS), 1, Archivo);
  29.  
  30.        NT_Header.FileHeader.NumberOfSections += 1;
  31.        //NT_Header.OptionalHeader.SizeOfImage +=;
  32.  
  33.  
  34.        /* Reservamos memoria para las secciones */
  35.        SECTION_Header = (IMAGE_SECTION_HEADER*)malloc(NT_Header.FileHeader.NumberOfSections*sizeof(IMAGE_SECTION_HEADER));
  36.  
  37.        /* Guardamos las secciones */
  38.        for(unsigned int i=0;i<NT_Header.FileHeader.NumberOfSections-1;i++)
  39.        {
  40.            fread(&SECTION_Header[i], sizeof(IMAGE_SECTION_HEADER), 1, Archivo);
  41.        }
  42.  
  43. // ....
  44.  
  45.        free(SECTION_Header);
  46.  
  47. // ....

Entonces lo que había pensado era hacer esto:

Código
  1. // ....
  2.    IMAGE_DOS_HEADER DOS_Header;
  3.    IMAGE_NT_HEADERS NT_Header;
  4.    IMAGE_SECTION_HEADER *SECTION_Header;
  5.  
  6.    FILE *Archivo = fopen("Test.exe", "rb+");
  7.  
  8.    if(Archivo)
  9.    {
  10.  
  11.        CopyFile("Test.exe", "Backup.exe", TRUE);
  12.  
  13.        /* Obtenemos el tamaño del fichero */
  14.        fseek(Archivo,0, SEEK_END);
  15.        unsigned long Tamanyo = ftell(Archivo);
  16.        fseek(Archivo,0, SEEK_SET);
  17.  
  18.        /* Obtenemos la estructura DOS_HEADER */
  19.        fread(&DOS_Header, sizeof(IMAGE_DOS_HEADER), 1, Archivo);
  20.  
  21.        /* Saltamos hasta la posicion donde empieza NT_HEADER, esa posicion se almacena en e_lfanew */
  22.        fseek(Archivo, DOS_Header.e_lfanew, SEEK_SET);
  23.        fread(&NT_Header, sizeof(IMAGE_NT_HEADERS), 1, Archivo);
  24.  
  25.        NT_Header.FileHeader.NumberOfSections += 1;
  26.  
  27.        /* Reservamos memoria para las secciones (+1 para la nueva sección)*/
  28.        SECTION_Header = (IMAGE_SECTION_HEADER*)malloc((NT_Header.FileHeader.NumberOfSections)*sizeof(IMAGE_SECTION_HEADER));
  29.  
  30.        /* Guardamos las secciones */
  31.        for(int i=0;i<NT_Header.FileHeader.NumberOfSections-1;i++)
  32.        {
  33.            fread(&SECTION_Header[i], sizeof(IMAGE_SECTION_HEADER), 1, Archivo);
  34.        }
  35.  
  36.        DWORD Tamanyo_RawData = 0x10;
  37.        DWORD VirtualAddressEnd = SECTION_Header[NT_Header.FileHeader.NumberOfSections-2].VirtualAddress;
  38.  
  39.        /* Escribimos los datos de la nueva sección */
  40.  
  41.        BYTE NombreSeccion[8] = ".mecra";
  42.        memcpy(SECTION_Header[NT_Header.FileHeader.NumberOfSections-1].Name, NombreSeccion, 8);
  43.  
  44.        SECTION_Header[NT_Header.FileHeader.NumberOfSections-1].SizeOfRawData = Tamanyo_RawData;
  45.        SECTION_Header[NT_Header.FileHeader.NumberOfSections-1].PointerToRawData = Tamanyo;
  46.        SECTION_Header[NT_Header.FileHeader.NumberOfSections-1].Characteristics = 0xE0000020;
  47.        SECTION_Header[NT_Header.FileHeader.NumberOfSections-1].VirtualAddress = VirtualAddressEnd+NT_Header.OptionalHeader.SectionAlignment;
  48.        SECTION_Header[NT_Header.FileHeader.NumberOfSections-1].Misc.VirtualSize = Tamanyo_RawData;
  49.  
  50.        /* Incrementamos el SizeOfImage */
  51.        NT_Header.OptionalHeader.SizeOfImage += Tamanyo_RawData;
  52.  
  53.        /* Escribimos los datos en el archivo */
  54.  
  55.        //Nos situamos al inicio de la NT Header
  56.        fseek(Archivo, DOS_Header.e_lfanew, SEEK_SET);
  57.  
  58.        //Escribimos la cabecera
  59.        fwrite(&NT_Header, sizeof(IMAGE_NT_HEADERS), 1, Archivo);
  60.  
  61.        //Saltamos al Section Header
  62.        fseek(Archivo, DOS_Header.e_lfanew + sizeof(IMAGE_NT_HEADERS), SEEK_SET);
  63.  
  64.        //Escribimos los datos y la cagamos porque nos cargamos lo que sigue al insertar la sección asi ^^
  65.        for(int i=0;i<NT_Header.FileHeader.NumberOfSections;i++)
  66.        {
  67.            fwrite(&SECTION_Header[i], sizeof(IMAGE_SECTION_HEADER), 1, Archivo);
  68.        }
  69.  
  70. // ....
  71.  
  72.        free(SECTION_Header);
  73.  
  74. // ....
  75.  

Los que sepan del tema ya sabrán donde estoy fallando, y yo me hago una ligera idea  :huh: :huh:

Según he estado leyendo, tiene que haber espacio para poder insertar la sección, cosa que no compruebo, pero donde está el contenido de cada sección? Justo despues de IMAGE_SECTION_HEADER?

Lo que habia pensado era guardar el contenido que hay justo después de la última sección, insertar la mia, insertar el contenido que he guardado, y modificar de cada sección el PointerToRawData sumando el tamaño de la cabecera de la nueva sección, para apuntar de nuevo donde empieza la sección :rolleyes:

Si no se hace así, a ver si alguien me puede dar una idea de como se hace.. Tengo los conceptos un poco liados  :-\




Dos cositas mas  :silbar:

He estado leyendo el código de [Zero] de como añadir una sección..

http://foro.elhacker.net/analisis_y_diseno_de_malware/srcc_anadir_una_seccion-t261801.0.html

Y veo que utiliza

Citar
PIMAGE_DOS_HEADER;
PIMAGE_NT_HEADERS;
PIMAGE_SECTION_HEADER;

En vez de utilizar esto
Citar
IMAGE_DOS_HEADER;
IMAGE_NT_HEADERS;
IMAGE_SECTION_HEADER;

Hay alguna diferencia? (Ventajas)

PIMAGE_DOS_HEADER sería un puntero a IMAGE_DOS_HEADER?  :huh:

Y ya por último...  :laugh:

He visto en un crypter que he encontrado por internet esta rutina para descifrar una sección


Código
  1. //Rutina encargada de descifrar la sección cifrada
  2. char uncryptroutine[] =       //21 bytes
  3.    "\xB8\x00\x10\x40\x00"  //B8 00104000  MOV EAX, 401000    Section Start  ||Este valor será modificado
  4.    "\x80\x30\xBB"          //8030 BB      XOR BYTE[EAX], BB  Key
  5.    "\x40"                  //40           INC EAX
  6.    "\x3D\x00\x45\x40\x00"  //3D 00454000  CMP EAX, 404500    Section End  ||Este valor será modificado
  7.    "\x75\xF5"              //75 F5        JNZ SHORT -11      (Complemento a dos de 11 = F5)
  8.    "\xB8\x00\x20\x40\x00"  //B8 00204000  MOV EAX, 402000    Pone en EAX el OEP || Este valor será modificado
  9.    "\xFF\xE0";             //FFE0         JMP EAX            Salta al OEP

Se supone que eso son instrucciones en ASM? :huh: :huh:

Saludos

En línea

"La física es el sistema operativo del Universo"
     -- Steven R Garman
daryo


Desconectado Desconectado

Mensajes: 1.070



Ver Perfil WWW
Re: [?] Duda PE Crypter
« Respuesta #1 en: 1 Julio 2014, 01:11 am »

no se mucho del formato pe , pero te recomiendo que no uses fopen sino la api de windows createfile y readfile y writefile googleando encontre esto http://www.rohitab.com/discuss/topic/33006-detailed-guide-to-pe-infection/

Citar
Se supone que eso son instrucciones en ASM?

es una shellcode http://es.wikipedia.org/wiki/Shellcode ,
En línea

buenas
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: [?] Duda PE Crypter
« Respuesta #2 en: 1 Julio 2014, 08:09 am »


Según he estado leyendo, tiene que haber espacio para poder insertar la sección, cosa que no compruebo, pero donde está el contenido de cada sección? Justo despues de IMAGE_SECTION_HEADER?
Se puede añadir una sección sin problemas pero requiere más trabajo, se debe incrementar el tamaño de las cabeceras y realinear todas las secciones
y posiblemente actualizar RVAs a cualquier posible sección realineada esto es imposible si el ejecutable no tiene tabla de relocalización, bueno es 80%
imposible todo depende del tipo de ejecutable.

Lo que habia pensado era guardar el contenido que hay justo después de la última sección, insertar la mia, insertar el contenido que he guardado, y modificar de cada sección el PointerToRawData sumando el tamaño de la cabecera de la nueva sección, para apuntar de nuevo donde empieza la sección :rolleyes:

Si no se hace así, a ver si alguien me puede dar una idea de como se hace.. Tengo los conceptos un poco liados  :-\[/size]
Eso y muchas cosas más http://foro.elhacker.net/analisis_y_diseno_de_malware/taller_en_construccionsecciones_en_archivos_pe-t362515.0.html;msg1912797#msg1912797

Dos cositas mas  :silbar:

He estado leyendo el código de [Zero] de como añadir una sección..

http://foro.elhacker.net/analisis_y_diseno_de_malware/srcc_anadir_una_seccion-t261801.0.html

Y veo que utiliza

En vez de utilizar esto
Hay alguna diferencia? (Ventajas)
definiciones de tipo para punteros a las estructuras.


Se supone que eso son instrucciones en ASM? :huh: :huh:

Saludos



En línea

MeCraniDOS


Desconectado Desconectado

Mensajes: 337


Sr. Glass


Ver Perfil
Re: [?] Duda PE Crypter
« Respuesta #3 en: 1 Julio 2014, 11:10 am »

no se mucho del formato pe , pero te recomiendo que no uses fopen sino la api de windows createfile y readfile y writefile

Y eso?  :huh:


Citar
Se supone que eso son instrucciones en ASM? :huh: :huh:

Saludos



Que bien, que yo sepa el ASM no es así (visualmente), pero ya me ha contestado daryo  :) :)

Cuando he dicho lo de la sección, era que mas o menos se lo que tengo que hacer, pero la lío tal y como lo hago, ya me habia leido el Taller en construcción que has pasado, y estaba intentando automatizar la Practica 1, agregar una sección, pero no se por donde seguir con el código porque siempre se rompe el ejecutable :huh:
En línea

"La física es el sistema operativo del Universo"
     -- Steven R Garman
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: [?] Duda PE Crypter
« Respuesta #4 en: 1 Julio 2014, 13:07 pm »


Y eso?  :huh:





Que bien, que yo sepa el ASM no es así (visualmente), pero ya me ha contestado daryo  :) :)

Cuando he dicho lo de la sección, era que mas o menos se lo que tengo que hacer, pero la lío tal y como lo hago, ya me habia leido el Taller en construcción que has pasado, y estaba intentando automatizar la Practica 1, agregar una sección, pero no se por donde seguir con el código porque siempre se rompe el ejecutable :huh:

ah te referis a los bytes de las instrucciones. mejor lee el entero archivo de una vez y luego vas analizando las
cabeceras del ejecutable y demás cosas.

En línea

MeCraniDOS


Desconectado Desconectado

Mensajes: 337


Sr. Glass


Ver Perfil
Re: [?] Duda PE Crypter
« Respuesta #5 en: 2 Julio 2014, 00:42 am »

Era eso a lo que me refería, gracias  ;D

Otra pregunta, Karcrack me ha recomendado que monte el fichero en memoria y haga las modificaciones en memoria  :silbar:

He estado investigando sobre el tema, y me he hecho este mini código, pero no se si es del todo correcto...


Código
  1.    PIMAGE_DOS_HEADER DOS_Header;
  2.  
  3.    char Fichero[] = "Test.exe";
  4.  
  5.    HANDLE hFile = CreateFile((LPCTSTR)Fichero,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
  6.  
  7.    if(hFile == INVALID_HANDLE_VALUE)
  8.    {
  9.        printf("No se puede abrir el fichero: %s Error: %lu\n", Fichero, GetLastError());
  10.        return EXIT_FAILURE;
  11.    }
  12.  
  13.    HANDLE FMapped = CreateFileMapping(hFile, 0, PAGE_READONLY, 0, 0, 0);
  14.  
  15.    if(FMapped == INVALID_HANDLE_VALUE)
  16.    {
  17.        printf("No se puede mapear el fichero en memoria. Error: %lu\n" , GetLastError());
  18.        CloseHandle(hFile);
  19.        return EXIT_FAILURE;
  20.    }
  21.  
  22.    BYTE *FileMapped = (BYTE*)MapViewOfFile(FMapped, FILE_MAP_READ, 0, 0, 0);
  23.  
  24.    if(FileMapped == NULL)
  25.    {
  26.        printf("No se puede mapear el fichero en memoria. Error: %lu\n" , GetLastError());
  27.        CloseHandle(FMapped);
  28.        CloseHandle(hFile);
  29.        return EXIT_FAILURE;
  30.    }
  31.  
  32.    DOS_Header = (PIMAGE_DOS_HEADER)&FileMapped[0];
  33.  
  34.    // ....

Alguien me puede decir si es la manera correcta de cargar el ejecutable en memoria? (Mapear el archivo en memoria) O si hay alguna manera mas fácil..  ;D

Buenas noches!  :D
« Última modificación: 2 Julio 2014, 01:05 am por MeCraniDOS » En línea

"La física es el sistema operativo del Universo"
     -- Steven R Garman
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: [?] Duda PE Crypter
« Respuesta #6 en: 2 Julio 2014, 04:38 am »

Era eso a lo que me refería, gracias  ;D

Otra pregunta, Karcrack me ha recomendado que monte el fichero en memoria y haga las modificaciones en memoria  :silbar:

He estado investigando sobre el tema, y me he hecho este mini código, pero no se si es del todo correcto...


Código
  1.    PIMAGE_DOS_HEADER DOS_Header;
  2.  
  3.    char Fichero[] = "Test.exe";
  4.  
  5.    HANDLE hFile = CreateFile((LPCTSTR)Fichero,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
  6.  
  7.    if(hFile == INVALID_HANDLE_VALUE)
  8.    {
  9.        printf("No se puede abrir el fichero: %s Error: %lu\n", Fichero, GetLastError());
  10.        return EXIT_FAILURE;
  11.    }
  12.  
  13.    HANDLE FMapped = CreateFileMapping(hFile, 0, PAGE_READONLY, 0, 0, 0);
  14.  
  15.    if(FMapped == INVALID_HANDLE_VALUE)
  16.    {
  17.        printf("No se puede mapear el fichero en memoria. Error: %lu\n" , GetLastError());
  18.        CloseHandle(hFile);
  19.        return EXIT_FAILURE;
  20.    }
  21.  
  22.    BYTE *FileMapped = (BYTE*)MapViewOfFile(FMapped, FILE_MAP_READ, 0, 0, 0);
  23.  
  24.    if(FileMapped == NULL)
  25.    {
  26.        printf("No se puede mapear el fichero en memoria. Error: %lu\n" , GetLastError());
  27.        CloseHandle(FMapped);
  28.        CloseHandle(hFile);
  29.        return EXIT_FAILURE;
  30.    }
  31.  
  32.    DOS_Header = (PIMAGE_DOS_HEADER)&FileMapped[0];
  33.  
  34.    // ....

Alguien me puede decir si es la manera correcta de cargar el ejecutable en memoria? (Mapear el archivo en memoria) O si hay alguna manera mas fácil..  ;D

Buenas noches!  :D

¿Porqué mapear el archivo? Suponiendo que se quiere agregar la sección al ejecutable y luego guardar la nueva imagen en disco
simplemente leer la imagen CreateFile+ReadFile
En línea

MeCraniDOS


Desconectado Desconectado

Mensajes: 337


Sr. Glass


Ver Perfil
Re: [?] Duda PE Crypter
« Respuesta #7 en: 2 Julio 2014, 14:54 pm »

¿Porqué mapear el archivo? Suponiendo que se quiere agregar la sección al ejecutable y luego guardar la nueva imagen en disco
simplemente leer la imagen CreateFile+ReadFile

Es como he visto que lo hacen los que dominan mucho del tema  :huh:

http://foro.elhacker.net/analisis_y_diseno_de_malware/srcc_rebuildpe-t262602.0.html


http://foro.elhacker.net/analisis_y_diseno_de_malware/srcc_anadir_una_seccion-t261801.0.html

http://foro.elhacker.net/analisis_y_diseno_de_malware/srcc_ampliar_seccion_ejecutable-t261800.0.html


En los códigos que hay ahí se trabaja desde memoria, y en funciones que he visto en otras webs, también trabajan mapeando el archivo y trabajando desde memoria :rolleyes:
En línea

"La física es el sistema operativo del Universo"
     -- Steven R Garman
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: [?] Duda PE Crypter
« Respuesta #8 en: 3 Julio 2014, 09:34 am »

Es como he visto que lo hacen los que dominan mucho del tema  :huh:

http://foro.elhacker.net/analisis_y_diseno_de_malware/srcc_rebuildpe-t262602.0.html


http://foro.elhacker.net/analisis_y_diseno_de_malware/srcc_anadir_una_seccion-t261801.0.html

http://foro.elhacker.net/analisis_y_diseno_de_malware/srcc_ampliar_seccion_ejecutable-t261800.0.html


En los códigos que hay ahí se trabaja desde memoria, y en funciones que he visto en otras webs, también trabajan mapeando el archivo y trabajando desde memoria :rolleyes:

Para mi el mapear el archivo es innecesario sino que alguien diga porque es necesario mapearlo.
En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [?] Duda PE Crypter
« Respuesta #9 en: 3 Julio 2014, 14:40 pm »

Para mi el mapear el archivo es innecesario sino que alguien diga porque es necesario mapearlo.
No es necesario mapearlo. En mi opinión es más sencillo trabajar cuando te olvidas de buffers. No tienes que usar una cosa para leer y otra para escribir, sencillamente trabajas con punteros y luego lo reflejas en disco...
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Crypter
Programación Visual Basic
CamaleonB 8 5,474 Último mensaje 15 Enero 2008, 17:50 pm
por ~~
Duda haciendo un crypter
Programación Visual Basic
aaronduran2 7 3,260 Último mensaje 27 Septiembre 2008, 13:25 pm
por aaronduran2
Duda para modificar un crypter
Análisis y Diseño de Malware
caramel0rar0 4 4,476 Último mensaje 5 Enero 2012, 14:16 pm
por caramel0rar0
[Duda] ¿Cómo crear un crypter? « 1 2 »
Análisis y Diseño de Malware
Yoker66666 13 13,081 Último mensaje 23 Julio 2012, 18:30 pm
por m0rf
Crypter Duda
Análisis y Diseño de Malware
Jeezy 1 2,557 Último mensaje 21 Abril 2018, 04:12 am
por xv0
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines