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


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Análisis y Diseño de Malware
| | |-+  Sencillo visor PE en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Sencillo visor PE en C  (Leído 52 veces)
fary


Conectado Conectado

Mensajes: 1.095



Ver Perfil WWW
Sencillo visor PE en C
« en: Hoy a las 16:14 »

Bueno, pues retomando un poco el maravilloso formato PE  :rolleyes: Me estoy lanzando a crear un visor PE con GUI y con modo consola en C :)

Este es el código del modo consola  :D

Código
  1. // Sencillo Visor PE  Consola v0.1
  2. // codigo por Fary
  3. // foro.elhacker.net
  4.  
  5. #include <windows.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8.  
  9. int MostrarSecciones(void * Mapa); // Muestra los datos de las secciones
  10. int MostrarImportaciones(void * Mapa); //Muestra las imports
  11. int MostrarExportaciones(void * Mapa); // Muestra las exports
  12.  
  13. int RVAToOffset(int IDDVirtual, int ISHVirtual, int ISHRaw); // Convierte direccion virtual en offset fisico
  14. DWORD AltRVAToOffset(DWORD RVA, void *Mapa); // AltRVAToOffset -> Convierte direccion virtual en offset fisico, version mejorada.
  15.  
  16.  
  17. HANDLE Consola;
  18.  
  19. int main()
  20. {
  21.    HANDLE archivo;
  22.    HANDLE marchivo;
  23.    DWORD TamanoArchivo;
  24.    LPVOID MapaArchivo;
  25.    int Opcion = 0;
  26.    char ruta[MAX_PATH] = {0};
  27.  
  28.    Consola = GetStdHandle(STD_OUTPUT_HANDLE);
  29.    printf("Indica la ruta del archivo (La Ruta no puede tener espacios): \n");
  30.    scanf("%s", &ruta);
  31.  
  32.    archivo = CreateFile(ruta, GENERIC_READ | GENERIC_WRITE,  0,0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); // abrimos el archivo EXE
  33.  
  34.    if(archivo == INVALID_HANDLE_VALUE)
  35.    {
  36.        printf("Error: No se pudo abrir el archivo.\n");
  37.        return 1;
  38.    }
  39.  
  40.    TamanoArchivo = GetFileSize(archivo,0);
  41.  
  42.    marchivo = CreateFileMappingA(archivo, 0 ,PAGE_READWRITE, 0, TamanoArchivo,0);
  43.  
  44.    if (marchivo == NULL)
  45.    {
  46.        printf("No se puede abrir el mapeo del archivo\n");
  47.        CloseHandle(archivo);
  48.        return 1;
  49.    }
  50.  
  51.    MapaArchivo = MapViewOfFile(marchivo, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  52.  
  53.    IMAGE_DOS_HEADER  * idh = (IMAGE_DOS_HEADER*)&MapaArchivo[0]; // Rellenamos el IMAGE_DOS_HEADER
  54.  
  55.    if (idh->e_magic != IMAGE_DOS_SIGNATURE)
  56.    {
  57.        printf("No es un PE Valido\n");
  58.        CloseHandle(archivo);
  59.        CloseHandle(marchivo);
  60.        return 0;
  61.    }
  62.  
  63.    IMAGE_NT_HEADERS * INTH = (IMAGE_NT_HEADERS*)&MapaArchivo[idh->e_lfanew];
  64.  
  65.    while(1)
  66.    {
  67.    system("CLS");
  68.    if(INTH->FileHeader.Machine == IMAGE_FILE_MACHINE_I386) // Mostrador el parametro machine
  69.    {
  70.        printf("FileHeader->Machine: x86\n");
  71.    }else if(INTH->FileHeader.Machine == IMAGE_FILE_MACHINE_AMD64)
  72.    {
  73.        printf("FileHeader->Machine: x64\n");
  74.    }
  75.  
  76.    if (INTH->FileHeader.Characteristics == IMAGE_FILE_EXECUTABLE_IMAGE) // Characteristics
  77.    {
  78.        printf("FileHeader->Characteristics: EXE");
  79.    }else if(INTH->FileHeader.Characteristics == IMAGE_FILE_DLL)
  80.    {
  81.        printf("FileHeader->Characteristics: DLL");
  82.    }else if(INTH->FileHeader.Characteristics == IMAGE_FILE_32BIT_MACHINE)
  83.    {
  84.        printf("FileHeader->Characteristics: 32-Bit\n");
  85.    }
  86.  
  87.    printf("FileHeader->NumberOfSections: 0x%x\n",INTH->FileHeader.NumberOfSections);
  88.  
  89.  
  90.    printf("OptionaHeader->AddressOfEntryPoint: 0x%x\n", INTH->OptionalHeader.AddressOfEntryPoint);
  91.    printf("OptionalHeader->ImageBase: 0x%x\n", INTH->OptionalHeader.ImageBase);
  92.    printf("OptionalHeader->SectionAlignment: 0x%x\n",INTH->OptionalHeader.SectionAlignment);
  93.    printf("OptionalHeader->FileAlignment: 0x%x\n",INTH->OptionalHeader.FileAlignment);
  94.    printf("OptionalHeader->SizeOfImage: 0x%x\n", INTH->OptionalHeader.SizeOfImage);
  95.    printf("OptionalHeader->SizeOfHeaders: 0x%x\n",INTH->OptionalHeader.SizeOfHeaders);
  96.  
  97.    printf("\nSelecciona que quieres hacer ahora: \n");
  98.    printf("1 - Ver secciones.\n");
  99.    printf("2 - Ver Import Table.\n");
  100.    printf("3 - Ver Export Table.\n");
  101.    printf("4 - Salir.\n->");
  102.    scanf("%i", &Opcion);
  103.  
  104.    switch(Opcion)
  105.    {
  106.        case 1:
  107.            system("CLS");
  108.            MostrarSecciones(MapaArchivo);
  109.            break;
  110.        case 2:
  111.            system("CLS");
  112.            MostrarImportaciones(MapaArchivo);
  113.            break;
  114.        case 3:
  115.            system("CLS");
  116.            MostrarExportaciones(MapaArchivo);
  117.            break;
  118.        case 4:
  119.            CloseHandle(archivo);
  120.            CloseHandle(marchivo);
  121.            return 0;
  122.    }
  123.    system("PAUSE");
  124.    }
  125.    return 0;
  126. }
  127.  
  128. int MostrarExportaciones(void * Mapa)
  129. {
  130.    IMAGE_DOS_HEADER * IDH = (IMAGE_DOS_HEADER*)&Mapa[0];
  131.    IMAGE_NT_HEADERS * INTH = (IMAGE_NT_HEADERS*)&Mapa[IDH->e_lfanew];
  132.    IMAGE_SECTION_HEADER * ISH;
  133.  
  134.    IMAGE_DATA_DIRECTORY * IDD = (IMAGE_DATA_DIRECTORY*)&(INTH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]);
  135.  
  136.    if (IDD->VirtualAddress == 0)
  137.    {
  138.        printf("No hay ExportTable.\n");
  139.        return 1;
  140.    }
  141.  
  142.    int i;
  143.  
  144.  
  145.    DWORD exportRaw = AltRVAToOffset(IDD->VirtualAddress, Mapa);
  146.  
  147.    IMAGE_EXPORT_DIRECTORY *IED = (IMAGE_EXPORT_DIRECTORY *)&Mapa[exportRaw];
  148.  
  149.    int a = AltRVAToOffset(IED->AddressOfNames, Mapa);
  150.  
  151.    DWORD * NombreFuncion = &Mapa[a];
  152.  
  153.    int e = AltRVAToOffset(IED->AddressOfFunctions, Mapa);
  154.    DWORD * DirFuncion = &Mapa[e];
  155.  
  156.    int z = AltRVAToOffset(IED->AddressOfNameOrdinals, Mapa);
  157.    WORD * Ordinal = &Mapa[z];
  158.  
  159.    for (i = 0; i < IED->NumberOfNames; i++)
  160.    {
  161.        DWORD nameOffset = AltRVAToOffset(NombreFuncion[i], Mapa);
  162.        char * funcName = (char*)&Mapa[nameOffset];
  163.  
  164.        DWORD dirfun = DirFuncion[Ordinal[i]];
  165.  
  166.        printf("%s -> 0x%x\n",funcName, dirfun);
  167.    }
  168.  
  169.    return 0;
  170. }
  171.  
  172. int MostrarImportaciones(void * Mapa)
  173. {
  174.    system("CLS");
  175.  
  176.    IMAGE_DOS_HEADER * IDH = (IMAGE_DOS_HEADER*)&Mapa[0];
  177.    IMAGE_NT_HEADERS * INTH = (IMAGE_NT_HEADERS*)&Mapa[IDH->e_lfanew];
  178.    IMAGE_DATA_DIRECTORY * IDD = (IMAGE_DATA_DIRECTORY*)&(INTH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]);
  179.    IMAGE_SECTION_HEADER * ISH;
  180.  
  181.    if (IDD->VirtualAddress == 0)
  182.    {
  183.        printf("No se encontro tabla de importaciones.\n");
  184.        return 1;
  185.    }
  186.  
  187.  
  188.    int i;
  189.  
  190.    ISH = IMAGE_FIRST_SECTION(INTH);
  191.  
  192.    for (i = 0; i < INTH->FileHeader.NumberOfSections; i++)
  193.    {
  194.        //ISH = (IMAGE_SECTION_HEADER*)&Mapa[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
  195.  
  196.        if(IDD->VirtualAddress >= ISH[i].VirtualAddress && IDD->VirtualAddress < (ISH[i].VirtualAddress + ISH[i].Misc.VirtualSize))
  197.        {
  198.            break;
  199.        }
  200.    }
  201.  
  202.    DWORD Offset = AltRVAToOffset(IDD->VirtualAddress, Mapa);//DWORD Offset = RVAToOffset(IDD->VirtualAddress,ISH[i].VirtualAddress, ISH[i].PointerToRawData);//(IDD->VirtualAddress - ISH->VirtualAddress) + ISH->PointerToRawData;
  203.  
  204.    IMAGE_IMPORT_DESCRIPTOR * IID = (IMAGE_IMPORT_DESCRIPTOR*)&Mapa[Offset];
  205.  
  206.    while (IID->Name != NULL)
  207.    {
  208.        DWORD nameOffset = AltRVAToOffset(IID->Name, Mapa);//RVAToOffset(IID->Name, ISH[i].VirtualAddress, ISH[i].PointerToRawData);//(IID->Name - ISH->VirtualAddress) + ISH->PointerToRawData;
  209.        char *dllName = (char*)&Mapa[nameOffset];
  210.  
  211.        SetConsoleTextAttribute(Consola, FOREGROUND_RED);
  212.        printf("DLL: %s\n", dllName);
  213.        SetConsoleTextAttribute(Consola, 0x0F);
  214.  
  215.        DWORD ThunkOffset = AltRVAToOffset(IID->OriginalFirstThunk,Mapa);//RVAToOffset(IID->OriginalFirstThunk,ISH[i].VirtualAddress, ISH[i].PointerToRawData);
  216.        IMAGE_THUNK_DATA * ITD = (IMAGE_THUNK_DATA*)&Mapa[ThunkOffset];
  217.  
  218.        while (ITD->u1.AddressOfData != NULL)
  219.        {
  220.            DWORD dirNombreFuncion = AltRVAToOffset(ITD->u1.AddressOfData, Mapa);//RVAToOffset(ITD->u1.AddressOfData,ISH[i].VirtualAddress, ISH[i].PointerToRawData);
  221.            IMAGE_IMPORT_BY_NAME *IIBN = (IMAGE_IMPORT_BY_NAME*)&Mapa[dirNombreFuncion];
  222.            printf("Funcion: %s\n",IIBN->Name);
  223.            ITD++;
  224.        }
  225.  
  226.        IID++;
  227.    }
  228.    return 0;
  229.  
  230. }
  231.  
  232.  
  233. DWORD AltRVAToOffset(DWORD RVA, void *Mapa)
  234. {
  235.    BYTE *base = (BYTE *)Mapa;
  236.  
  237.    IMAGE_DOS_HEADER *IDH = (IMAGE_DOS_HEADER *)base;
  238.    IMAGE_NT_HEADERS *INTH =
  239.        (IMAGE_NT_HEADERS *)(base + IDH->e_lfanew);
  240.  
  241.    IMAGE_SECTION_HEADER *ISH =
  242.        IMAGE_FIRST_SECTION(INTH);
  243.  
  244.    // Caso: RVA en headers
  245.    if (RVA < INTH->OptionalHeader.SizeOfHeaders)
  246.        return RVA;
  247.  
  248.    for (WORD i = 0; i < INTH->FileHeader.NumberOfSections; i++)
  249.    {
  250.        DWORD va   = ISH[i].VirtualAddress;
  251.        DWORD size = max(ISH[i].Misc.VirtualSize,
  252.                          ISH[i].SizeOfRawData);
  253.  
  254.        if (RVA >= va && RVA < va + size)
  255.        {
  256.            return (RVA - va) + ISH[i].PointerToRawData;
  257.        }
  258.    }
  259.  
  260.    // No encontrado
  261.    return 0;
  262. }
  263.  
  264. int RVAToOffset(int IDDVirtual, int ISHVirtual, int ISHRaw)
  265. {
  266.    return ((IDDVirtual - ISHVirtual) +  ISHRaw);
  267. }
  268.  
  269. int MostrarSecciones(void * Mapa)
  270. {
  271.    IMAGE_DOS_HEADER * IDH = (IMAGE_DOS_HEADER*)&Mapa[0];
  272.    IMAGE_NT_HEADERS * INTH = (IMAGE_NT_HEADERS*)&Mapa[IDH->e_lfanew];
  273.  
  274.  
  275.    IMAGE_SECTION_HEADER * ISH = IMAGE_FIRST_SECTION(INTH);
  276.  
  277.    int i;
  278.    for (i = 0; i < INTH->FileHeader.NumberOfSections; i++)
  279.    {
  280.        SetConsoleTextAttribute(Consola, FOREGROUND_RED);
  281.        printf("Name: %.8s\n", ISH[i].Name);
  282.        SetConsoleTextAttribute(Consola, 0x0F);
  283.        printf("VirtualAddress: 0x%x\n", ISH[i].VirtualAddress);
  284.        printf("SizeOfRawData: 0x%x\n",ISH[i].SizeOfRawData);
  285.        printf("PointerToRawData: 0x%x\n",ISH[i].PointerToRawData);
  286.    }
  287.  
  288.    return 0;
  289. }
  290.  


Se aceptan sugerencias de mejora y gente que quiera aprender junto a mí.

saludos.
En línea

Un byte a la izquierda.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Visor de Api's
Programación Visual Basic
el_chente23 9 6,242 Último mensaje 26 Abril 2006, 01:20 am
por Robokop
Log del visor de sucesos
Seguridad
jbmondeja 3 8,977 Último mensaje 4 Marzo 2011, 17:30 pm
por Novlucker
visor imagenes web
Desarrollo Web
javierdeejay 2 3,206 Último mensaje 9 Agosto 2012, 16:52 pm
por gothic_krow
Visor criptografico.
Hacking
LukaCrosszeria 0 2,873 Último mensaje 12 Junio 2013, 16:07 pm
por LukaCrosszeria
Visor de Eventos
Windows
Argos91 4 6,230 Último mensaje 16 Diciembre 2015, 06:36 am
por Argos91
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines