Hallo Leute,
wie Ihr alle wisst hat der Betreiber mit der Einführung des Helm Captchas eine technische Maßnahme ergriffen um das automatische Spielen mittels Bots zu erschweren. Ich habe damals bereits erwähnt, dass der Schutz dieses Captchas gegen Null geht, da Hintergrund und Helm immer gleich sind.
Mich hat es etwa 60 Minuten Zeit gekostet in VBA ein Programm zu erstellen welches dieses Captcha mit 100% Trefferquote knacken kann. Dazu habe ich einfach den Hintergrund ohne Helm aus zwei Screenshots zusammengeschnitten. Das Skript sucht dann Pixel für Pixel nach Unterschieden zwischen dem Hintergrund (ohne Helm) und dem aktuellen Bild (mit Helm). Die Positionen der Abweichungen werden in x und y Koordinaten gespeichert und am Ende zur Mitte der Störung (hier Helm) kumuliert.
Ergebnis sind dann eine x und y Bildschirmkoordinate welche zur Lösung geklickt werden muss. Es wäre sicherlich sinnvoll dort etwas zu ändern, aber das soll nicht primäres Thema sein.
Mit geht es heute mehr um das Thema Taktik. Wie ihr alle wisst hat die richtige Taktik im Kampf einen großen Einfluss über gewinnen und verlieren. Gerade im SZ konnte man das wieder gut beobachten. Bei uns in der Legion wurden diese Informationen häufig auch an andere Legionsmitglieder weitergegeben. Viele tun sich auch schwer die Taktik richtig aus der Animation zu lesen. Aus purer Neugier habe ich also mal ein bisschen im RAM und Cache meines Firefox gestöbert welche Häufchen Artyria da so macht.
Dort bin ich sehr schnell über eine Datei mit dem Namen „fightData“ gestolpert welche sich sehr interessant anhörte. Diese Datei kann sich jeder mit einem Firefox einfach anzeigen lassen. Voraussetzung ist, dass ein Kampf gemacht wurde und die Animation aktiviert ist. Man kann die Animation überspringen. Anschließend ruft man folgenden Link auf:
about
:cache-entry?client=HTTP&sb=1&key=http://w1.artyria.de/fights/fightData (Welt 1)
about
:cache-entry?client=HTTP&sb=1&key=http://w2.artyria.de/fights/fightData (Welt 2)
Auf den ersten Blick ist da nicht viel zu erkennen. Aber oben im Head ist der Content-Type mit „gzip“ spezifiziert. Ergo komprimierte Daten. Hilft also nix, die Infos müssen entsprechen umgewandelt werden. Dazu die HEX Daten (mittlerer Block) in einen Hex Editor kopieren. Hier die Freeware Hex-Editor MX:
Die Datei speichert man dann einfach als Fightdata.zip auf der Festplatte ab. Entpacken kann man die Datei dann einfach mit einem Packer Programm wie Winzip oder 7-Zip. Das Ergebnis ist eine Datei mit folgendem Inhalt:
-----------------------------------------------------------ANFANG---------------------------------------------------------------
{"p1":{"name":"TheSaint5001","race":"Germanen","img":"http:\/\/static.artyria.de\/img\/img\/avatars\/klein\/13.jpg","hp":"974317","rank":"301","level":"37","life":27882,"shild":1,
"b1":"4","b2":"5","b3":"9"},
"p2":{"name":"XXX","race":"Perser","img":"http:\/\/static.artyria.de\/img\/img\/avatars\/klein\/6.jpg","hp":"XXX","rank":"XXX","level":"XXX","life":18967,"shild":1,
"b1":null,"b2":null,"b3":0},
"results":
[{"player":1,"action":"spellhit","p1training":null,"p2training":null,"traininghitPlus":null,"traininghitMinus":null,
"HitChance":null,"trainingHitChance":66600,"damage":1226},
{"player":2,"action":"spellhit","p1training":null,"p2training":null,"traininghitPlus":null,"traininghitMinus":null,
"HitChance":null,"trainingHitChance":66600,"damage":3845},
{"player":1,"action":"miss","p1training":null,"p2training":null,"traininghitPlus":null,"traininghitMinus":null,
"
HitChance":75,"trainingHitChance":75},
{"player":2,"action":"miss","p1training":"5","p2training":null,"traininghitPlus":null,"traininghitMinus":null,
"
HitChance":76,"trainingHitChance":0},
{"player":1,"action":"block","p1training":null,"p2training":null,"traininghitPlus":null,"traininghitMinus":null,
"HitChance":null,"trainingHitChance":null},
{"player":2,"action":"miss","p1training":"5","p2training":null,"traininghitPlus":null,"traininghitMinus":null,
"
HitChance":76,"trainingHitChance":0},
{"player":2,"action":"block","p1training":null,"p2training":null,"traininghitPlus":null,"traininghitMinus":null,
"HitChance":null,"trainingHitChance":null},
{"player":1,"action":"hit","p1training":"4","p2training":null,"traininghitPlus":0,"traininghitMinus":0,
"
HitChance":75,"
trainingHitChance":100,"
attack":"head",
"damage":3973},
{"player":2,"action":"block","p1training":null,"p2training":null,"traininghitPlus":null,"traininghitMinus":null,
"HitChance":null,"trainingHitChance":null},
{"player":1,"action":"miss","p1training":null,"p2training":null,"traininghitPlus":null,"traininghitMinus":null,
"
HitChance":75,"trainingHitChance":75},
{"player":2,"action":"block","p1training":null,"p2training":null,"traininghitPlus":null,"traininghitMinus":null,
"HitChance":null,"trainingHitChance":null},
{"player":1,"action":"hit","p1training":null,"p2training":null,"traininghitPlus":0,"traininghitMinus":0,
"
HitChance":75,"trainingHitChance":75,"
attack":"armright",
"damage":7191},
{"player":2,"action":"miss","p1training":null,"p2training":null,"traininghitPlus":null,"traininghitMinus":null,
"
HitChance":76,"trainingHitChance":76},
{"player":1,"action":"hit","p1training":null,"p2training":null,"traininghitPlus":0,"traininghitMinus":0,
"
HitChance":75,"trainingHitChance":75,"
attack":"head",
"damage":4214},
{"player":2,"action":"hit","p1training":null,"p2training":null,"traininghitPlus":0,"traininghitMinus":0,
"
HitChance":76,"trainingHitChance":76,"
attack":"armleft",
"damage":4843},
{"player":1,"action":"miss","p1training":null,"p2training":null,"traininghitPlus":null,"traininghitMinus":null,
"
HitChance":75,"trainingHitChance":75},
{"player":1,"action":"block","p1training":null,"p2training":null,"traininghitPlus":null,"traininghitMinus":null,
"HitChance":null,"trainingHitChance":null},
{"player":2,"action":"miss","p1training":"5","p2training":null,"traininghitPlus":null,"traininghitMinus":null,
"
HitChance":76,"trainingHitChance":0},
{"player":2,"action":"block","p1training":null,"p2training":null,"traininghitPlus":null,"traininghitMinus":null,
"HitChance":null,"trainingHitChance":null},
{"player":1,"action":"hit","p1training":null,"p2training":null,"traininghitPlus":0,"traininghitMinus":0,
"
HitChance":75,"trainingHitChance":75,"
attack":"armright",
"damage":5494},
{"player":1,"action":"win","p1training":null,"p2training":null,"traininghitPlus":null,"traininghitMinus":null,
"HitChance":null,"trainingHitChance":null}],"
url":"\/fights\/results\/857ed8bfbb4dfc75321b8435406aab80"}
-----------------------------------------------------------ENDE---------------------------------------------------------------
Was fällt auf:
I. Die Trainings sind offen gespeichert:
b1:4 (Gnadenloser Schlag)
b2:5 (Blitzreaktion)
b3:9 (Spirituelle Eingebung)
Werden einfach von oben nach unten über die Register gezählt. Klappt auch beim Gegner (hier keine aktiv).
II. Schlagziele sind offen im Text gespeichert:
Siehe grüne Markierungen im Text.
III. Schlagschaden jeder Attacke offen um Text gespeichert:
Der der eigene Schlagschaden bekannt ist (bei mir 4941-6869) gibt dies Rückschluss auf gepanzerte (geschützt) Körperteile des Gegners.
IV. Hitchance:
Offenbar ein Indikator für die Chance den Gegner zu treffen. Teilweise durch Training auf 100% angehoben (Gnadenloser Schlag?)
Definitiv interessant für weitere Analysen in Hinsicht auf die Werte bei beidseits bekannter Skills (Konzentration) und ggf. Level wenn es Einfluss hat.
V. Ergebnislink:
Link der im Browser nach dem Kampf geladen wird. Hier wäre es interessant zu wissen ob dieser Kampf auch auf einen anderen Account übertragbar wäre wenn dieser ihn aufruft bevor der Kämpfer die Animation beendet hat. (Nicht getestet, da wohl nicht erlaubt)
Zusammenfassung:
Was hier nach einer mühsamen händischen Analyse aussieht (und auch eine war) ist für einen PC in Millisekunden zu schaffen. Ein Rechner kann Kämpfe analysieren und die Taktik eines Gegners aus diesen Daten ermitteln. Auch wenn für eine vollständige Ermittlung ggf. mehrere Kämpfe erforderlich sind (wie sonst auch).
Angenommen der Bot kann das Captcha knacken (Beweis liefere ich hier gerne nach) und er kann die Kampfdaten analysieren so könnte man einen automatischen Bot erstellen welcher Dank des schwachen Schutzes der Daten in der Lage ist sich perfekt auf einen Gegner einzustellen.
Die letzte Taktik des Gegners könnte man noch in einer Datenbank hinterlegen so dass Angriffe an folgenden Tagen zunächst immer mit der letzten gültigen Taktik ausgeführt werden.
Ich möchte nun an dieser Stelle den Verbesserungsvorschlag einbringen diese Daten besser gegen automatische Verarbeitung zu schützen.
LG Out of Order