Rilevazione o prevenzione delle iniezioni di memoria del processo su Windows (anti-hack)

5

Caso di hacking standard. Hack inietta in un processo di gioco avviato e scrive sulla memoria del processo utilizzando WriteProcessMemory call.

La situazione è la seguente:

  1. stiamo ospitando un server di gioco
  2. I client
  3. si uniscono al server con i loro giochi, possono corrompere i loro giochi usando vari hack
  4. non abbiamo alcuna possibilità di cambiare la fonte del gioco, è così com'è. Tuttavia, abbiamo la possibilità di far applicare il nostro programma prima che il client possa accedere al server.

Quindi, per dirla chiaramente: non possiamo offuscare la memoria di gioco, ma abbiamo la possibilità di eseguire un programma separato allo stesso tempo. Ho già provato a utilizzare una chiamata EnumProcessModules che elenca tutte le DLL di processo senza esito positivo. Mi sembra che gli hack si iniettino direttamente nella memoria del processo, quindi non viene rilevato. Dopo aver fatto un sacco di "ricerche di Google", ho trovato alcune opzioni:

  1. scansione per l'esecuzione di nomi di processi, file nella directory di gioco, modelli di byte di file, modelli di byte di processi in esecuzione ... questo compito richiede molto tempo poiché dovrei ottenere campioni di tutti gli hack disponibili e aggiornare il nostro programma ogni volta che ne esce uno nuovo. Tutte le informazioni di hacking devono essere memorizzate all'interno della fonte che può rendere il programma molto grande.

  2. Uso di ReadProcessMemory per monitorare le modifiche in offset di memoria ben noti (gli hack di solito usano gli stessi offset per ottenere qualcosa). Avrei bisogno di eseguire alcuni hack, monitorare il comportamento e ottenere campioni di comportamento di hacking quando si confronta con la corsa normale. Il programma farebbe fondamentalmente la stessa cosa che gli hack fanno ma al contrario.

  3. rileva WriteProcessMemory chiamata all'interno della memoria. Non sono sicuro se questo porterebbe alcuni falsi positivi dalle DLL legittime, ma l'idea sembra interessante. Come faccio a scansionare la memoria di processo per questa chiamata? Come ottenere il valore in byte di esso?

Questo è un esempio di una chiamata di hacking:

WriteProcessMemory(phandler,0xsomeoffset,&datatowrite,...);

L'offset è effettivamente corretto almeno in hack di basso livello. Se potessimo in qualche modo riorganizzare la pila o spingerla in qualche modo, potrebbe già incasinare l'hack per mandare in crash il gioco.

Alcuni altri fatti:

  1. i nuovi hack vengono pubblicati raramente e c'è un numero fisso di quelli che sono pubblicamente disponibili e funzionano effettivamente. Molti di questi funzionano anche in modo simile.
  2. L'obiettivo
  3. è di rilevare l'hack o di confonderlo con il funzionamento

La mia domanda qui è, quali sarebbero alcuni buoni modi per raggiungere i miei obiettivi qui? È gradita qualsiasi idea che possa confondere l'hack o aiutare a rilevare l'hack che viene iniettato o che la memoria sia cambiata.

So che non c'è modo di avere un sistema anti-hacking sicuro al 100% ma se prendiamo solo chi usa gli hack disponibili al pubblico è già il 95% degli hacker, non ci importa della minoranza di hacker intelligenti.

    
posta cen 25.06.2012 - 13:48
fonte

4 risposte

2

So che l'hai menzionato come inefficiente e sono completamente d'accordo, ma sicuramente potresti eseguire un timer di qualche tipo e scansionare continuamente per programmi come cheat engine e tsearch:)

Ecco un'altra idea completamente casuale: Potresti scrivere una funzione per controllare un byte a un offset nel tuo gioco e vedere se corrisponde al byte che vuoi essere lì, altrimenti non puoi chiamare un evento per chiudere il gioco o scrivere il byte corretto a quell'offset, Un'altra opzione potrebbe essere quella di controllare i byte contro i byte memorizzati su un server e se il byte è diverso, allora l'utente viene kickato.

Spero di darti qualche idea:)

    
risposta data 01.08.2012 - 20:33
fonte
6

Ooooohh, adoro domande come questa.

A destra, in primo piano:

we are hosting a game server

Bam, eccoti. Se il client deve inviare l'aggiornamento di stato al server di gioco prima che questo venga trasferito ad altri client, si ha la possibilità di analizzare lo stato del gioco per le modifiche. Ciò significa che è possibile rilevare i modelli anomali. Ad esempio, se all'improvviso vedi un enorme cambiamento di valore in oro, puoi chiudere l'utente fuori dal gioco.

Ci sono molti approcci statistici che puoi adottare. A parte l'ovvio "cambiamento enorme" o "azione impossibile", puoi applicare più soluzioni a lungo termine - come l'oro nel tempo. Supponendo che io conosca il trucco "non aggiungere ingenti quantità di oro al mio personaggio" potrei incrementare l'oro in quantità sicure nel tempo. Ottimo, se spingo sempre il limite. Tuttavia, quell'aumento costante non sarà correlato all'oro equivalente guadagnato in un gameplay coerente, quindi ... di nuovo, rileva e chiudi l'account.

La chiave qui è che queste sono cose che puoi fare sul lato server di cui l'utente finale non può fare nulla, anche se hanno manipolato lo stato del gioco.

Ora, sulle tue domande lato Win32. Innanzitutto, non penso che WriteProcessMemory sia una chiamata particolarmente valida per qualsiasi DLL, fatta eccezione per i debugger (che sostituiranno le istruzioni nel codice - questo è il modo in cui i breakpoint impostati dai debugger funzionano), tuttavia, non c'è modo puoi sostituirlo in modo affidabile per ogni chiamata sul sistema senza scrivere quello che è effettivamente un rootkit, vale a dire che influenzerai tutti, non solo te stesso. Quindi questa non è davvero un'opzione.

Una cosa che potresti fare - e non è un'impresa da poco - è controllare periodicamente la tua memoria eseguibile per le modifiche. Per ulteriori informazioni, consultare Codice di manomissione / autoprotezione sulla codeproject. Fondamentalmente, invoca periodicamente questo e blocca il gioco se rilevi eventuali modifiche.

Potresti anche considerare la firma del codice - non è ridicolmente costoso e fornisce un sistema integrato in Windows per impedire modifiche eseguibili offline.

Se memorizzi lo stato salvato localmente, potresti prendere in considerazione il salvataggio dei checksum e inviarli agli account del tuo server. No, questo non è a prova di proiettile, ma aggiunge ulteriore complessità.

Se hai intenzione di implementare una di queste funzionalità, dovrai alzare un po 'la barriera e rendere difficile la disattivazione, il salto o il funzionamento dei meccanismi di protezione da parte del cracker. Cerchiamo di essere chiari: se qualcuno è determinato abbastanza, hai finito, ma puoi almeno rendere le loro vite molto dolorose.

Il top articule per il reverse engineering sul mio elenco di letture è anche dal codice progetto . La guida è molto approfondita e dovrebbe darti una base eccellente in ciò che puoi fare per confondere e altrimenti disturbare i debugger. Passerò attraverso uno di essi, che penso sia fantastico:

 SetUnhandledExceptionFilter(UnhandledExcepFilter);
 __asm{xor eax, eax}
 __asm{div eax}

Questo è male. Fondamentalmente, come spiega l'articolo, UnhandledExceptionHandler viene chiamato su un processo non di debug come gestore di ultima istanza; tuttavia, in questo caso cancelliamo deliberatamente eax , quindi dividiamo per zero. Ciò causerà un errore del processore, che il sistema operativo invia al gestore delle eccezioni dell'eseguibile, solo se è collegato un debugger. Se è collegato un debugger, il debugger viene notificato e l'eseguibile si chiude.

Ovviamente, è abbastanza facile per un utente malintenzionato sostituire div eax con una o più istruzioni nop o qualcosa del genere, il che significa che l'esecuzione si limiterà a scorrere, ma una piccola auto-verifica lo riprende abbastanza facilmente.

Quindi, in conclusione quindi:

  • Il mio primo consiglio sarebbe quello di provare a rilevare cheat sul lato server. Qui, tieni tutte le chiavi. Potresti anche introdurre queste modifiche "oscure", cioè controllare e vedere chi sta barando, quindi analizzare i loro stati per vedere se funziona, senza interromperli.
  • Quindi, proverei periodicamente la verifica di sé in diverse forme:
    • In memoria, per quanto sia affidabile, dell'eseguibile.
    • In memoria, per quanto sia affidabile, delle strutture dati critiche.
    • Anche l'eseguibile su disco.
  • Infine, ho letto la guida alla reverse engineering dall'inizio alla fine e ho visto che cosa puoi applicare al tuo eseguibile. Mi rendo conto che hai detto che non puoi modificare il tuo eseguibile, ma onestamente, a meno che tu non lo faccia, è probabile che tu sia contrario. Dopo tutto, un secondo "processo di osservazione" può essere ucciso da un aggressore.
risposta data 02.08.2012 - 22:46
fonte
0

Vuoi creare la tua funzione WriteProcessMemory e collegarla al gioco exe e filtrare le chiamate false? O qualsiasi altra funzione che puoi intercettare con un flusso che puoi filtrare. Ad ogni modo, questo è molto avanzato e avresti bisogno di fornire tutte le chiamate kernel32.dll o qualcosa del genere. Fondamentalmente dovresti davvero farlo se vuoi proteggerlo in qualche modo da questo, forse un qualche tipo di filtraggio del flusso sarebbe d'aiuto, ma per scoprirlo dovrai passare un po 'di tempo con il debugger alla ricerca di un momento in cui il comando è decodificato, quindi puoi riempirlo con zeri. Il proxy SSL sarebbe utile avere separatamente come in EMAIL, quindi hai ricevuto il messaggio e prima di consegnarlo, esegui un controllo di scansione su di esso in un processo separato, e poi consegnalo alla cassetta postale su un altro account.

    
risposta data 26.06.2012 - 13:27
fonte
0

Per informazioni su come sconfiggere le chat ai tuoi giochi, ti consiglio il seguente articolo:

È un'eccellente panoramica di alcune delle sfide.

Se vuoi di più, puoi dare un'occhiata anche al seguente libro:

risposta data 02.08.2012 - 20:18
fonte

Leggi altre domande sui tag