Home of Gamehacking - Archiv

Normale Version: Anno 1701 - Der Fluch des Drachen (GOG) Hilfe
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hi,

ich versuche mich gerade in den Semesterferien zwischen dem Lernen für Prüfungen an Anno 1701 - Der Fluch des Drachen (GOG), da es hierfür leider praktisch keine brauchbaren Trainer gibt.

Die einfachen Sachen, wie das Finden der Adressen für die Waren kriege ich auch noch ohne Probleme hin, aber dann hörts auch schon auf. Ich habe Probleme, statische Adressen zu finden und weiß auch gar nicht so recht, wie ich da ran gehen soll, eventuell einen Warehouse-cheat zu entwickeln, bei dem also alle Waren  auf allen Inseln/Kontoren des Spielers auf einen gewissen Wert gehoben und gefreezet werden. Wie findet man die entsprechenden Werte (am besten alle/mehrere auf einmal) bzw. wie funktioniert das bei euren Anno-Trainern für die späteren Serienteile? Läuft das über Code-Injection?

Bin btw kein Informatikstudent, also bitte etwas Nachsicht mit doofen Fragen ;-)
Jap, läuft bei uns eigentlich immer per Codeinjection.
Ich kann mal schauen, ob ich das Spiel noch irgendwo rum liegen hab.
Derweil kannst du dich in dem Tutorialbereich mal umschauen Wink
Also ich hab mal ein bischen rumprobiert, und bin relativ schnell wieder gegen eine Wand gelaufen.
Und zwar stürzt das Spiel sofort nach einer Code injection ab, selbst wenn ich nur den Originalcode injecte (per CE). Ich vermute deshalb irgendeinen Mechanismus, der Veränderungen im Speicher erkennt. Kann man herausfinden, wie das funktioniert und eventuell umgehen?
Ich hab das Spiel gefunden.
Wie sieht denn deine Injection aus?

Code:
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)

newmem: //this is allocated memory, you have read,write,execute access
//place your code here

originalcode:
mov [eax],edi
mov esi,[esp+24]

exit:
jmp returnhere

"Anno1701AddOn.exe"+1E3CC7:
jmp newmem
nop
returnhere:


So, hab als Quelle dafür die Holz-Adresse genommen (alle Resoucen sind einfach mal 1000 zu multiplizieren, wobei Verbrauchswaren keine glatten Werte sind, sonden zwischen tausendern schwanken). Dann 'what writes to this address' und dann einfach versucht, den Befehl über eine Code injection zu verändern. Aber schon, wenn ich nur wie oben den Originalcode injecte stürzt das Spiel sofort ab...

Nimm lieber
find out what accesses this address
Dann solltest du hier landen


Code:
mov ebx,[eax+10]

Ich gebe momentan nur Hilfestellung. Wenn dir das nicht reicht, sag ruhig bescheid Wink

Also erstmal vielen Dank für die Hilfe, ich bin (wie man wohl merkt) ein ziemlicher Anfänger was cheaten/assembler angeht.
Ich verstehe, was die einzelnen Befehle machen, aber mir fehlt so ein bischen das Gesamtbild.
Wenn ich mir den von dir vorgeschlagenen Befehl anschaue, dann wird damit der aktuelle Resourcenwert ausgelesen, der Wert der Resource müsste also in eax+10 gespeichert sein.
Nur wie mache ich jetzt weiter? Ich habe nach wie vor das Problem, dass mir das Spiel abstürzt, sobald ich versuche was zu injecten (jedenfalls wenn ich das CE template dafür nehme). Mache ich hier was offensichtliches falsch?

Edit:
ok, nvm, bin selbst drauf gekommen.
Der Code für die Code injection hat sich mit nem jmp-Befehlt in die Wolle gekriegt, der dann natürlich ins leere lief und für einen Absturz sorgte. Ein leichtes nach vorne Verlegen der injection hat das behoben.
Ok, ich hab es jetzt hingekriegt, mit

Code:
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)

newmem: //this is allocated memory, you have read,write,execute access
//place your code here

originalcode:
je Anno1701AddOn.CGameEngine::LoadLevel+8636B
mov [eax+10], 7A120
mov ebx,[eax+10]

exit:
jmp returnhere

"Anno1701AddOn.exe"+1E2416:
jmp newmem
returnhere:

alle auf einer Insel vorhandenen Resouces auf 500 zu setzen.
Das funktioniert auch sehr gut (dabei nochmal vielen Dank, dass du nicht zu viel geholfen hast, dadurch war das Erfolgserlebnis noch viel größer).
Ein paar schönheitsfehler hat das ganze aber noch. Wenn ich den Wert zu groß wähle (wie hier mit 500, bzw. immer wenn der Wert deutlich größer ist als die maximale Speichermenge auf einer Insel), dann wird beim Verladen von Waren auf ein Schiff die pro Klick zu ausgewählte Menge ignoriert und das Schiff immer ganz voll gemacht.
Ein zu kleiner Wert nervt aber auch, da das erstens doof aussieht und zweitens beim Verladen auf ein Schiff mit der unendlich-Menge-Funktion gerne mal die Resource ausgeht und man sie dann erst wieder zurückklicken muss, damit sie wieder auf der Insel vorhanden ist. Siehst du einen einfachen Weg, das zu beheben?
Ich gehe außerdem davon aus, das mit dieser Methode auch die KI-Gegner von dem Cheat profitieren, ist das schlimm?

In wie weit die KI von dem Cheat genau profitiert, weiß ich nicht.
Du könntest die Injection (folglich nur noch CI genannt) auch so schreiben, dass immer
nur das maximal mögliche deiner Lagerkapazität in die [eax+10] geschrieben wird. oder
auch 10t weniger, damit die Produktion nicht still steht.