Ultima modifica:
Siccome la qualità di questa sezione e del forum in generale è abbastanza scadente, pubblico qualche master piece sperando possano essere punto di ispirazione e di ricerca non solo per il source engine.
In questo post spiego come prendere gli entity esternamente senza dover utilizzare una DLL il che significa si utilizzerà ReadProcessMemory per leggere i dati che ci servono.
Prima di tutto dando uno sguardo al SDK c'è la classe IClientEntityList che tiene la funzione GetClientEntity che serve a prendere un entity.
Percui prima di tutti apri OllyDbg, seleziona HL2.EXE come processo e dai moduli seleziona engine.dll
La stringa 'VClientEntityList003' è quella che ci interessa, percui cercala e guarda dov'è presente.
( quel 003 è la versione della classe, se non trovi la stringa molto probabilmente è cambiata la numerazione.. )
Ora che hai il puntatore portalo dentro ReClass...
Se hai guardato dentro l'SDK anche tu, hai visto che la funzione che ci interessava era alla terza posizione (partendo il conteggio da 0).
Percui ecco che ReClass ci mostra l'indirizzo della terza funzione che che verrà reversata.
La funzione è self explanatory. Controlla entnum, prende il playe.... ops, magari questo lo capisci anche tu, vero? 8)
Percui metti un breakpoint in un punto qualsiasi della funzione e non appena verrà hittato vedrai la magia:
EAX = entnum
ECX = Entity table
Percui ecco come ora puoi prendere gli entity esternamente senza dover injettare una DLL in gioco;
NOTE:
- 32 è il numero massimo di player che possono essere connessi al server, lascio a te investigare sulla funzione che tiene il numero di entities massimi nel server senza dover loopare 32 volte inutilmente. ( Non è dentro IClientEntityList )
- Questo è il concetto base per prendere tutti i dati che serviranno per l'external hack, per le altre funzioni il meccanismo non cambia.
- Sono stato schietto siccome nel fare l'anteprima del post è scaduta la sessione ed un pezzo è andato perduto
Have phun
In questo post spiego come prendere gli entity esternamente senza dover utilizzare una DLL il che significa si utilizzerà ReadProcessMemory per leggere i dati che ci servono.
Prima di tutto dando uno sguardo al SDK c'è la classe IClientEntityList che tiene la funzione GetClientEntity che serve a prendere un entity.
PHP:
for ( INT Index = 0; Index <= 32; Index++ )
{
IClientEntity *pEntity = m_pEntityList->GetClientEntity( Index );
...
}
Percui prima di tutti apri OllyDbg, seleziona HL2.EXE come processo e dai moduli seleziona engine.dll
La stringa 'VClientEntityList003' è quella che ci interessa, percui cercala e guarda dov'è presente.
PHP:
0CF0DB56 68 4475120D PUSH OFFSET 0D127544 ; ASCII "VClientEntityList003"
0CF0DB5B FF15 FCE7210D CALL DWORD PTR DS:[0D21E7FC]
0CF0DB61 83C4 08 ADD ESP,8
0CF0DB64 85C0 TEST EAX,EAX
0CF0DB66 A3 10E8210D MOV DWORD PTR DS:[0D21E810],EAX ; Puntatore della classe
( quel 003 è la versione della classe, se non trovi la stringa molto probabilmente è cambiata la numerazione.. )
Ora che hai il puntatore portalo dentro ReClass...
Se hai guardato dentro l'SDK anche tu, hai visto che la funzione che ci interessava era alla terza posizione (partendo il conteggio da 0).
Percui ecco che ReClass ci mostra l'indirizzo della terza funzione che che verrà reversata.
PHP:
14551770 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
14551774 85C0 TEST EAX,EAX
14551776 7C 19 JL SHORT 14551791
14551778 05 FFEFFFFF ADD EAX,-1001
1455177D C1E0 04 SHL EAX,4
14551780 8B0C08 MOV ECX,DWORD PTR DS:[ECX+EAX]
14551783 85C9 TEST ECX,ECX
14551785 74 0A JE SHORT 14551791
14551787 8B01 MOV EAX,DWORD PTR DS:[ECX]
14551789 8B50 18 MOV EDX,DWORD PTR DS:[EAX+18]
1455178C FFD2 CALL EDX
1455178E C2 0400 RETN 4
14551791 33C0 XOR EAX,EAX
14551793 C2 0400 RETN 4
La funzione è self explanatory. Controlla entnum, prende il playe.... ops, magari questo lo capisci anche tu, vero? 8)
Percui metti un breakpoint in un punto qualsiasi della funzione e non appena verrà hittato vedrai la magia:
EAX = entnum
ECX = Entity table
Percui ecco come ora puoi prendere gli entity esternamente senza dover injettare una DLL in gioco;
PHP:
DWORD GetEntity ( int Index )
{
static DWORD dwEntityTable = 0;
if ( !dwEntityTable )
{
dwEntityTable = dwClientModuleBase + 0x7073E4;
}
DWORD m_dwEntity;
ReadProcessMemory ( hProcessHL2, ( PVOID )( dwEntityTable + ( Index * 0x10 ) ), &m_dwEntity, sizeof( DWORD ), NULL );
return m_dwEntity;
}
NOTE:
- 32 è il numero massimo di player che possono essere connessi al server, lascio a te investigare sulla funzione che tiene il numero di entities massimi nel server senza dover loopare 32 volte inutilmente. ( Non è dentro IClientEntityList )
- Questo è il concetto base per prendere tutti i dati che serviranno per l'external hack, per le altre funzioni il meccanismo non cambia.
- Sono stato schietto siccome nel fare l'anteprima del post è scaduta la sessione ed un pezzo è andato perduto
Have phun