Gracias por la info
.
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. 
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.
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.
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í ?:
Usando esto no es lo correcto:por lo demás te referías a que haga algo así ?:
Código:
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;
}
}
}
Código:
if(strcmp((char *)pSectionHdr->Name, SetionName) == 0)
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:
Código
Es sólo una función para obtener un puntero a la sección.
#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++) { SectionName, pFirstSection[s].Name, SIZE_OF_MEMBER(IMAGE_SECTION_HEADER, Name))) { return &pFirstSection[s]; } } } return NULL; }
-
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".