Offset inicio/fin de .data

Iniciado por Destro-, 28 Noviembre 2014, 01:39 AM

0 Miembros y 1 Visitante están viendo este tema.

x64core

#10
Cita de: Destro- en 29 Noviembre 2014, 00:15 AM
Gracias por la info :P.
Puede ser que muy pocos utilicen ULONG_PTR ?, soy nuevo en C pero soy de leer mucho code y hasta ahora no recuerdo haber visto utilizar ULONG_PTR o.O.
La mayoria de "reversers", me refiero a los que aprenden primero a depurar programas con algun lenguaje de alto nivel como VB6 y luego intentan aprender un verdadero lenguaje como C/C++ es normal que recomienden/usen variables DWORD, DWORD64 para almacenar punteros, ellos deberian de aprender a programar de la manera correcta.

Usando ULONG_PTR no es la unica manera, también es posible usar BYTE*/PBYTE aunque yo también me siento mejor usando ULONG_PTR.

Cita de: Destro- en 29 Noviembre 2014, 00:15 AM
no entendí cuando decís que devuelva el puntero de IMAGE_SECTION_HEADER

por lo demás te referías a que haga algo así ?:

void get_setion_offset(HMODULE hModule, char *SetionName, ULONG_PTR &SetionStart, ULONG_PTR &SetionEnd)
{
IMAGE_NT_HEADERS *pNtHdr = ImageNtHeader(hModule);
PIMAGE_SECTION_HEADER pSectionHdr = (PIMAGE_SECTION_HEADER)(pNtHdr+1);

for(int i = 0 ; i < pNtHdr->FileHeader.NumberOfSections; i++, pSectionHdr++)
{
if(strcmp((char *)pSectionHdr->Name, SetionName) == 0)
{
SetionStart = (ULONG_PTR)hModule + pSectionHdr->VirtualAddress;
SetionEnd = SetionStart + pSectionHdr->Misc.VirtualSize;
break;
}
}
}

Usando esto no es lo correcto:
if(strcmp((char *)pSectionHdr->Name, SetionName) == 0)
IMAGE_SECTION_HEADER.Name es de tipo BYTE no una cadena asi que es totalmente valido que el nombre de la sección contenga
valores nulos o la longitud del nombre sea el maximo numero de bytes, en este caso 8; strcmp retornará un valor incorrecto en esos casos
memcmp estaba bien.

Me referia a algo como esto:

#define SIZE_OF_MEMBER(Type,Member) (SIZE_T)(sizeof(((Type*)0)->Member))

PIMAGE_SECTION_HEADER FindPESectionByName(IN PIMAGE_NT_HEADERS NT, IN BYTE SectionName[8])
{
   if (NT &&
       SectionName)
   {
       PIMAGE_SECTION_HEADER pFirstSection;
       pFirstSection = IMAGE_FIRST_SECTION(NT);
       for (ULONG s = 0; s < NT->FileHeader.NumberOfSections; s++)
       {
           if (!memcmp(
               SectionName,
               pFirstSection[s].Name,
               SIZE_OF_MEMBER(IMAGE_SECTION_HEADER, Name)))
           {
               return &pFirstSection[s];
           }

       }
   }
   return NULL;
}

Es sólo una función para obtener un puntero a la sección.

-
Códigos que parsean el formato PE deberían de ser escritos bajo un manejador de excepciónes en el mayor de los casos, sino fijate el monton de programas para parsear PE/PE32+ que se cierran cuando se abren imagenes PE "malformadas".



MCKSys Argentina

Cita de: x64Core en 29 Noviembre 2014, 02:19 AM
La mayoria de "reversers", me refiero a los que aprenden primero a depurar programas con algun lenguaje de alto nivel como VB6 y luego intentan aprender un verdadero lenguaje como C/C++ es normal que recomienden/usen variables DWORD, DWORD64 para almacenar punteros, ellos deberian de aprender a programar de la manera correcta.

Por Horus. En verdad, no sabes cómo hacer para ridiculizar a la gente, eh?

Si miras bien, verás que entre paréntesis están los tipos compatibles con los dados (unsigned long y unsigned long long). Que diga que estoy aprendiendo el lenguaje, no significa que sea un neófito en el tema. Simplemente no se puede saber todo acerca de todo.

La verdad, no sé para qué me todo el tiempo de escribir ésto.

Considéralo un recordatorio final.
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


x64core

Cita de: MCKSys Argentina en 29 Noviembre 2014, 03:21 AM
Por Horus. En verdad, no sabes cómo hacer para ridiculizar a la gente, eh?

Si miras bien, verás que entre paréntesis están los tipos compatibles con los dados (unsigned long y unsigned long long). Que diga que estoy aprendiendo el lenguaje, no significa que sea un neófito en el tema. Simplemente no se puede saber todo acerca de todo.

La verdad, no sé para qué me todo el tiempo de escribir ésto.

Considéralo un recordatorio final.
No sé a qué te refieres...