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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Offset inicio/fin de .data
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Offset inicio/fin de .data  (Leído 5,377 veces)
Destro-

Desconectado Desconectado

Mensajes: 66


www.onlyarg.com.ar


Ver Perfil WWW
Offset inicio/fin de .data
« en: 28 Noviembre 2014, 01:39 am »

Buenas :)


Necesito reemplazar un string en la memoria de otro modulo cargado en el mismo proceso.
Arme algo así:
Código:
	MODULEINFO mInfo;
int base, start, end;
GetModuleInformation(GetCurrentProcess(),GetModuleHandle("swds.dll"),&mInfo,sizeof(mInfo));

start = (int)mInfo.lpBaseOfDll;
end = start+mInfo.SizeOfImage;

char find_stats[18] = { 'm', 'o', 't', 'd', '_', 'w', 'r', 'i', 't', 'e', 0, 0, 's', 't', 'a', 't', 's', 0 };
for(int p=0; (start+p) < (end-sizeof(find_stats)); p++)
{
if(memcmp((void*)(start+p), &find_stats, sizeof(find_stats)) == 0)
{
memcpy((void*)(start+p+15), &"l", 1);
//char *p = (char *)(start+p+15);
//*p = 'l';
}
}
Funciona perfecto, pero buscaría en todo el modulo y no donde importa. Hay alguna forma de obtener el start y end addres de la sección .data ?.
Estuve buscando en stackoverflow pero no encontré casi nada (tal vez busque mal xd) y lo que encontré no lo entendí :\.

Y otra duda, la parte que esta comentada, porque me crashea ?, creería yo que tendría que funcionar o.O.


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Offset inicio/fin de .data
« Respuesta #1 en: 28 Noviembre 2014, 02:39 am »

http://en.wikipedia.org/wiki/Portable_Executable

En la base del modulo hay una IMAGE_DOS_HEADER, con el offset en el campo e_lfanew llegas a la IMAGE_NT_HEADERS, ahi tenes el campo: NumberOfSections
The number of sections. This indicates the size of the section table, which immediately follows the headers.

Un array de IMAGE_SECTION_HEADERs, ahi estan todas las secciones del PE.

Tenes dos variables p ahi ... y el codigo usa la segunda para sumar que es el puntero indefinido.

warning C4700: uninitialized local variable 'p' used


En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Destro-

Desconectado Desconectado

Mensajes: 66


www.onlyarg.com.ar


Ver Perfil WWW
Re: Offset inicio/fin de .data
« Respuesta #2 en: 28 Noviembre 2014, 04:02 am »

tengo que sacar un turno para el oculista ya!, jaja :P

Gracias :D
Me quedo algo así:
Código:
void get_data_offset(HMODULE hModule, unsigned int &DataStart, unsigned int &DataEnd)
{
char *dllImageBase = (char*)hModule;

IMAGE_NT_HEADERS *pNtHdr = ImageNtHeader(hModule);

IMAGE_SECTION_HEADER *pSectionHdr = (IMAGE_SECTION_HEADER *)(pNtHdr+1);

for(int i = 0 ; i < pNtHdr->FileHeader.NumberOfSections; i++)
{
char *name = (char*) pSectionHdr->Name;
if(memcmp(name, ".data", 5) == 0)
{
DataStart = (unsigned int)dllImageBase + pSectionHdr->VirtualAddress;
DataEnd = DataStart + pSectionHdr->Misc.VirtualSize;
break;
}
pSectionHdr++;
}
}

// ======================================================

unsigned int start, end;
get_data_offset(GetModuleHandle("swds.dll"), start, end);


char find_stats[] = { 'm', 'o', 't', 'd', '_', 'w', 'r', 'i', 't', 'e', 0, 0, 's', 't', 'a', 't', 's', 0 };

for(unsigned int p=0; (start+p) < (end-sizeof(find_stats)); p++)
{
if(memcmp((void*)(start+p), &find_stats, sizeof(find_stats)) == 0)
{
//memcpy((void*)(start+p+15), &"l", 1);
char *pChar = (char *)(start+p+15);
*pChar = 'l';

//SERVER_PRINT("Pached: stats\n");
}
}
algo para mejorar ?.
____________________
Una duda, para almacenar punteros/direcciones de memoria es correcto utilizar int/unsigned int  ?. porque por ejemplo dllImageBase es un puntero char, es lo mismo ?.



En línea

MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.471


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Offset inicio/fin de .data
« Respuesta #3 en: 28 Noviembre 2014, 04:57 am »

Una duda, para almacenar punteros/direcciones de memoria es correcto utilizar int/unsigned int  ?. porque por ejemplo dllImageBase es un puntero char, es lo mismo ?.

Los punteros te conviene guardarlos sin signo. Si estás en 32 bits puedes usar DWORD (unsigned long) y en 64 bits DWORD64 (unsigned long long)

Saludos!
En línea

MCKSys Argentina

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

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Offset inicio/fin de .data
« Respuesta #4 en: 28 Noviembre 2014, 10:06 am »

Una duda, para almacenar punteros/direcciones de memoria es correcto utilizar int/unsigned int  ?. porque por ejemplo dllImageBase es un puntero char, es lo mismo ?.

Si queres guardar la direccion en una variable entera mejor usar ULONG_PTR que ocupara los bytes correspondientes a la plataforma (4 bytes en x86 y 8 bytes en x64) y no tendra signo.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.471


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Offset inicio/fin de .data
« Respuesta #5 en: 28 Noviembre 2014, 16:41 pm »

Si queres guardar la direccion en una variable entera mejor usar ULONG_PTR que ocupara los bytes correspondientes a la plataforma (4 bytes en x86 y 8 bytes en x64) y no tendra signo.

jejeje, que grande Eternal Idol! También agradezco el dato (recién estoy emezando con VC++)

Saludos!
En línea

MCKSys Argentina

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

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Offset inicio/fin de .data
« Respuesta #6 en: 28 Noviembre 2014, 17:01 pm »

jejeje, que grande Eternal Idol! También agradezco el dato (recién estoy emezando con VC++)

Saludos!

De nadas  ::)
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Offset inicio/fin de .data
« Respuesta #7 en: 28 Noviembre 2014, 17:31 pm »

algo para mejorar ?.
____________________
Una duda, para almacenar punteros/direcciones de memoria es correcto utilizar int/unsigned int  ?. porque por ejemplo dllImageBase es un puntero char, es lo mismo ?.


Sí, para de usar este tipo de hardcoding:
Código:
IMAGE_SECTION_HEADER *pSectionHdr = (IMAGE_SECTION_HEADER *)(pNtHdr+1);
Hace que tu código sea generico además de que no tiene sentido si haces luego una comparación del nombre, en lugar de escribir funciones para recuperar un puntero a una determinada sección (PIMAGE_SECTION_HEADER) que luego podes usar en otros códigos;
Lo mismo aquí:
Código:
memcmp(name, ".data", 5) == 0)
Mejor utiliza sizeof para IMAGE_SECTION_HEADER.Name.

En línea

Destro-

Desconectado Desconectado

Mensajes: 66


www.onlyarg.com.ar


Ver Perfil WWW
Re: Offset inicio/fin de .data
« Respuesta #8 en: 29 Noviembre 2014, 00:15 am »

Si queres guardar la direccion en una variable entera mejor usar ULONG_PTR que ocupara los bytes correspondientes a la plataforma (4 bytes en x86 y 8 bytes en x64) y no tendra signo.
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.


Sí, para de usar este tipo de hardcoding:
Código:
IMAGE_SECTION_HEADER *pSectionHdr = (IMAGE_SECTION_HEADER *)(pNtHdr+1);
Hace que tu código sea generico además de que no tiene sentido si haces luego una comparación del nombre, en lugar de escribir funciones para recuperar un puntero a una determinada sección (PIMAGE_SECTION_HEADER) que luego podes usar en otros códigos;
Lo mismo aquí:
Código:
memcmp(name, ".data", 5) == 0)
Mejor utiliza sizeof para IMAGE_SECTION_HEADER.Name.
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í ?:
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;
}
}
}

En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Offset inicio/fin de .data
« Respuesta #9 en: 29 Noviembre 2014, 01:07 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.

Ni idea, esta entre los Migrations Tips de Microsoft para x64: Storing a 64-bit Value.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda: Local data exceeds data segment size limit
Programación C/C++
mjpedia 2 3,637 Último mensaje 4 Junio 2010, 22:10 pm
por Gallu
escribir un "echo data >> data.xx" en un .bat con batch.[Solucionado]
Scripting
pilotcast 2 3,168 Último mensaje 28 Abril 2013, 14:02 pm
por daryo
Un día lo ví (offset)
Dudas Generales
Kil On 0 1,335 Último mensaje 9 Junio 2013, 23:41 pm
por Kil On
sqlmap inyección con --data del tipo multipart/form-data
Hacking
ukraniano 1 3,296 Último mensaje 24 Mayo 2014, 06:37 am
por zxero22
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines