- TAC (Treyarch Anti-Cheat) in Black Ops Cold War ist ein User-Mode-Anti-Cheat ohne Ricochet-Kerneltreiber, weist aber eine Code-Struktur auf, die weitgehend der aktueller Call-of-Duty-Titel ähnelt
- Die Schutzschichten kombinieren ausführbare Verschlüsselung, Checksummen, jmp-Verschleierung und Entry-Point-Verschleierung von Arxan mit Pointer-Verschlüsselung aus der Treyarch/IW-Familie
- TAC führt mehrere User-Mode-Erkennungen durch, darunter Runtime-API-Hash-Lookups, Prüfungen auf API-Hook-Muster, Debug-Register-Prüfungen, Erkennung von Windows-Testsignierung, Konsolenzuweisung sowie DirectX-/Overlay-Erkennung
- Externe Overlays erfassen Fensterstil, Position, Display Affinity und die Modulliste des Prozesses und laden diese zum Server hoch; Memory-Scanner wie Cheat Engine können über Virtual-Memory-Honeypots erkannt werden
- Die ungewöhnlichste Technik sind verschlüsselte Custom-Syscall-Stubs, die ntdll-Hooks umgehen und die Herkunft des Syscalls wie eine andere ntdll-Funktion aussehen lassen, was Monitoring erschwert
Analyseziel und Umfang
- Analysiert wird der User-Mode-Anti-Cheat innerhalb von Black Ops Cold War; die Bezeichnung lautet TAC (Treyarch Anti-Cheat)
- Black Ops Cold War enthält nicht die Kernel-Mode-Komponente von Ricochet, die in Modern Warfare 2019 und späteren Titeln vorhanden ist
- Der größte Unterschied zu aktuellen Call-of-Duty-Spielen ist der Kernel-Mode-Treiber; der Großteil des Anti-Cheat-Codes läuft im User Mode und ist TAC sehr ähnlich
- Funktions-Pseudocode wurde rekonstruiert, da die tatsächlichen Decompilation-Ergebnisse durch Verschleierungs- und Resolver-Code komplex sind
- Einige Inhalte wurden entfernt, um Werbung für Cheating oder Umgehung zu vermeiden
Arxan und Schutz der ausführbaren Datei
- Arxan ist ein Obfuskations- und Schutzwerkzeug, das seit Black Ops 3 in vielen Call-of-Duty-Spielen eingesetzt wird
- Laufzeit-Entschlüsselung der ausführbaren Datei
- Die ausführbare Spieldatei ist gepackt und verschlüsselt
- Arxan injiziert während des Startvorgangs Code, der die eigentliche ausführbare Spieldatei entpackt und entschlüsselt
- Checksummen der ausführbaren Datei
- Arxan überwacht kontinuierlich Patches an der ausführbaren Spieldatei
- Wird ein Debugger oder eine Checksummen-Abweichung erkannt, wird der Prozess beendet
- jmp-Verschleierung
- Zwischen die Instruktionen einer Funktion werden zahlreiche
jmpeingefügt, um statische Analyse zu erschweren - Wenn in große Funktionen Hunderte Sprünge eingefügt werden, bricht die IDA-Analyse und externe Werkzeuge werden nötig
- Zwischen die Instruktionen einer Funktion werden zahlreiche
- Entry-Point-Verschleierung
- Geschützter Arxan-Code entpackt den eigentlichen Entry Point und führt ihn aus
- Auch in diesem Bereich kann jmp-Verschleierung enthalten sein, was das Nachverfolgen des Kontrollflusses erschwert
Pointer-Verschlüsselung
- Wichtige Pointer werden unmittelbar vor der Verwendung verschlüsselt bzw. entschlüsselt
- Aktuelles globales Spielobjekt
- Entity-Array
- Objekt-Pointer usw.
- Für dasselbe Verschlüsselungsverfahren gibt es 16 Varianten; die aktuelle PEB-Adresse entscheidet, welche Variante verwendet wird
- Dieses Verfahren behindert Pointer-Scans von Cheat Engine
- In globalen Werten werden nur verschlüsselte Werte gespeichert
- Entschlüsselte Werte existieren nur auf dem Stack
- Um entschlüsselte Pointer zu erhalten, muss man ein Tool zum Nachverfolgen der Entschlüsselungsinstruktionen verwenden oder an einer Stelle hooken, an der das Spiel den Pointer bereits entschlüsselt hat
Runtime-API-Lookup und Hook-Erkennung
- TAC verwendet eine inline implementierte Funktion für Runtime-API-Lookups
- Sie nimmt einen Modul-Hash und einen API-Namens-Hash entgegen
- Sie durchläuft die Liste geladener Module und hasht deren Namen
- Sie durchläuft die Export-Funktionen des Moduls und vergleicht sie mit Compile-Time-Hashes
- Die Hash-Identifikation erfolgt anhand der Liste geladener Module im Spielprozess und der Hashing-Funktion des Spiels
- Hashes von Modulnamen und Export-Namen werden berechnet
- Aus dem Decompilation-Ergebnis werden base hash und function hash manuell entnommen und mit der aufgerufenen API abgeglichen
- Die Hashes sind nicht über Spielversionen hinweg identisch
- Da Funktions-Pointer in globalen Variablen gespeichert werden, lassen sie sich auch identifizieren, indem man virtuelle Adressen mit Export-Funktionen geladener DLLs vergleicht
- Die API-Hook-Erkennung von TAC prüft derzeit nur 7 Muster
- Stubs aus der
push/movabs/xchg/ret-Familie push immgefolgt vonretcalljmp [rip+x]
- Stubs aus der
- Es werden nicht alle wichtigen APIs geprüft, sondern Hooks auf die von TAC selbst verwendeten APIs
Debug-Register und Erkennung von Treiber-Testsignierung
- Debug-Register können als nicht codebasierte Patch-Hook-Methode genutzt werden, um Arxans
.text-Patch-Überwachung zu umgehen - TAC prüft im Thread-Kontext die Werte von DR0 bis DR3
- Ist ein Wert vorhanden, wird je nachdem, ob er innerhalb des aktuellen Prozesses liegt, ein Callback mit unterschiedlicher Meldung aufgerufen
- Anschließend verzweigt der Ablauf zu einer Beendigungsfunktion
- DR0 bis DR3 sind privileged registers und können daher nicht direkt mit normalem Assembler gelesen werden; sie müssen über den Windows-Kernel oder Exception-Dispatching bezogen werden
- Der Windows-Testmodus erlaubt die Ausführung von Kernel-Mode-Treibern ohne reguläre Signatur
- TAC prüft mit
NtQuerySystemInformation, ob Testsignierung aktiviert ist- Diese Erkennung allein führt nicht direkt zu einem Ban, markiert aber das Konto als flagged
Prozessbeendigung
- TAC beendet Prozesse auf zwei Arten
- Die erste Methode löscht Register und ruft anschließend
NtTerminateProcessaufRCXwird auf-1gesetzt- Wenn erkannt wird, dass
NtTerminateProcessgehookt ist, wird diese Methode nicht verwendet
- Die zweite Methode löscht Register und springt dann nach
0x0, wodurch der Prozess crasht - Beide Methoden löschen wichtige Register, was eine Wiederherstellung erschwert
Erkennung von Konsole, Visualisierung und Overlays
- Interne Cheats können
AllocConsoleverwenden, um Log-Ausgaben oder Menüs umzusetzen - TAC erkennt Konsolenzuweisungen, indem es das Konsolenfenster oder
ConsoleHandleim PEB prüft - Interne Visualisierungen werden meist über Grafik-API-Hooks auf den Bildschirm gezeichnet
- Aktuelle Call-of-Duty-Spiele verwenden DirectX 12
- Ein häufiges Hook-Ziel ist
IDXGISwapChain::Present - In DirectX 12 wird eine command queue benötigt;
ID3D12CommandQueue::ExecuteCommandListsist ein häufiger Ansatzpunkt, um sie zu bekommen
- OBS Studio, Streamlabs OBS, das Discord-Game-Overlay und das Steam-Game-Overlay können an ähnlichen Stellen arbeiten
- Steam und Discord führen Zeichenvorgänge aus
- OBS-artige Tools erfassen beim Game Capture das gerenderte Bild
- TAC scannt derzeit nicht die DXGI-present-Funktion selbst, sondern prüft den present-Pointer in der vtable
Externe Cheats und fensterbasierte Erkennung
- Externe Cheats erstellen mit hoher Wahrscheinlichkeit ein overlapped window, das über dem Spielfenster liegt
- TAC durchläuft alle Fenster und prüft mit
GetWindowLongAden Stil WS_EX_LAYERED - Danach vergleicht es mit
GetWindowRect, ob sich das Fenster mit dem Spielfenster überschneidet- Wenn die Überlappungsquote mindestens
0.5beträgt und weniger als 8 Einträge im Cache sind, wird das betreffendehwndgespeichert - Als Beispielbildschirmgröße taucht ein Wert auf, der
1920x1080entspricht
- Wenn die Überlappungsquote mindestens
- Zwischengespeicherte Fenster werden in einer separaten Funktion weiter untersucht
- Prüfung des Fenstertexts mit
GetWindowTextW - Prüfung des Klassennamens mit
GetClassNameA - Prüfung der Display Affinity mit
GetWindowDisplayAffinity
- Prüfung des Fenstertexts mit
- Auch Fälle, in denen
SetWindowDisplayAffinityundWDA_EXCLUDEFROMCAPTUREgenutzt werden, um das Fenster vor Aufnahme- und Screenshot-Tools zu verbergen, werden von TAC geprüft - Fensterbezogene Informationen werden in einem verschlüsselten Buffer gespeichert und zum Server hochgeladen
- Fenstertext
- Klassenname
- Fensterposition und -stil
- Display Affinity
- Modulliste und exe-Name des Prozesses mit dem überlappenden Fenster
- Der Prozess des überlappenden Fensters wird mit
OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION)geöffnet; Modulnamen werden mitK32EnumProcessModulesundK32GetModuleFileNameExWgesammelt
Erkennung von Memory-Scannern wie Cheat Engine
- Cheat Engine ist aufgrund des Verhaltens von virtuellem Speicher unter Windows leicht zu erkennen
- Selbst wenn ein Programm mit
VirtualAllocvirtuellen Speicher reserviert, wird dieser vor dem Zugriff nicht durch physischen Speicher backing - Das Spiel kann Speicher reservieren und anschließend ungenutzt lassen
- Wenn Cheat Engine oder der Memory-Tab von Process Hacker diesen Bereich scannt, findet ein Zugriff statt und der Speicher wird valid
- Ein Honeypot im TAC-Stil erkennt Memory-Scanner, indem er mit
K32QueryWorkingSetExprüft, ob auf diese virtuelle Adresse tatsächlich zugegriffen wurde
Erschwerung von Signature Scans
- Game-Hacker nutzen häufig signature scanning, damit Cheats auch nach Updates automatisch funktionieren
- Treyarchs Idee besteht darin, bei Funktionen, die nicht erneut aufgerufen werden, den Bereich um die return address mit PAGE_NOACCESS zu schützen
- Ein signature scanner liest die Bytes der ausführbaren Datei von Anfang bis Ende und sucht nach Mustern
- Da es sehr langsam wäre, für jedes Byte die Zugriffsberechtigung abzufragen, kann der Prozess crashen, sobald ein
PAGE_NOACCESS-Bereich erreicht wird - Diese Methode ist kein vollständiger Schutz, kann aber vielen Analysten die Arbeit erschweren
Anti-Debugging
- Die Anti-Debug-Prüfungen von TAC selbst sind einfach, Arxan stellt jedoch zusätzlich eigene Anti-Debugging-Techniken bereit
- TAC durchläuft alle Threads des aktuellen Prozesses
- Es verwendet
CreateToolhelp32Snapshotund einen thread snapshot - Im TEB jedes Threads wird
DbgSsReservedgeprüft, um das Vorhandensein eines DebugObject zu erkennen
- Es verwendet
- Es gibt auch eine Technik, bei der in ungültigen Speicher geschrieben wird, um eine access violation auszulösen
- Erreicht der Code die Stelle nach der Exception, wird angenommen, dass ein Debugger die Exception behandelt oder umgangen hat
CheckRemoteDebuggerPresentwird ebenfalls verwendetThreadHideFromDebuggersorgt dafür, dass Exceptions nicht an den Debugger, sondern an den Prozess gesendet werden- Wenn der Debugger versucht, den Prozess anzuhalten, kann eine
STATUS_BREAKPOINT-Exception auftreten und den Prozess beenden - Im User Mode kann dieses Flag nicht zurückgesetzt werden
- Diese Taktik wird in einem TLS callback vor dem Entry Point der ausführbaren Datei ausgeführt
- Wenn der Debugger versucht, den Prozess anzuhalten, kann eine
Überwachung des Netzwerkverkehrs
- TAC speichert nicht alle aktiven Verbindungen, sondern sucht nur nach bestimmten Bedingungen
- Erkannt wird die Methode, innerhalb des Spielprozesses einen lokalen Netzwerkserver zu erstellen
- Der Cheater schreibt shellcode in den Spielprozess
- Innerhalb des Spielprozesses wird ein Netzwerkserver gestartet
- Eine externe Anwendung tauscht mit diesem lokalen Server Informationen aus
- TAC holt mit
GetTcpTable2die TCP-Tabelle und erkennt die Bedingung, indem es Verbindungen des aktuellen Prozesses mit Portbeziehungen anderer Prozesse vergleicht
Verschlüsselte Custom-Syscall-Stubs
- Viele exportierte APIs von ntdll führen intern einen syscall aus
- Mit Custom-Syscall-Stubs lassen sich Hooks auf ntdll-Funktionen durch User-Mode-Cheats umgehen
- Syscalls können über instrumentation callbacks sichtbar werden
- Ein instrumentation callback wird nach einem syscall aufgerufen
- Die Rücksprungadresse liegt direkt hinter der syscall instruction
- TAC erschwert statische Analyse mit verschlüsselten Syscall-Stubs
- Der Stub wird aufgebaut, nachdem ein großer Bereich in der
.text-Sektion mit Schreib-/Ausführungsrechten geschützt wurde - In
NtReadFilewird die syscall instruction gesucht, und CPU-Zeitwerte werden als Zufallselement genutzt, um die Position zu verändern - Für Monitoring kann es so aussehen, als käme der syscall aus einer beliebigen ntdll-Funktion
- Der tatsächliche syscall muss nicht
NtReadFilesein - Wenn der syscall index in
eaxnicht geprüft werden kann, ist schwer erkennbar, um welchen syscall es sich handelt
- Der tatsächliche syscall muss nicht
- Es gibt ein Beispiel, bei dem sich die Position der syscall instruction bei erneuter Ausführung ändert
Erkennung von Umgehungen der Anti-Debugger-Verbergung
- Um
ThreadHideFromDebuggerzu setzen, mussNtSetInformationThreadaufgerufen werden - Cheater können diese API hooken und Erfolg zurückgeben lassen
- Dann glaubt der Anti-Cheat, dass das Verbergen erfolgreich gesetzt wurde, obwohl tatsächlich nichts passiert ist
- TAC prüft das Ergebnis von Aufrufen mit ungültigen Argumenten, um schlecht gemachte Hooks zu erkennen
- Ein Aufruf, der wegen eines falschen Längenarguments fehlschlagen müsste, wird erkannt, wenn er erfolgreich ist
- Es gibt Beispiele für unterschiedliche Rückgabewerte in Debugger- und ScyllaHide-Umgebungen
- Auch Hooks, die bei einer
ThreadHideFromDebugger-Anfrage mit einem Fake-Handle immer Erfolg zurückgeben, werden geprüft
Blockieren der Erstellung von Remote-Threads
- TAC installiert einen Exception-Handler, der bei einer
STATUS_PRIVILEGED_INSTRUCTION-ExceptionTerminateThreadfür den aktuellen Thread aufruft - Manuell gemappte DLLs benötigen eine Möglichkeit, shellcode in einem Remote-Prozess auszuführen; eine verbreitete Methode ist
CreateRemoteThread - TLS callbacks von Windows-PE-Dateien können beim Erstellen eines Threads vor dem Thread-Entry-Point aufgerufen werden
- TAC prüft im Kontext eines neuen Threads die Startadresse
- Mit
NtQueryInformationThreadwird die Win32 start address geholt - Die Liste geladener Module wird durchlaufen, um zu prüfen, ob die Startadresse im Bereich eines regulären Moduls liegt
- Mit
- Liegt die Startadresse in keinem Bereich eines geladenen Moduls, wird die Erkennung gespeichert und eine privileged-instruction-Exception ausgelöst, um den betreffenden Thread zu beenden
Weitere Prüfungen und Fazit
- Es gibt unbekannten Prüfcode, der kontrolliert, ob
AllocationGranularityvonNtQuerySystemInformation0x10000ist- Dies scheint virtuelle Maschinen oder angepasste Windows-Versionen zu flaggen
- TAC hängt stark von der Liste verknüpfter Module ab und prüft daher, ob
InMemoryOrderModuleListim PEB leer ist- Eine leere Liste zu erzeugen, würde wahrscheinlich den Prozess selbst beschädigen
- Insgesamt ist TAC ein User-Mode-Anti-Cheat mit folgenden Funktionen
- Runtime-API-Lookup
- Erkennung schlecht gemachter Hooks
- Erkennung externer Overlays
- Erkennung interner DirectX-Hooks
- Prüfung von Hooks auf verwendete APIs
- Prüfung auf Debugger und Debugging-Spuren
- Erkennung von
AllocConsole - Erkennung von
CreateRemoteThread - spoofed und verschlüsselte Syscall-Stubs
- Arxan unterstützt TAC mit starker Obfuskation, Erschwerung statischer Analyse, Techniken, die IDA Pro aus dem Tritt bringen, Überwachung von
.text-Änderungen und eigenen Anti-Debugging-Funktionen - TAC-ähnlicher Code wird auch in modernen Call-of-Duty-Spielen verwendet
1 Kommentare
Meinungen auf Hacker News
2021 bekam ich auf meinem Linux-CS:GO-Account Probleme mit dem Trust-Factor: Er fiel erst auf Gelb, später auf Rot. Es war keine offizielle Sperre, wirkte aber praktisch wie eine Sanktion.
In der Folge wurde ich ständig mit Cheatern gematcht, sodass es schwierig war, Mitspieler zu finden.
Später stellte ich fest, dass andere Linux-Nutzer mit Radeon-GPUs und mindestens 16 GB VRAM ähnliche Probleme hatten, und erstellte zur Nachverfolgung ein GitHub-Issue: https://github.com/ValveSoftware/csgo-osx-linux/issues/2630
Bei der Untersuchung sah es so aus, als würde Valve Linux-Nutzer mit bestimmten Hardwarekonfigurationen sanktionieren, insbesondere mit damals recht neuen Radeon-Karten mit mindestens 16 GB VRAM.
Am Ende wurde das Problem behoben, nachdem ein Nutzer gaben direkt kontaktiert hatte: https://github.com/ValveSoftware/csgo-osx-linux/issues/2630#...
Ich vermute, dass Valve im Vorfeld des Steam-Deck-Launchs stärker auf die Linux-Nutzererfahrung achtete.
Interessant ist es trotzdem.
War das eine Vermutung wegen schlechterer Match-Qualität, oder gab es eine Möglichkeit, das zu überprüfen?
Soweit ich es verstehe, ist der Trust-Factor verborgen, um Missbrauch zu verhindern.
Cheating ist am Ende ein menschliches Problem.
Mit den im Artikel beschriebenen Schutzmaßnahmen und Heuristiken kann man zwar 90 % der offensichtlichen Cheater herausfiltern, und so ein Anti-Cheat ist grundsätzlich der richtige Weg.
Anti-Cheat sollte jedoch konservativ arbeiten; letztlich müssen Spieler und Administratoren das Problem lösen.
Online-Multiplayer-Spiele müssen zwingend auf Servern laufen, die von Menschen verwaltet werden, und während der meisten Zeit, in der Spieler verbunden sind, sollte ein Administrator anwesend sein.
Wenn möglich, idealerweise ein Administrator, den die Spieler kennen; und wenn keiner da ist, sollten auch abgeschwächte Moderationsmittel wie Vote-Kick oder Vote-Ban möglich sein.
Es gibt keinen grundlegenden Unterschied zwischen dem Entfernen von Cheatern und dem Entfernen von Leuten, die den Chat missbrauchen.
Letztlich sind die einzigen praktikablen Serverformen für Online-Multiplayer-Spiele meiner Ansicht nach private Server oder Community-Server.
Der Umgang mit Cheatern und Missbrauchstätern darf nicht über ein Meldesystem erfolgen, das asynchron abgearbeitet wird; Spieladministratoren müssen schnell kicken oder bannen können.
Wenn Online-Spiel nur über Matchmaking-Server des Publishers möglich ist und der Umgang mit Cheatern oder Chat-Missbrauch nur aus Meldungen per Webformular besteht, sollte man solche Spiele nicht kaufen oder spielen, sondern mit dem Geldbeutel abstimmen.
Man könnte sogar noch eine eigene Organisation schaffen, die nur die Schiedsrichter überwacht, aber man kann auch einfach das Spiel spielen.
Apex Legends funktioniert mit einem starken Melde- und Anti-Cheat-System gut, und auch bei Rocket League arbeitet die weitgehend automatisierte Moderation effektiv.
Möglich wären etwa Telefonnummern, manuelle Verifizierung per Foto, 10 Stunden Spielzeit vor Ranked-Matches, Empfehlungen anderer Spieler oder zusätzlich zu solchen Bedingungen ein einmaliger Game Pass für 5 Dollar.
Falls du sie noch nicht gesehen hast: Ich empfehle Valves AI-Anti-Cheat-Präsentation.
Die Arbeit ist ziemlich interessant, und sie behaupten, 99 % der Cheater zu erwischen.
Natürlich gibt es weiterhin sehr subtile Cheating-Methoden.
Ich habe einen zweijährigen Rechtsstreit geführt, um eine falsche permanente Sperre von Activision rückgängig zu machen, und Activision verlor, weil sie keinerlei Beweise für Cheating vorlegen konnten: https://antiblizzard.win/2025/01/18/my-two-year-fight-agains...
Ich habe nie gecheatet, wurde ohne Erklärung gesperrt, und obwohl ich regelmäßig drei Accounts spiele, wurden die anderen beiden nicht gesperrt.
Der Kundensupport sagte immer nur: „Nach Prüfung ist die Sperre korrekt“, gab mir aber keinerlei Informationen darüber, was ich falsch gemacht haben sollte, damit ich es hätte ändern können.
Ich besitze einige der seltensten Skins im Spiel, spiele seit 2009 mit Tausenden von Stunden und spiele nur ARAM; es ergibt keinen Sinn, dass ich in einem der lockersten Modi einen Account mit großem emotionalem Wert für Cheating aufs Spiel setzen würde.
Nichts im Zusammenhang mit Spielen hat mich je mehr gestresst, und nur weil ein Bekannter aus der Branche intern nachsehen ließ, wurde die Sperre ohne Angabe von Gründen aufgehoben.
Ich spiele zwar noch, aber fast jedes Mal denke ich an diese falsche Sperre, und League wird wohl das letzte kompetitive Multiplayer-Spiel sein, in das ich Zeit investiere.
Ein Teil von mir will gar nicht mehr spielen, aus Angst, dass so etwas wieder passiert.
Auf Konsolen ist Cheating fast unmöglich, ich habe ewig gebraucht, um im Ranked gerade einmal ein durchschnittliches Gold 1 zu erreichen, und ich hatte für keinerlei Verhalten je eine Warnung oder Meldung erhalten, wurde aber ohne Erklärung dauerhaft gesperrt.
Statt wie der Autor zu kämpfen, habe ich beschlossen, nie wieder Geld für Activision-Produkte auszugeben, und ich finde, das sollten alle tun.
In den USA wäre das vermutlich schwieriger, aber im Vereinigten Königreich beziehungsweise in England muss meines Wissens der Beklagte beweisen, dass die Aussage wahr ist.
Ich bin froh, dass ich kaum Multiplayer-Shooter spiele, und es wäre wirklich übel, meine riesige Steam-Bibliothek zu verlieren.
Jump-Obfuskation macht mich sehr neugierig
Es wäre schön, wenn jemand antworten könnte, der mehr Reverse Engineering betrieben hat
Ich frage mich, ob unbedingte Sprünge so häufig sind, dass sie sich nur schwer anhand bestimmter Vorbedingungen herausfiltern lassen, und ob es möglich wäre, da das Ende einer Funktion wegen des Returns leicht zu finden scheint, den Stack zu analysieren, herauszufinden, wohin die Funktion zurückkehrt, und dann den Call direkt vor der Rücksprungadresse zu suchen
Da ich nicht viel x86-Assembler programmiert habe, könnte ich die Funktionsweise auch falsch verstanden haben
Auch mit Intels PIN-Framework lassen sich interessante Analysen durchführen
Hilfreiche Beiträge dazu gibt es hier: https://calwa.re/reversing/obfuscation/binary-deobfuscation-..., https://www.nccgroup.com/us/research-blog/a-look-at-some-rea...
Viele Funktionen enden nicht mit
retManche Sprünge sind Fake, manche Sprünge landen mitten in Instruktionen
Decompiler kommen nicht damit zurecht, wenn es an derselben Stelle zwei Instruktionen gibt
Zum Beispiel indem man bei
jmp 0x1234denjmp-Opcode überspringt und0x1234als gültige Instruktion annimmtIn manchen Branches ist der Stack kaputt, aber das kann beabsichtigt sein, um absichtlich eine Exception auszulösen
Man kann also Instruktionen wie
lea RAX, [rsp + 0x99999999999]durchnopersetzen, um die Dekompilierung zu reparieren, könnte dabei aber auch eine beabsichtigte Exception übersehenIDA kommt damit nicht gut zurecht, deshalb nutze ich eine Binary-Ninja-Lizenz, und man kann leicht Skripte schreiben, die Funktionen für den Decompiler inlinen
Meiner Ansicht nach kann IDA Code-Blöcke zwischen Sprüngen nur genau einer Funktion zuordnen und hat deshalb Schwierigkeiten, Situationen korrekt zu behandeln, in denen Sprünge Code-Blöcke gegenseitig wiederverwenden
Binary Ninja scheint weniger genutzt zu werden, weil es bei Blizzard-Spielen einen Bug gab, der aber vor etwa einem Jahr durch einen Bug-Report behoben wurde
Das ist Obfuskation, die gängige Standard-Tools, insbesondere Nutzer von IDA Pro, nerven soll
Die meiste Obfuskation zielt nur darauf ab, Leute so weit zu nerven, dass sie zu anderen Projekten wechseln
Dass einem nach dem Verkauf Produktfunktionen entzogen werden, sollte gesetzlich verhindert werden, selbst wenn es im Vertrag oder in der EULA steht
Eine Sperre darf nicht den Besitz des Spiels selbst entziehen, und wenn doch, muss erstattet werden
Wenn erst ein Urteil nötig ist, um eine Erstattung zu erzwingen, sollte es zusätzlich zu Lizenzkosten, Anwaltskosten und Gerichtskosten auch dreifachen Schadensersatz geben
Zum Beispiel sollte es rechtlich unmöglich sein, auf Steam gesperrt zu werden und dadurch alle Käufe ungültig zu machen
Selbst wenn die Kontoanmeldung blockiert wird, sollten Items und Inventar handelbar bleiben, weil zahlende Kunden dafür tatsächlich Zeit investiert haben
Wenn man in Multiplayer-Spielen Verhaltensregeln durchsetzen will, darf man entweder kein Geld für das Spiel verlangen, oder zahlende Nutzer müssen Rechte in Bezug auf Sperren haben
Sperren müssen dem Grundsatz der Verhältnismäßigkeit folgen, es muss ein Berufungsverfahren mit menschlicher Beteiligung und Aktenlage geben, dessen Kosten auf den Lizenzpreis begrenzt sind und nur bei Unterliegen anfallen
Im schlimmsten Fall bekommt das Konto bei VAC-Spielen eine öffentliche Schandmarkierung
Menschen spielen Multiplayer-Spiele, um Spaß zu haben und mit anderen zu interagieren; wenn also Cheating oder anderes Fehlverhalten andere beeinträchtigt, sollte die Nutzung des Multiplayer-Dienstes gesperrt werden
Wenn man der Gesellschaft zur Last fällt, zahlt man den Preis dafür; das ist ein ziemlich allgemeines Prinzip
Meiner Meinung nach dürfen sie auch echtes Geld verlieren
Versehentliche Sperren sind allerdings ein anderes Problem
Und gesperrt wird doch nicht das gesamte Steam-Konto, sondern das jeweilige Spiel, das man dann nicht mehr spielen kann, oder?
Die anderen Spieler haben schließlich auch bezahlt
In COD muss man eigentlich gar nicht cheaten
Es gibt so viele Bugs, dass das Spiel das für einen übernimmt
Im Ranked-Modus lädt es manchmal eine Waffe statt eines Messers; offenbar gibt es in der Prüfung der Ranked-Waffenausrüstung ein eindeutig falsches
caseoderif-else, wodurch das möglich ist, und wenn die im Ausrüstungswähler angezeigte Waffe nicht erlaubt ist, scheint standardmäßig die XM4 gewählt zu werdenEs ist fast das einzige Spiel, das ich kenne, bei dem die Ranked-Version kaputter ist als die Casual-Version
Ich frage mich, wo man so etwas lernt.
Ich würde gern mehr lernen, wenigstens genug, um die Hälfte des Artikels zu verstehen, weiß aber nicht, wo ich anfangen soll.
Das Buch ist alt, aber hervorragend, und führt einen durch verschiedene Techniken und Übungen.
Die modernen Tools haben sich seitdem etwas verändert, aber der x86-Befehlssatz und Assembly im Allgemeinen haben sich nicht grundlegend geändert.
Einer der größten Gewinne war für mich,
crackmekennenzulernen.Das sind kleine Challenge-Binaries, die zum Lernen von Reverse Engineering gemacht sind, so etwas wie Übungsschlösser in der Lockpicking-Community.
Soweit ich mich erinnere, lagen dem Buch mehrere davon auf CD-ROM bei, und online findet man ebenfalls viele.
Solche Übungen selbst zu machen, ist der Weg, es zu lernen.
Man sollte nicht gleich versuchen, COD reverse zu engineeren, sondern es Schritt für Schritt aufbauen.
Grüße an alle, die UnknownCheats, cs.rin.ru usw. gelesen haben.
Ich bin dort auch aktiv und interessiere mich besonders für Anti-Cheat im Linux-Userspace, insbesondere dafür, wie VAC funktioniert.
Ich habe ein beliebtes Horde/Alliance-basiertes MMO ein wenig reverse engineered, und es folgte fast denselben Schritten, einschließlich FNV32-Export-Hashes.
Weil ich gesehen habe, dass sehr ähnliche Tricks verwendet werden, wirkt es fast wie derselbe Ansatz.
Ich frage mich, ob es mit derselben Schutztechnik gepackt wurde.
Signature Scanning ist wirklich mächtig.
Für mich ist es auch einer der süchtig machendsten Teile des Reverse Engineering.
Es macht Spaß, eine Liste von Signaturen zu erstellen und Bindings für eine Skriptsprache zu schreiben, damit man diese Funktionszeiger aufrufen kann.
Das ist auch die Grundlage vieler Third-Party-Modding-Plattformen, weil sie Moddern sinnvolle APIs bereitstellen müssen, die der First-Party-Entwickler nicht freigelegt hat.
Soweit ich weiß, nutzen einige Source-Engine-Plugins diese Methode bei Bedarf ebenfalls.
Allerdings scheinen die meisten stattdessen Offsets von Pointern auf virtuelle Funktionstabellen zu verwenden.
Ich frage mich, ob es möglich oder sinnvoll wäre, den Spielzustand regelmäßig digital zu signieren oder irgendeinen Proof of Work einzubauen, um Cheating zu verhindern.
Mir wird allmählich klar, dass Cheating ein extrem schwer zu verhinderndes Problem ist.
Ich entwickle einen kleinen, günstigen Online-FPS und denke eher daran, die Nutzer einander vertrauen und Cheater selbst finden zu lassen, oder wie Valve AI einzusetzen, statt Anti-Cheat-Software einzubauen.
Vermutlich werde ich Spieler ihre eigenen Server verwalten und betreiben lassen.
Man könnte Bedingungen wie das Verknüpfen einer Telefonnummer, Reputationspunkte von anderen Spielern, Ausweis oder andere starke Authentifizierungsmethoden, manuelle Verifizierung per Foto wie bei Dating-Apps oder 10 Stunden Spielzeit vor Ranked-Matches einführen.
Ich denke, Hardcore-Spieler würden solche Verfahren gern durchlaufen, um die Zahl der Cheater zu verringern.
Dazu kommt sozialer Missbrauch, bei dem man Spieler meldet, die man nicht mag, um sie sperren zu lassen.
In so einem System gäbe es weit mehr False Positives als bei jedem Anti-Cheat.