Vorgehensweise bei Botprogrammierung

07/16/2014 03:58 eldorax#1
Moin,
bin recht neu mit C# unterwegs und habe mir direkt als erstes größeres Projekt mal vorgenommen einen Minibot zu programmieren. Zu Anfang soll er erst einmal einen Login bei einem Spiel (League of Legends Client) automatisch ausführen können und dann ein paar Knöpfe drücken.

Ich mache mir derzeit Gedanken wie die beste Herangehensweise aussieht. Ich habe mich etwas eingelesen und festgestellt, dass tatsächlich meist ein ganzer Bildschirm gescreent wird und dieser dann Pixel für Pixel mit einem Quellbild verglichen wird um letztendlich die Position des Buttons/Feldes (oder was man auch sucht) zu bestimmen. Diese Vorgehensweise hat mich doch sehr verwundert, da das sicher recht viel Computerressourcen in Anspruch nimmt. Daher hatte ich mir überlegt, dass man doch einen "Initialpunkt" der Anwendung (also in meinem Falle der Client vom Spiel League of Legends) herausfindet und diesen Punkt intern als (0,0) festlegt. Von da aus könnte man nun vorher definieren das Usernamefeld soll hier angeklickt werden (100,100) etc.

Wäre das eine sinnige Vorgehensweise oder ist das ganze eh veraltet und sollte man bei so etwas anders vorgehen ? Falls sinnig: Wie kann man das handlen den Initialpunkt sofort erneut zu finden, wenn der Loginclient verschoben wird (also das Fenster in dem Eingaben passieren sollen). Gibt es da sowas wie EventHandler wenn ein bestimmter Prozess verschoben wird. Kann man generell irgendwie auf Eigenschaften von anderen Prozessen zugreifen (z.B. Finde zu meinem Prozess 100 (League of Legends Client) die Größe/Start Koordinate) ?

Freue mich über jeden Tip zur Herangehensweise. Bin recht perfektionistisch, nehme mir hoffentlich nicht zu viel vor.

Viele Grüße
07/16/2014 04:15 Rainvair#2
Quote:
>bin recht neu mit C# unterwegs
>größeres Projekt
>Bin recht perfektionistisch, nehme mir hoffentlich nicht zu viel vor.
Du dir selbst einen Gefallen und lern zuerst die Sprache. Du wirst auf eigentlich simple Probleme stoßen die dir mit deinem jetzigen Wissensstand unlösbar erscheinen. Es ist egal wie klein der Bot sein soll. Wenn du die Sprache nicht kannst wird es wohl auf C&P rauslaufen und dabei lernt man sehr wenig.
07/16/2014 04:21 eldorax#3
Quote:
Originally Posted by Rainvair View Post
Du dir selbst einen Gefallen und lern zuerst die Sprache. Du wirst auf eigentlich simple Probleme stoßen die dir mit deinem jetzigen Wissensstand unlösbar erscheinen. Es ist egal wie klein der Bot sein soll. Wenn du die Sprache nicht kannst wird es wohl auf C&P rauslaufen und dabei lernt man sehr wenig.
Naja es ist nicht so, dass ich garnichts kann, nur habe ich keine Erfahrung mit Bots. Grundlagen wie Datentypen, OOP, Schleifen, Bedingungen etc. behersche ich schon. RMI, JDBC (MySQL Datenbankkomunikation) kenne ich mich auch einigermaßen aus. Also ich denke, dass ich bereit für Neues bin. Und es ist nicht so, dass ich den bisherigen Teil meiner Arbeit nicht verstanden habe; Wie sollte ich sonst die gesehene Vorgehensweise in Frage stellen beziehungsweise über den richtigen Ansatz grübeln...
07/16/2014 09:46 G0dLesZ#4
Vorgehensweise für Pixel Detection

Um möglichst viel zu lernen, nenne ich keine Bibliotheken, die dir deratige Aufgaben teils vollkommen abnehmen.

1. Finde den Prozess des Ziels mittels [Only registered and activated users can see links. Click Here To Register...]
2. Erstelle C# Zeiger auf die native [Only registered and activated users can see links. Click Here To Register...] Methode
3. Nutze die [Only registered and activated users can see links. Click Here To Register...] Eigenschaft des gefundenen Prozesses und ermittle die Position des Hauptfensters

So hast Du schonmal die Position und Größe des Hauptfensters der Anwendung.
Alle weiteren Funktionen, z.B. der Bezug eines Screenshots eines definierten Bildschirm Bereichs, kannst Du dann mittels Start X/Y des Rechecks verändern.
Screenshots vom Bildschirm machst Du dann z.B. mit [Only registered and activated users can see links. Click Here To Register...].

Alles weitere ist einfache Bot Logik und wird meist in einer Endlos-Schleife entwickelt.
Diese könnte in etwa so aussehen:
Code:
// .IsRunning ensures the target application is still running and accessible
while (Bot.IsRunning) {
    // Do some bot work here

    // Don't let the process eat all of your hair
    Thread.Sleep(10);
}
Die Endlosschleife wird dann, abhängig von verwendetem UI (Console, Windows Forms, WPF), einem eigenen Thread ablaufen, wärend das UI im UI-Thread trotzdem aktualisiert wird.
07/16/2014 17:53 eldorax#5
So danke für Antwort, ich habe das soweit auch gut hinbekommen. Ich habe übrigens schon ein Bot Framework/Library entdeckt :P.

Ich würde nun gerne die Positionen der einzelnen Buttons/Felder die ich später einmal ansteuern möchte herausfinden. Dazu habe ich mir gedacht, dass ich einen EventHandler steuern möchte, der jedesmal bei einem mausclick eine Methode aufruft. Das gelingt mir noch nicht ganz, im Internet finde ich nur Möglichkeiten wie man z.B. Events abfeuert wenn er sich über ein Element des selben programms abfeuert. Ich möchte jedoch das Event jedesmal auslösen (oder jedesmal wenn ich innerhalb des Rechtecks meines Prozesses klicke).

Kurz: Wie mache ich ein Mouseevent was jedesmal bei einem Click abgefeuert wird / oder jedesmal abgefeuert wird, wenn der Click innerhalb meines Prozesses (die Fläche kenne ich ja) geschiet.

Gruß, und danke für eure Hilfe
07/16/2014 18:04 tolio#6
[Only registered and activated users can see links. Click Here To Register...]
07/16/2014 18:08 th0rex#7
Ich würde an deiner stelle einen der vielen opensource emulatoren des lol clienten nehmen. Habe bis jetzt sehr gute in c# gesehen. Müsstest dich dann in die Dokumentation reinlesen.

Für das neu finden des Fensters kannst du findwindow benutzen. Mit den c# clienten wäre das aber überflüssig.
07/16/2014 18:14 Crossside#8
Das einfachste wäre es das ganze nicht mit "Maussimulations klicks" zu lösen.
Es ist total umständlich das ganze mit irgendwelchen Pixelscans usw zu lösen, es ist nur arsch langsam. Zusätzlich wird es zu erheblichen Problemen kommen wenn verschiedene User verschiedene Bildschirm / Window größen haben, oder das Spiel an einer andern Stelle aufm Bildschirm usw..
Kurz gesagt - du reitest dich in zig Tausende Probleme rein so..
Würde es komplett anders angehen..

Wie du vorgehen solltest (imho):

1) Spiel öffnen, ins Loginfeld dein Name eingeben
2) Im Prozess nun den Name per Reversen suchen + damit finden was im Feld drinsteht
3) Pointer zu dem Prozess-Eintrag raussuchen + aufschreibe
4) In C# per Memory Writing deine gewünschte Login-Id (email / nickname) reinschreiben lassen

haste das done, machst das gleiche mit dem Password.
Anschließend einfach nur noch die Funktion raussuchen die aufgerufen wird wenn du ingame auf "Login" klickst, und aufrufen.

Done.

Kein bescheuertes Pixel rumgesuche, kein Bescheuertes Pixel-zählen um rauszufinden wo welche Eingabefelder stehen, kein nerviges ständiges Anpassen der Größenverhältnisse der Eingabefelder bei Patches des Spiels was die Eingabefelder verschiebt / neu anordet usw.
Meiner Meinung nach ist mein Vorschlag ne viel bessere Methode - setzt natürlich raus das man nicht nur Copy Paste Noob Style sich nen Bot zusammenklicken möchte um vor seinen Freunden angeben zu können und zu sagen "EY LEUTTEEE SCHAUT WAS ICH GEILES GEMACHT HABBB"..
Da kannst dann rly auch dein Pixel-Matsch-Scan nehmen für..
Nur mal eine Anmerkung - Pixel-bots sind meistens der totale Müll, Arschlangsam, Verbuggt und von Leuten erstellt die keine Ahnung vom Programmieren haben und es sich so leichter machen wollen.
Es ist aber garantiert nicht ne gute Methode um ein Bot zu proggen, glaub mir.
Definitiv der falsche Ansatz.

p.s: brauchst mir bitte keine pm schreiben, ich werde dir nicht detailierter / privat helfen.

grüße
07/16/2014 20:40 Black Tiger ツ#9
Zudem sind die Pixel witziger weise niemals auf allen Systemen gleich. Es werden immer Leute Probleme damit bekommen. Kanns mir auch nicht erklären :/
07/17/2014 02:01 eldorax#10
Danke für den Hinweiss Crossside. Genau das gleiche dachte ich mir ja eben auch, dass das nicht das wahre sein kann. Aber mit dem Rest bin ich wohl auch maßlos überfordert. Spätestens wenn es dann ingame darum geht gewisse Sachen auszuführen wie z.B. einen checkPoint einzunehmen würde ich mit der Methode wahrscheinlich auf Grenzen stoßen. Kann mir wer die 4 genannten Schritte genauer erklären?

1) Spiel öffnen, ins Loginfeld dein Name eingeben
2) Im Prozess nun den Name per Reversen suchen + damit finden was im Feld drinsteht
3) Pointer zu dem Prozess-Eintrag raussuchen + aufschreibe
4) In C# per Memory Writing deine gewünschte Login-Id (email / nickname) reinschreiben lassen

Wie gehe ich an so etwas heran ? Stichwörter womit ich mich beschäftigen kann?

Gruß
07/17/2014 02:14 Crossside#11
Quote:
Originally Posted by eldorax View Post
Wie gehe ich an so etwas heran ? Stichwörter womit ich mich beschäftigen kann?
1) Reverse Engineering
2) C#
3) C++
4) Game Hacking
5) Assembler
6) Memory Writing & Reading

Wenn du mit sowas überfordert bist, lass es (noch) bleiben.
Lern es richtig, eigne dir oben genannte Dinge an, und dann kannst immer noch ein LoL Bot o.ä proggen, davor wird es nichts anständiges.

grüße
07/17/2014 07:40 Mostey#12
Quote:
Originally Posted by Crossside View Post
Das einfachste wäre es das ganze nicht mit "Maussimulations klicks" zu lösen.
Es ist total umständlich das ganze mit irgendwelchen Pixelscans usw zu lösen, es ist nur arsch langsam. Zusätzlich wird es zu erheblichen Problemen kommen wenn verschiedene User verschiedene Bildschirm / Window größen haben, oder das Spiel an einer andern Stelle aufm Bildschirm usw..
Kurz gesagt - du reitest dich in zig Tausende Probleme rein so..
Würde es komplett anders angehen..
Ansonsten würde sich eine eigene Packet Schnittstelle auch rentieren. Hat man den Algorithmus zur Verschlüsselung (bzw. Entschlüsselung) gefunden, kann man auch sicherlich prima den Client emulieren, ohne ihn überhaupt gestartet zu haben. Ist allerdings auch viel mehr Arbeit.
07/17/2014 07:48 Crossside#13
Quote:
Originally Posted by Mostey View Post
Ansonsten würde sich eine eigene Packet Schnittstelle auch rentieren. Hat man den Algorithmus zur Verschlüsselung (bzw. Entschlüsselung) gefunden, kann man auch sicherlich prima den Client emulieren, ohne ihn überhaupt gestartet zu haben. Ist allerdings auch viel mehr Arbeit.

Glaube das dürfte definitiv zu overkill für ihn sein, vorallem weil er keine Erfahrung im Reversen + Assembler hat.. da dürfte das schwer bis fast unmöglich sein mit seinem jetzigen Kenntnisstand^^

Sauberer & genialer ist deine Methode, muss ich zustimmen.
Clientless Paketbot ist halt um einiges Patch resistenter + besser (sofern mans richtig macht).