Foro de elhacker.net

Programación => Ingeniería Inversa => Mensaje iniciado por: SheKeL_C$ en 22 Junio 2015, 21:57 pm



Título: Localizar entrypoint en un editor hexadecimal
Publicado por: SheKeL_C$ en 22 Junio 2015, 21:57 pm
Estoy haciendo un programa para modificar el entrypoint de otro, esto es lo que hago:

Voy a 0x3c contando desde el inicio y alli recojo la direccion de la cabezera a la cual le sumo 0x28 y me da el entrypoint en mi caso es [74 2E 00 00].

Si le abro con el ollydbg me daria la direccion: entrypoint + ImageBase = 74 2E 40 00.

Hasta aqui todo correcto.

Lo que quiero es obtener la direccion del entrypoint en un editor hexadecimal. Lo he localizado en el offset 0x2274..

Si hago la diferencia entre el entrypoint  (0x2E74) y la localizacion en el editor (0x2274) me da 0xC00..

De donde sale ese dato??

Como puedo posicionarme en un archivo al abrirlo en la direccion fisica (real) donde empezaria el programa?


Título: Re: Localizar entrypoint en un editor hexadecimal
Publicado por: MCKSys Argentina en 22 Junio 2015, 23:23 pm
Hola!

El problema que tienes radica en la diferencia que existe entre un ejecutable cargado en memoria y en disco.
Para determinar el offset en el archivo a partir de un RVA:

1) Determina la sección a la que apunta el RVA (en este caso debería ser la sección de codigo: .text, .CODE, etc.)
2) Réstale el RVA de la sección.
3) Súmale el offset de la sección en el archivo.

Saludos!


Título: Re: Localizar entrypoint en un editor hexadecimal
Publicado por: x64core en 23 Junio 2015, 19:30 pm
Si hago la diferencia entre el entrypoint  (0x2E74) y la localizacion en el editor (0x2274) me da 0xC00..

De donde sale ese dato??
La RVA de la sección del punto de entrada ( IMAGE_SECTION_HEADER.VirtualAddress ) menos el tamaño de las cabeceras ( IMAGE_OPTIONAL_HEADER.SizeofHeaders ).

Como puedo posicionarme en un archivo al abrirlo en la direccion fisica (real) donde empezaria el programa?
Muchos programas, uno simple es PEID:
Código:
https://tuts4you.com/download.php?view.398
al cargarlo muestra "File Offset", copiarlo y saltar a ese offset con el editor hexadecimal, ahi se debe de encontrar la primera instruccion.

MCKSys Argentina, Si es mediante código entonces seria trasladar un RVA a offset, el campo en IMAGE_OPTIONAL_HEADE.AddressOfEntryPoint es una valor relativo a la direccion base no un offset:

Código:
// VC++
ULONG RVAToOffset(
    _Out_ PDWORD OffsetPtr,
    _In_ PIMAGE_NT_HEADERS NT,
    _In_ DWORD RVA
    )
{
    PIMAGE_SECTION_HEADER Img;
    DWORD Limit;
    DWORD Offset;

    Offset = RVA;
    Img = IMAGE_FIRST_SECTION(NT);

    if (RVA < Img[0].PointerToRawData)
    {
        *OffsetPtr = Offset;
        return 0;
    }

    for (WORD i = 0; i < NT->FileHeader.NumberOfSections; i++)
    {
        if (Img[i].SizeOfRawData)
        {
            Limit = Img[i].SizeOfRawData;
        }
        else
        {
            Limit = Img[i].Misc.VirtualSize;
        }

        if (RVA >= Img[i].VirtualAddress &&
            RVA < (Img[i].VirtualAddress + Limit))
        {
            if (Img[i].PointerToRawData &&
                Img[i].SizeOfRawData)
            {
                Offset -= Img[i].VirtualAddress;
                Offset += Img[i].PointerToRawData;
                *OffsetPtr = Offset;

                return 0;
            }
        }
    }

    return 1;
}


Título: Re: Localizar entrypoint en un editor hexadecimal
Publicado por: MCKSys Argentina en 23 Junio 2015, 19:58 pm
MCKSys Argentina, Si es mediante código entonces seria trasladar un RVA a offset, el campo en IMAGE_OPTIONAL_HEADE.AddressOfEntryPoint es una valor relativo a la direccion base no un offset:

Recién me doy cuenta de que el ejemplo que puse era lo contrario: offset -> RVA.

De todas formas, las indicaciones están bien.  :P

Saludos!


Título: Re: Localizar entrypoint en un editor hexadecimal
Publicado por: karmany en 26 Junio 2015, 19:28 pm
Yo hice un programa hace años que calcula eso: la dirección virtual conociendo el offset o viceversa. Realmente te permite calcular los 3 tipos de direcciones que encontrarás:
Virtual Address, Relative Virtual Address y Offset
Tiene un pequeño archivo de ayuda y ahí explico cómo calcular a mano esos valores. Estoy convencido que puede serte útil.
http://foro.elhacker.net/ingenieria_inversa/file_location_calculator_v032_por_karmany-t262979.0.html (http://foro.elhacker.net/ingenieria_inversa/file_location_calculator_v032_por_karmany-t262979.0.html)

Además dispone de un potente editor hexadecimal.