Tre anni dopo, penso di sapere abbastanza per rispondere alla mia domanda. :)
Un programma per computer di solito comunica con il kernel utilizzando funzioni predefinite chiamate chiamate di sistema. Ogni sistema operativo ha un diverso set di chiamate, ma spesso fanno cose simili come: allocare memoria, leggere e scrivere file o gestire i processi. Secondo this page, ci sono circa 480+ chiamate di sistema nel kernel di Windows NT.
Per qualsiasi scopo che riguarda l'hardware, i programmi di solito ricorrono alle chiamate di sistema perché è quello che OS fa meglio e una di queste cose è sapere il tempo. I giochi per computer hanno spesso bisogno di rendere 60 fotogrammi/secondo e per far sì che succeda hanno bisogno di chiamare la funzione di rendering ogni 16.6 ms. In Windows, per questo viene utilizzato "GetTickCount()", che restituisce il numero di millisecondi trascorsi da quando Windows è stato attivo ("Se non è trascorso alcun millisecondo dall'ultimo tick count è più di 16ms, eseguire il rendering di un nuovo frame else.").
SpeedHacking, in generale, funziona inserendo il codice nel processo in esecuzione e hacking le funzioni di temporizzazione per restituire "ticks" accelerati/rallentati per modificare la velocità di esecuzione del programma.
Anche se, non posso essere sicuro di come esattamente CE ha raggiunto questo (il codice sorgente è piuttosto difficile da capire) ma un altro programmatore ha ottenuto una cosa simile (video) su Linux. Nello source code, è possibile vedere come l'autore ha modificato una chiamata di sistema simile per Linux ("gettimeofday()") per questo.
go gettimeofday_orig;
int val;
gettimeofday_orig=(go)dlsym(RTLD_NEXT,"gettimeofday");
if (!timezero)
{
timezero = new timeval;
val = gettimeofday_orig(timezero,tz);
(*tv) = (*timezero);
return val;
}
Non sono sicuro di come viene rilevato, ma mi piacerebbe andare con l'idea di @ Harold che il gioco probabilmente vede la DLL iniettata.
Terminologia nitpick: Sembra un hook del wrapper libc per 'gettimeofday()', non crea un kernel personalizzato con una funzione 'sys_gettimeofday()' modificata. Quindi potresti dire che hanno agganciato la funzione wraime gettimeofday per intercettare le chiamate di sistema e modificare il valore di ritorno. –