Funktionsweise eines "PC-Speed Hack"?



  • Hallo zusammen

    Ich möchte gerne die Frage, wie ein sogenannter "PC-Speed Hack", also ein Programm, dass die Abläufe auf dem PC langsamer oder schneller zum Ablauf bringen kann, funktioniert.

    Als erstes kam mir da in den Sinn, dass es sein könnte, dass die Abläufe eigentlich von Natur aus extrem schnell wären, sie aber vom Betriebsssystem abgebremst werden. Als Beispiel das Minimieren eines Fenster / Programm und dessen Wiederherstellung. Wenn man sich vorstellt wie schnell der Computer eigentlich diesen Vorgang in die Tat umsetzen kann, wird einem schnell klar, dass es mit dem blosen Auge gar nicht sichtbar wäre, dass sich etwas zwischen dem Minimierungsbeginn und dem Minimierungsende, verändert hat.

    So müssten gewisse Abläufe eventuell gewollt abgebremmst werden. Oder wie genau können diese "PC-Speed Hacks" den Ablauf am PC verlangsamen und verschnellern? Das würde dann auch erklären, wie die Game Speed Hacks funktionieren.

    Als Beispiel hierfür: Der Spieler hat eine Walk Methode in der Klasse Player. Diese Methode sorgt mit Zahlenwerten für den Speed. Würden jetzt Abläufe im Assembler verringert werden, würde es viel länger dauern, bis die Walk methode den spieler mehrfach zum bewegen bringt. Wird nun der Assembler Ablauf aber schneller durchgeführt, so würde die Walk methode um den Faktor n schneller aufgerufen werden und der Spieler läuft demnach auch schneller.

    Es muss also möglich sein, in den Geschwindigkeitsablauf der Assemblerumsetzung der CPU, einzugreifen um Routinen langsamer oder schneller durchzuarbeiten.

    Könnte nun auch sein, dass das alles Blödsinn ist und genau deswegen, um endlich mal zu wissen wie diese Hexerrei funktioniert, bin ich nun hier. Also bitte meine Geeks, ich bin ganz Ohr 😋



  • Hat wenig mit Assembler zu tun, aber ein SpeedHack könnte z.B. so laufen:

    auto time = std::clock();
    for (auto i = begin(objects); i != end(objects); ++i)
    {
      i->tick(time);
    }
    

    Wenn du jetzt von außen (z.B. mit Read/WriteProcessMemory()) immer "time" überschreibst, läuft das Spiel gleich eine ganze Ecke zackiger. 😉



  • Ahoi, hier dran kannst du dich ja mal versuchen falls du Lust hast und es nicht sowieso zu einfach für dich ist:

    Hier läuft ein Karo Zeichen von links nach rechts über den Bildschirm, wenn es 10 Schritte gemacht hat dann fängt es wieder von vorne an zu laufen.

    Hier ist mein Binary zu dem Quellext von unten (Falls du es nicht selbst Kompilieren willst):
    http://www47.zippyshare.com/v/72682780/file.html

    Falls du mein Binary verwendest:
    Ein kleiner Hinweis

    004012D4  |. D80D F4124000  FMUL DWORD PTR DS:[4012F4]
    .
    .
    .
    004012F4   . 00007A44       DD FLOAT 1000.000
    
    #include <iostream>
    #include <time.h>   // Für clock
    #include <conio>   // Für gotoxy
    using namespace std;
    
    void Move(int x , int y );
    void delay(int DelayInSeconds );
    
    int main()
    {
    
    const speed = 1;
    int pos=0;
    
    while(1)
    {
            pos++;
            delay ( speed );
            clrscr();
            Move(pos,1);
    
            if ( pos == 10 )
            {
              pos = 0;
            }
    
    }
    
    system("PAUSE"); // Weiß ich selbst das dass nie ausgeführt wird, aber jetzt hab ich mein Binary schon hochgeladen :D
    }
    
    void delay( int DelayInSeconds )
    {
    
    // Referenz zu clock: http://www.cplusplus.com/reference/clibrary/ctime/clock/
    clock_t TimeToWait =  clock()+ DelayInSeconds * CLOCKS_PER_SEC ;
    
     while(clock() < TimeToWait)
     {
     }
    
    }
    
    void Move(int x, int y )
    {
    
            gotoxy(x,y);  // Setze den Cursor in der Konsole auf die Position x y 
            cout<<"\x4"; // Zeig ein Karo zeichen auf der Konsole
    }
    

Anmelden zum Antworten