Programm vor Ramcheatern schützen



  • Hallo,

    welche Möglichkeiten gibt es, ein Programm so gut wie möglich vor Veränderungen von Werten im RAM zu schützen? Es wird sicher keinen 100% Schutz geben, dessen bin ich mir bewußt, aber vielleicht könnt ihr mir ja mal ein paar Tipps geben 🙂

    Meine Ideen bisher waren, dass man nach bestimmten Programmen im Speicher sucht z.B. nach T-Search und dieses dann beendet, doch der Nachteil ist natürlich, dass das Programm dann auch nur die vorher festgelegten Programme findet und schließen kann.
    Eine weiterer Gedanke von mir wäre alle Variablen zu verschlüsseln, aber der Aufwand dafür ist viel zu hoch.

    Ihr habt sicher noch bessere Ideen, deswegen würde ich mich über eine anregende Diskussion freuen.



  • vielleicht nach jedem dritten frame zB alle Variablen verschlüsselt sichern, und dann jeden dirtten frame wieder auslesen und vergleichen, und wenn was nciht normal ist, dann richtig stellen



  • Es gibt Codierungen von Informationen, die in der Lage sind Fehler in der Sequenze zu detektieren und sogar zu korrigieren. D.h. Deine Informationen die Du schützen möchtest, müßten dann in diesem Format im Speicher abgebildet werden. Bin mir nicht sicher, aber die Codierung hieß (glaub ich) Huffmann Code und gehört in die Gruppe des zyklischen Codierungen... liegt aber schon wirklich lange zurück, also ohne Gewähr.

    Winn



  • Danke erstmal, ich werd im Netz danach mal googlen. Jedoch finde ich wie gesagt eine Verschlüsselung ziemlich aufwändig, wenn auch machbar.

    Ist es eigentlich programmtechnisch möglich, Zugriffe auf den RAM protokollieren zu können?



  • du musst doch granicht verschlüsseln, eine einfach umordnung der bytes reicht schon
    und ob das beim programmieren problematischer wird? ne nicht wirklich du musst nur ein template schreiben

    template<typename T>
    class wrapper
    {
    public:
        T decode()
        {
            //vertausche die bytes
            return value_
        }
    
        void encode(const T & new_value)
        {
            value_ = new_value;
            //tauschen
        }
    private:
        T value_;
    };
    
    int main()
    {
        wrapper<int> punkte;
        punkte.encode(42);
    
        std::cout << punkte.decode() << std::endl;
    }
    

    das tauschen macht natürlich das programm nicht schneller, aber du musst ja nicht alle variablen encoden
    und du kannst damit nur buildins wrappen



  • Was spricht dagegen anstelle encode/decode den Konstruktor und den operator T zu verwenden?
    Dann sähe das Programm so aus:

    int main()
    {
        wrapper<int> punkte = 41;
        ++punkte;
        std::cout << punkte << std::endl;
    }
    


  • Hi,

    ich würde auch so eine Art Wrapper schreiben. Allerdings solltest du pro Variable (also Wrapperinstanz) durch ein Zufallszahl noch entscheiden, wie du verschlüsselt, denn wenn du immer einfach die Reihenfolge vertauschst, erschwert es das Cheating nicht wirklich.

    Deswegen würde ich noch pro Variable zufällig wechseln zwischen: Keine Verschlüsslung, Reihenfolge umdrehen, um x Bits/Bytes rotieren, CRC32-Prüfsumme mitspeichern usw.

    ChrisM



  • cd9000 schrieb:

    Was spricht dagegen anstelle encode/decode den Konstruktor und den operator T zu verwenden?

    Lieber im Stile der SmartPtr

    Denn was machst du hier:

    wrapper<float> f(3.14);
    cout<<static_cast<int>(f)<<'\n';
    

    ?

    da ist ein

    wrapper<float> f(3.14);
    cout<<static_cast<int>(*f)<<'\n';
    

    doch irgendwie besser...

    oder zB hier:

    wrapper<string> s("hallo");
    s+=" welt";
    

    irgendwie bringt das nur probleme 😉



  • Zu letzterem:

    Gerard schrieb:

    und du kannst damit nur buildins wrappen


Anmelden zum Antworten