Sie sind auf Seite 1von 4

Bot Coding - Series C# 1#

Bot Theorie:

Was genau ist eigentlich ein Bot?

Einfach beschrieben ist ein Bot, eine Programmierter Spieler der das tut was ein echter Spieler auch tun wrde um Level zu steigen.

Welche arten gibt es in dem fall "Silkroad Online"


Packet Bot: Der Bot sendet befehle zB Monster Ankreifen via Packets/Buffer an den Server Pixel Bot: Der Bot sucht nach bestimmten Pixel die er dann anklickt. Jedoch nicht fr 3D Games geeignet. Clientless: Das selbe wie der Packet Bot nur das der eigentliche Game Client nicht bentigt wird. Der Unterschied also das der ClientlessBot nochmehr zu tun hat.

Welche art werden wir programmieren.


Wir werden einen Packetbot schreiben. Da dieser sehr gut ausgebaut werden kann und auch spter zum Clientless aufgebaut werden kann.

Pseudo Code eines Bottes: Monsterliste list = new Monsterliste(); Funktion OnMonsterSpawn() : list-->Add Funktion GreifeAn() : list-->Zufall()-->Attack();
An hand dieses Pseudo Codes knnen wir erkennen das der Bot auf das Monster Spawn Packet wartet. Und darrauf hin das Monster in eine Liste einfgt. Danach wird ein zuflliges Monster attackiert.

Proxy
Was ist eine Proxy in unserem fall, und wozu bentigen wir sie?
In unserem Fall ist die Proxy ein zwischen Server. Der Client sendet an die Proxy (Zwischenserver) ein Packet. Darrauf reagiert die Proxy und sendet diese an den echten Silkroad Server weiter. Wen der Silkroad Server antwortet dann schickt die Proxy die Antwort weiter an den echten Clienten. Wir bentigen dies um die Packet zu Sniffen und damit unsere Bot zB mit griegt wen zB ein Monster Spawnt...

Der C# Code der Proxy Class


Den Code werde ich nur anhand einer Zeichnung erklren da ich einfach mal davon ausgehe das ihr bereits C# Kenntnisse besitzt:
class ProxyServer { private delegate void ClientSend(byte[] b); private delegate void ServerSend(byte[] b); public event ClientSend OnClientSend; public event ServerSend OnServerSend; Socket virtuelClient; Socket proxyServer; Socket realClient; string SilkroadIP; int SilkroadPort; byte[] clientBuffer = new byte[1024]; byte[] serverBuffer = new byte[1024]; public void Start(int myport, string sroIP, int sroPort) { proxyServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); virtuelClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); SilkroadIP = sroIP; SilkroadPort = sroPort; // Run Proxy Server proxyServer.Bind(new IPEndPoint(IPAddress.Any, myport)); proxyServer.Listen(5); // Wait for Client proxyServer.BeginAccept(new AsyncCallback(OnClientConnect), null); } private void OnClientConnect(IAsyncResult asyn)

{ realClient = proxyServer.EndAccept(asyn); virtuelClient.Connect(SilkroadIP, SilkroadPort); virtuelClient.BeginReceive(serverBuffer, 0, 1024, SocketFlags.None, new AsyncCallback(OnBufferByServer), null); realClient.BeginReceive(clientBuffer, 0, 1024, SocketFlags.None, new AsyncCallback(OnBufferRecv), null); } private void OnBufferRecv(IAsyncResult asyn) { int recv = realClient.EndReceive(asyn); byte[] removed = GetBytes(recv, clientBuffer); OnClientSend(removed); virtuelClient.Send(removed); realClient.BeginReceive(clientBuffer, 0, 1024, SocketFlags.None, new AsyncCallback(OnBufferRecv), null); } private void OnBufferByServer(IAsyncResult asyn) { int recv = virtuelClient.EndReceive(asyn); byte[] removed = GetBytes(recv, serverBuffer); OnServerSend(removed); realClient.Send(removed); virtuelClient.BeginReceive(serverBuffer, 0, 1024, SocketFlags.None, new AsyncCallback(OnBufferByServer), null); } private byte[] GetBytes(int count, byte[] b) { MemoryStream ms = new MemoryStream(b); BinaryReader br = new BinaryReader(ms); return br.ReadBytes(count); } }

Hier nun die Vesprochene Zeichnung:

Ich Hoffe diese Zeichnung hilft euch beim verstehen des Codes. Bei fragen, fragt. So das wars dann erstmal fr den ersten Teil der Reihe. Nchstes mal gehts dann ans Sniffen . :-)