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

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ... 34
71  Seguridad Informática / Análisis y Diseño de Malware / Re: duda bifrost y poison ivy en: 2 Julio 2014, 01:13 am
Pruébalo, siempre puedes utilizar una máquina virtual y miras a ver sí hace correctamente lo que envías  :rolleyes:

Saludos
72  Programación / Programación C/C++ / Re: principiante en: 2 Julio 2014, 00:50 am
¿El char cadena[4000] y el FILE *fichero los colocaste en el segundo código?

Creo que si lo ha copiado, debe pensar que no se pueden declarar las variables dentro del case y no las ha puesto  :silbar:

Saludos
73  Seguridad Informática / Análisis y Diseño de Malware / Re: [?] Duda PE Crypter 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
74  Seguridad Informática / Análisis y Diseño de Malware / Re: [?] Duda PE Crypter 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:
75  Seguridad Informática / Análisis y Diseño de Malware / [?] 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

76  Programación / Programación C/C++ / Re: comprobar numero repetido en un vector en: 26 Junio 2014, 02:05 am

Código
  1. #include <stdio.h>
  2.  
  3. int main(void) {
  4.    int poderes[100];
  5.    int usados[100];
  6.    int i,poderElegido,x;
  7.  
  8.    for(i=0; i<100;i++) //Lleno el array de poderes del 0 al 99
  9.        poderes[i] = i;
  10.  
  11.    for(i=0;i<100;i++) //lleno el array de usados de '-1'
  12.        usados[i] = -1;
  13.  
  14.    i = 0;
  15.    while(i<5) { //Pido un poder y lo voy guardando en el array 'usados'
  16.        printf("Elige un poder: ");
  17.        scanf("%d",&poderElegido);
  18.        for(x=0;x<100;x++) {
  19.            if(usados[x] == poderElegido) {
  20.                printf("Ya has elegido este poder");
  21.                i = 5; //salimos del bucle si ya hemos usado ese poder
  22.            }
  23.        }
  24.        usados[i] = poderElegido;
  25.        i++;
  26.    }
  27.  
  28.    return 0;
  29. }
  30.  
  31.  

Puedes quitar todos los bucles for que has puesto, y si te fijas, poderes[100], no lo utilizas para nada, asi que malgastas memoria, este codigo es mas simple

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    int usados[100] = {0};
  6.    int i=0, poderElegido=0;
  7.  
  8.    while(i<5)
  9.    {
  10.        //Pido un poder y lo voy guardando en el array 'usados'
  11.        printf("Elige un poder: ");
  12.        scanf("%d",&poderElegido);
  13.  
  14.        if(poderElegido>=0 && poderElegido<100)
  15.        {
  16.            if(usados[poderElegido] != 0)
  17.            {
  18.                printf("Ya has elegido este poder");
  19.                i = 5; //salimos del bucle si ya hemos usado ese poder
  20.            }
  21.            else
  22.            {
  23.                usados[poderElegido] = 1;
  24.            }
  25.  
  26.            i++;
  27.        }
  28.        else
  29.        {
  30.            printf("Poder invalido\n");
  31.        }
  32.    }
  33.  
  34.    return 0;
  35. }
  36.  


Saludos
77  Programación / Programación C/C++ / Re: Ayuda funciones de strings en: 26 Junio 2014, 01:43 am
Hola twiny14,

Nadie te va a hacer la tarea, pero como ayuda te puedo decir que lo que te piden es esto:

Código
  1. /* strtok example */
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. int main ()
  6. {
  7.  char str[] ="- This, a sample string.";
  8.  char * pch;
  9.  printf ("Splitting string \"%s\" into tokens:\n",str);
  10.  pch = strtok (str," ,.-");
  11.  while (pch != NULL)
  12.  {
  13.    printf ("%s\n",pch);
  14.    pch = strtok (NULL, " ,.-");
  15.  }
  16.  return 0;
  17. }

Puedes leer un poco sobre la función en http://www.cplusplus.com/reference/cstring/strtok/

Lo que puedes hacer dentro de esa funcion es recorrer con un bucle la cadena que quieres separar y contar las veces que aparece el caracter, luego declaras una matriz con ese tamaño y simplemente vas copiando hasta que encuentres ese caracter, luego incrementas el indice de la matriz y sigues copiando, asi hasta el final  :silbar:

Espero que te sirva de ayuda,

Saludos
78  Programación / Programación C/C++ / Re: Ayuda en un programa del bloc de notas en: 26 Junio 2014, 01:36 am
Código
  1. while((w=getc(doc)) != EOF);

Quita el punto y coma  :rolleyes:

Saludos
79  Programación / Programación C/C++ / Re: Ayuda con el datagridview en: 22 Junio 2014, 13:40 pm
C#?
80  Programación / Programación C/C++ / Re: Como Instalo la libreria SFML en CodeBlocks en: 22 Junio 2014, 13:38 pm
Hola alguien me puede explicar como instalar esta librería SFML en CodeBlocks porvafor amigos :D :D :D

Busca un poco  ;)

http://foro.elhacker.net/programacion_cc/aporte_compilar_sfml_estaticamente-t396527.0.html

Saludos
Páginas: 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ... 34
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines