Guida Utilizzare GetClientEntity esternamente

Stato
Discussione chiusa ad ulteriori risposte.

HAL

Utente Silver
27 Marzo 2012
24
3
3
51
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.

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...

iqc4kl.jpg



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
 
Tempo perso è quello che hai usato per rispondere nei miei post
Direi decisamente minimo rispetto a quello impiegato da te per testare, scrivere e pubblicare il post (io ho impiegato per ambo i post circa 30 secondi della mia vita).
Detto ciò, frega zero quanto ti interessi il mio commento, è li per evitare che qualcuno perda tempo con il tuo thread, tutto qui, ormai tu già ci hai perso tempo
 
Direi decisamente minimo rispetto a quello impiegato da te per testare, scrivere e pubblicare il post (io ho impiegato per ambo i post circa 30 secondi della mia vita).
Detto ciò, frega zero quanto ti interessi il mio commento, è li per evitare che qualcuno perda tempo con il tuo thread, tutto qui, ormai tu già ci hai perso tempo

Leave khx. Già che ostenti merd* nei miei post pensando di scrivere cose utili ( e giuste rotfl )
 
Leave khx. Già che ostenti merd* nei miei post pensando di scrivere cose utili ( e giuste rotfl )
E' sicuramente giusta, si vede che hai molto da imparare. Il consiglio tuttavia (e mi ripeto) non era per te, ma per le persone che vogliono leggere questo tuo "articolo" - ma diciamo che poi è un insieme di qualche osservazione - cosa che invito a non fare poiché totalmente inutile. Capisco che non riesci ad accettarlo, anche io mi ricordo che ad ogni banalità ero felice e soddisfatto. Tranquillo che le vere soddisfazioni arriveranno ;) ciau ci si vede in forum
 
Gli external hack sono più gettonati nei forum esteri siccome per gli anticheat è più difficile individuarli, tranquillo confido in te che l'italia è più avanzata nello sviluppo di cheats; Tra trainers con CE e byte patch...
 
Gli external hack sono più gettonati nei forum esteri siccome per gli anticheat è più difficile individuarli, tranquillo confido in te che l'italia è più avanzata nello sviluppo di cheats; Tra trainers con CE e byte patch...
Forse non hai inteso: occuparsi di cheat è tempo perso!
 
Stato
Discussione chiusa ad ulteriori risposte.