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

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Tutorial] Obtener dirección de struct dinámicamente
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Tutorial] Obtener dirección de struct dinámicamente  (Leído 1,633 veces)
david_BS

Desconectado Desconectado

Mensajes: 99



Ver Perfil WWW
[Tutorial] Obtener dirección de struct dinámicamente
« en: 3 Abril 2012, 21:44 pm »

Hola, esto es parte de un test que había hecho hace un tiempo, y a decir verdad la idea me la dió un usuario de este foro (Karman), aunque esto estaba hecho hace mucho tiempo atrás en otros sitios.

Esta demostración es completamente por medio de código, pero en la realidad lo que ocurre es que nosotros necesitamos saber por ejemplo, la dirección de una struct llamada 'Player' de un juego X. Osea que tendremos que usar algún depurador y obtenerla manualmente. Este tutorial no es acerca de eso, sino que se muestra como se puede obtener la dirección de una struct en memoria, de forma dinámica; sólo pasándole ciertos parámetros necesarios para que el programa pueda hallarla en memoria.

A continuación dejo el código, se trata de saber manejar punteros como para ir navegando la posición de la struct. El código tiene algunos comentarios, me da la impresión que no necesita mucha explicación.

Código:
//////////////////////////////////////////////////////////////////

//
// UTN FRGP
// 2012
// david_BS
// EMAIL: david_bs@live.com
//

//////////////////////////////////////////////////

#include <windows.h>
#include <stdio.h>

typedef int (*pfnUserMsgHook)(const char *pszName, int iSize, void *pbuf);

struct paquete {

int index;
double asd;
double rr;
float gg;
};

struct paquete pak0_s;
struct paquete* pak1_s;
static int callmuestra(char *szMsgName, pfnUserMsgHook pfn);
static int hookmuestra(char *szMsgName, pfnUserMsgHook pfn);


Punto de entrada del programa
Código:
int main(){

BYTE* address=(BYTE*)&hookmuestra;// ustedes sabrán porque es BYTE* (para luego incrementar de a 1 byte :p)
DWORD* address2=(DWORD*)&callmuestra;// DWORD incrementa de a 4 bytes

printf("hookmuestra: %x\n", address);//401040
printf("callmuestra: %x\n", address2);//401030

struct paquete* ptr = (paquete*)  (
*(DWORD*)
(
(
(address+=10)

+

*(DWORD*)(address+1)

+

5
)
+
2
)
 );

    printf("La direccion de la struct es: %x\n", ptr);

// Logueamiento parte por parte
// printf("address %x\n", address);
//printf("address %x\n", address+=10);//sólo sino se usa ptr que ya incrementa 10
// printf("address %x\n", *(DWORD*)(address+1));
// printf("address %x\n", address + *(DWORD*)(address+1) +5);
// printf("address %x\n", *(DWORD*)((address + *(DWORD*)(address+1) +5) +2 ));

system("pause");
return 0;
}

La función 'callmuestra' contiene la referencia a la struct
Código:
static int callmuestra(char *szMsgName, pfnUserMsgHook pfn){

pak0_s.index = 5;

return 0;
}

static int hookmuestra(char *szMsgName, pfnUserMsgHook pfn){


callmuestra(szMsgName,pfn);

return 0;
}

Con un debugger o depurador, pueden acceder a la memoria de este programa y observar el código de cada función, y de la localización de la struct.
Pueden usar el depurador que viene con el compilador, en mi caso uso el depurador del MSVC++ 6.0 , o el de codeblocks.

también dejé algunos comentarios en el ASM de los dumps

Código:
//callmuestra
00401030   C705 10A94000 05>MOV DWORD PTR DS:[40A910],5 //+2 (direccion de struct)
0040103A   33C0             XOR EAX,EAX
0040103C   C3               RETN

Código:
//hookmuestra
00401040   8B4424 08        MOV EAX,DWORD PTR SS:[ESP+8]
00401044   8B4C24 04        MOV ECX,DWORD PTR SS:[ESP+4]
00401048   50               PUSH EAX
00401049   51               PUSH ECX //+10
0040104A   E8 E1FFFFFF      CALL ptr_to_s.00401030 //+1=E8 (+5 = E8+offset)
0040104F   83C4 08          ADD ESP,8
00401052   33C0             XOR EAX,EAX
00401054   C3               RETN

Código:
0040A940   0000             ADD BYTE PTR DS:[EAX],AL
0040A942   0000             ADD BYTE PTR DS:[EAX],AL
0040A944   0000             ADD BYTE PTR DS:[EAX],AL
0040A946   0000             ADD BYTE PTR DS:[EAX],AL
0040A948   0000             ADD BYTE PTR DS:[EAX],AL
0040A94A   0000             ADD BYTE PTR DS:[EAX],AL
0040A94C   0000             ADD BYTE PTR DS:[EAX],AL
0040A94E   0000             ADD BYTE PTR DS:[EAX],AL
0040A950   0000             ADD BYTE PTR DS:[EAX],AL
0040A952   0000             ADD BYTE PTR DS:[EAX],AL
0040A954   0000             ADD BYTE PTR DS:[EAX],AL
0040A956   0000             ADD BYTE PTR DS:[EAX],AL
0040A958   0000             ADD BYTE PTR DS:[EAX],AL
0040A95A   0000             ADD BYTE PTR DS:[EAX],AL
0040A95C   0000             ADD BYTE PTR DS:[EAX],AL
0040A95E   0000             ADD BYTE PTR DS:[EAX],AL
0040A960   0000             ADD BYTE PTR DS:[EAX],AL
0040A962   0000             ADD BYTE PTR DS:[EAX],AL
0040A964   0000             ADD BYTE PTR DS:[EAX],AL
0040A966   0000             ADD BYTE PTR DS:[EAX],AL
0040A968   0000             ADD BYTE PTR DS:[EAX],AL
0040A96A   0000             ADD BYTE PTR DS:[EAX],AL
0040A96C   0000             ADD BYTE PTR DS:[EAX],AL
0040A96E   0000             ADD BYTE PTR DS:[EAX],AL
0040A970   0000             ADD BYTE PTR DS:[EAX],AL
0040A972   0000             ADD BYTE PTR DS:[EAX],AL
0040A974   0000             ADD BYTE PTR DS:[EAX],AL
0040A976   0000             ADD BYTE PTR DS:[EAX],AL
0040A978   0000             ADD BYTE PTR DS:[EAX],AL
0040A97A   0000             ADD BYTE PTR DS:[EAX],AL
0040A97C   280A             SUB BYTE PTR DS:[EDX],CL
0040A97E   0000             ADD BYTE PTR DS:[EAX],AL
0040A980   0105 00000500    ADD DWORD PTR DS:[50000],EAX

Proyecto MSVC++ 6.0

Que sigan bien ;-D


« Última modificación: 3 Abril 2012, 21:58 pm por david_BS » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[SOLUCIONADO]¿Como printear un valor de un struct dentro de otro struct?
Programación C/C++
Firos 0 5,013 Último mensaje 24 Marzo 2011, 13:47 pm
por Firos
Obtener Direccion URL de Chrome?
Programación C/C++
x64core 2 3,884 Último mensaje 23 Febrero 2012, 10:05 am
por x64core
No se actualiza dinámicamente zona de búsqueda directa.
Redes
slyfx 0 1,334 Último mensaje 9 Octubre 2013, 19:20 pm
por slyfx
Depurar DLL cargada dinámicamente
Programación C/C++
javiherro 7 2,880 Último mensaje 11 Diciembre 2013, 11:14 am
por javiherro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines