Спустя три года, я думаю, я достаточно знаю, чтобы ответить на собственный вопрос. :)
Компьютерная программа обычно связывается с ядром с использованием предопределенных функций, называемых системными вызовами. Каждая ОС имеет различный набор вызовов, но часто они выполняют аналогичные функции, такие как: распределение памяти, чтение и запись файлов или обработка процессов. Согласно this page, в ядре Windows NT существует около 480+ системных вызовов.
Для любых целей, связанных с оборудованием, программы обычно прибегают к системным вызовам, потому что это то, что ОС делает лучше всего, и одна из этих вещей - это время знать. Компьютерные игры часто должны отображать 60 кадров в секунду, и для этого им нужно вызвать функцию рендеринга каждые 16.6ms. В Windows обычно используется «GetTickCount()», который возвращает количество миллисекунд, прошедших с момента выхода Windows («Если ни одна из миллисекунд, прошедших с момента последнего подсчета галочек, больше, чем 16ms, отрисуйте новый кадр, чтобы продолжить».).
SpeedHacking, в общем, работает, вводя код в выполняемый процесс и взламывая функции синхронизации, чтобы вернуть ускоренные/замедленные «тики», чтобы изменить скорость работы программы.
Хотя, я не могу быть уверен, как именно это достигается CE (исходный код довольно трудно понять), но другой программист снял аналогичную вещь (video) в Linux. В source code вы можете увидеть, как автор изменил аналогичный системный вызов для 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;
}
Я не уверен, как это обнаружено, но я бы ид с @ идею Гарольда, что игра, вероятно, разыскивает DLL получать инъекции.
Терминология nitpick: это выглядит как крючок оболочки libc для 'gettimeofday()', не создавая настраиваемое ядро с измененной функцией 'sys_gettimeofday()'. Таким образом, вы можете сказать, что они подключили функцию оболочки gettimeofday для перехвата системных вызовов и изменения возвращаемого значения. –