Wie programmiere ich einen Bot

07/12/2006 22:15 DrunkenSheep#16
naja ich würde damit anfangen erstmal die offsets der positionen zu finden.
Aber da die nich angezeigt werden, kannst du schlecht normal nach den Offsets suchen :(
-> [Only registered and activated users can see links. Click Here To Register...]

leider auch kein Plan wie man an die Offsets kommt.

Sobald ich das rausbekommen hab, fang ich auch mal mit nem einfachen Pathway-"Bot" an, der einfach mal die wege abläuft :)
07/12/2006 23:19 NEOGEO#17
Sowas in der Art wäre auch ein guter Ansatz für mich zum anfangen, erstaml ein kleines Programm schreiben und erstmal die ganzen Probleme der hardwarenahen Programmierung in den Griff bekommen.. meine Programme ich bis jetzt so Programmiert habe, sahen meisten eher nach dem schema aus lese irgendwelche werte aus der Eingabeaufforderung, berechne sie und geben sie wieder aus.. und das gleiche nochhmal in graphisch mit java ;)
07/12/2006 23:22 Ultima#18
also ein auf pixel basierter bot funktioniert offensichtlich nicht wenn das spiel minimiert ist und keine pixel zu sehen sind

also die infos zu deinem char sind im normal fall alle auf dem server gespeichert

und hier kommt dann das mit dem dynamischen speicher hinzu weil dein client braucht um etwas anzeigen zu können ja die informationen

1. entweder hat der client also für alle daten statisch speicher angelegt und schreibt die informationen wenn er sie vom client bekommt dort hin

2. er legt am anfang an einer dynamischen adresse die daten ab ansich das gleiche wie oben

3. er speichert fast nix und verarbeitet die informationen direkt nach dem empfang und verwirft anschließend alles da hier nix oder fast nix gespeichert wird kann man im speicher nichts finden man kann es aber abfangen und selber speichern und so doch an die daten kommen


Um an die daten zu kommen kannst du am einfachsten tsearch nehmen dich irgendwo hin stellen und dann neue suche starten dann dich bewegen und wert verändert machen usw... bis hoffentlich nurnoch ein wert übrig bleibt alternativen an programmen gibts genug z.B. cheat engine wenn du keinen wert findest kann es gut sein das methode 3 verwendet wird

edit: aus dem speicher lesen is ganz einfach da benutzt du windows api ReadMemory und WriteMemory sind deine freunde einfach bei google eingeben und dazu MSDN
07/12/2006 23:39 NEOGEO#19
danke Ultima, sehr aussagekräftiger thread :)
aber was mache ich wenn bei dem betreffenden Spiel Fall 3 der Fall ist, was ich befürchte, wie kann man die Daten abfangen?
07/13/2006 00:21 Ultima#20
Quote:
Originally posted by NEOGEO@Jul 12 2006, 23:39
danke Ultima, sehr aussagekräftiger thread :)
aber was mache ich wenn bei dem betreffenden Spiel Fall 3 der Fall ist, was ich befürchte, wie kann man die Daten abfangen?
das funktioniert so das du erstmal die stelle im programm code finden musst an der die daten die du haben willst verarbeitet werden
und dann patched du das einfach ein wenig das die daten erstmal an eine feste speicher adresse geschrieben werden und dann verarbeitet werden

dazu muss ich wohl erwähnen das du bei fall 3 ohne assembler grundkenntnisse nicht weiter kommst
07/13/2006 04:37 Harko#21
Quote:
Originally posted by Ultima@Jul 12 2006, 19:50
man kann nicht generell davon ausgehen das adressen statisch sind es gibt aber techniken sie statisch zu machen
Es gibt immer eine statische Basis Adresse, ob der eigentliche Wert den man haben will in einen dynamischen Bereich liegt den man nur über 10 Pointern erreicht ist dabei egal.

edit:
ok gibt 2 Ausnahmen, man kann die Adresse als Argument übergeben dadurch befindet sie sich nur auf dem Stack und die andere man speichert sie über den FS Pointer. Erstere wird man aber nie vorfinden und zweitere kann man auch einfach lösen.
07/13/2006 10:21 NEOGEO#22
@ Ultima wie wahrscheinlich ist es denn so das ein die Daten dirket verarbeitet, ohne sie nochmals in einer Variable zwischen zu speichern?
Ich hab ma ne Grundsätzliche Frage, wenn man dem compiler das verwalten der Speicherbereiche überlässt sind die doch dynamisch, und die ändern sich doch dann bei jedem Programmstart? WEnn ich jetzt einmal einen Spielstand oder sowas (hab ich net vor und würde auch bei einem Onlinespiel nicht funktionieren..) editieren will dann müsste ich doch bei jedem bei jedem Neustart die gesamte Prozedur mit tSearch wieder durchführen, oder seh ich das falsch?
07/13/2006 19:42 Ultima#23
Quote:
Originally posted by NEOGEO@Jul 13 2006, 10:21
@ Ultima wie wahrscheinlich ist es denn so das ein die Daten dirket verarbeitet, ohne sie nochmals in einer Variable zwischen zu speichern?
Ich hab ma ne Grundsätzliche Frage, wenn man dem compiler das verwalten der Speicherbereiche überlässt sind die doch dynamisch, und die ändern sich doch dann bei jedem Programmstart? WEnn ich jetzt einmal einen Spielstand oder sowas (hab ich net vor und würde auch bei einem Onlinespiel nicht funktionieren..) editieren will dann müsste ich doch bei jedem bei jedem Neustart die gesamte Prozedur mit tSearch wieder durchführen, oder seh ich das falsch?
das kann man so generell nicht sagen

wenn ein programm ziehmlich linear abläuft und speicher immer in der gleichen reihenfolge angefordert wird bekommen die selben adressen

wenns aber durcheinander ist dann nicht

es gibt aber techniken die es einem ermöglichen an diese dynamischen adressen heran zu kommen

dazu sucht man sich im programm eine stelle an der mit dem wert gearbeitet wird (das programm kennt ja die adresse) und dort klaust du sie dir einfach oder du kopierst den wert an eine feste speicheradresse das geht z.B. mit tsearch oder einem debugger

als schlagwort ist hier "DMA to Static" zu nennen für tutorial suche
07/14/2006 08:42 neji#24
[Only registered and activated users can see links. Click Here To Register...]
07/14/2006 09:39 Lowfyr#25
davon gabs auch nochn dma stealing (die dma2static codecave variante) video tutorial
07/14/2006 13:33 Harko#26
Quote:
Originally posted by neji@Jul 14 2006, 08:42
[Only registered and activated users can see links. Click Here To Register...]
Tutorial ist nutzlos ...

fld dword ptr [ebx+0x354]

im debugger rückwärts tracen und einfach schauen wie der Wert in ebx generiert wird und dies dann passiv im Bot genauso machen.

fld packt ein float wert auf den floating point stack. Z.b. x/y/z Koordinaten. In einer eigenen Hookfunktion müßte man dann immer noch mit einbauen um welches Objekt es sich handelt da ebx bei unterschiedlichen Objekten wie Spieler/Monster usw. ein anderen Wert hätte.

Wie gesagt es gibt immer eine statische Basis Adresse. Spiele benutzen Multi-Threading. Damit z.B. der Socket-Thread und der Render-Thread auf das gleiche Objekt zugreifen können muß es irgendwo einen statischen Verweis auf dieses Objekt geben.
07/15/2006 23:41 NEOGEO#27
@Harko, ich vestehe den Sinn von deinem Thread nicht ganz
Quote:
Tutorial ist nutzlos ...

fld dword ptr [ebx+0x354]

im debugger rückwärts tracen und einfach schauen wie der Wert in ebx generiert wird und dies dann passiv im Bot genauso machen.

fld packt ein float wert auf den floating point stack. Z.b. x/y/z Koordinaten. In einer eigenen Hookfunktion müßte man dann immer noch mit einbauen um welches Objekt es sich handelt da ebx bei unterschiedlichen Objekten wie Spieler/Monster usw. ein anderen Wert hätte.
Kann man aus einen Spiel systemnachrichten abfangen die im Chatfester erscheinen, sowie auch Chatnachrichten von anderen Gamern?
02/02/2010 11:13 eumel122#28
lol 4 jahre alten thread rausgekramt
glückwunsch dazu -.-