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