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:
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:
// 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;
}