Trzy lata później, myślę, że wiem wystarczająco dużo, aby odpowiedzieć na moje własne pytanie. :)
Program komputerowy zazwyczaj komunikuje się z jądrem przy użyciu predefiniowanych funkcji zwanych wywołaniami systemowymi. Każdy system operacyjny ma inny zestaw wywołań, ale często wykonuje podobne czynności, jak przydzielanie pamięci, odczytywanie i zapisywanie plików lub obsługiwanie procesów. Według this page, istnieje około 480+ wywołań systemowych w jądrze Windows NT.
W dowolnym celu, który zajmuje się sprzętem, programy zazwyczaj odwołują się do wywołań systemowych, ponieważ właśnie to system operacyjny robi najlepiej, a jedną z tych rzeczy jest znajomość czasu. Gry komputerowe często muszą renderować 60 klatek na sekundę i aby tak się stało, muszą wywoływać funkcję renderowania co 16,6 ms. W systemie Windows zwykle używa się "GetTickCount()", który zwraca liczbę milisekund, które upłynęły od czasu pojawienia się systemu Windows ("Jeśli liczba milisekund, które minęły od ostatniej liczby pasków, jest większa niż 16ms, należy ponownie wyświetlić nową klatkę.").
SpeedHacking, ogólnie rzecz biorąc, działa poprzez wprowadzenie kodu do działającego procesu i włamanie funkcji taktowania, aby przywrócić przyspieszone/spowolnione "tyknięcia" w celu modyfikacji prędkości programu.
Chociaż nie mogę być pewien, jak dokładnie to osiągnęło CE (kod źródłowy jest dość trudny do zrozumienia), ale inny programista wyciągnął podobną rzecz (video) na Linuksie. W wersji source code można zobaczyć, jak autor zmodyfikował podobne wywołanie systemowe dla systemu Linux ("gettimeofday()").
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;
}
Nie jestem pewien, jak to jest wykryte, ale chciałbym pójść z pomysłem @ Harolda, że gra prawdopodobnie dostrzega wtrysku DLL.
Pończocha terminologiczna: Wygląda to na hak pakowania libc dla 'gettimeofday()', nie budując niestandardowego jądra ze zmodyfikowaną funkcją 'sys_gettimeofday()'. Można powiedzieć, że podpięli funkcję gettimeofday wrapper, aby przechwycić wywołania systemowe i zmodyfikować wartość zwracaną. –