Packets senden

10/05/2013 18:29 Doktor.#1
Hey, ich hab eben versucht mir ein Programm zu schreiben das Daten an ein Game Server(NosTale) sendet, so dass ich mich z.B. im Game bewege.

Code:
#include "stdafx.h"

int startWinsock(void);


int main()
{
  long rc;
  SOCKET s;
  SOCKADDR_IN addr;
  char buf[256];
  
  rc=startWinsock();
  if(rc!=0)
  {
    printf("Fehler\n");
    return 1;
  }
  else
  {
    printf("Winsock gestartet!\n");
  }

  // Socket erstellen
  s=socket(AF_INET,SOCK_STREAM,0);
  if(s==INVALID_SOCKET)
  {
    printf("Fehler: Der Socket konnte nicht erstellt werden");
    return 1;
  }
  else
  {
    printf("Socket erstellt!\n");
  }

  // Verbinden
  memset(&addr,0,sizeof(SOCKADDR_IN));
  addr.sin_family=AF_INET;
  addr.sin_port=htons(4030);
  addr.sin_addr.s_addr=inet_addr("79.110.84.87");

  rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
  if(rc==SOCKET_ERROR)
  {
    printf("Fehler beim connecten..");
    return 1;
  }
  else
  {
    printf("Verbunden mit 79.110.84.87..\n");
  }


  // Daten austauschen
  while(rc!=SOCKET_ERROR)
  {
    printf("\nPacket: ");
    gets(buf);
    send(s,buf,strlen(buf),0);
    rc=recv(s,buf,256,0);
    if(rc==0)
    {
      printf("Server hat die Verbindung getrennt..\n");
      break;
    }
    if(rc==SOCKET_ERROR)
    {
      printf("Fehler: recv");
      break;
    }
  }

  closesocket(s);
  WSACleanup();
  return 0;
}

int startWinsock(void)
{
  WSADATA wsa;
  return WSAStartup(MAKEWORD(2,0),&wsa);
}
Irgendwie funktioniert dies nicht so recht, wenn ich das Packet absende passiert in Game nichts und die Verbindung zum Server stürzt im Programm ab.

Bin noch kein Ober Pro darin, eher dabei es zu üben. Wäre es möglich das es über einer dll wahrscheinlicher wäre das es funktioniert oder muss man dabei ganz anders vorgehen damit die Packets angenommen werden?

Wäre über ein paar hilfreiche Antworten erfreut. :)
10/05/2013 18:37 qkuh#2
1. Hat das Spiel keine Verschlüsselung?
2. Du solltest einen Proxy als man-in-the-middle coden. Ansonsten wird das ohne weiteres nichts mit packets an den Server senden und eine Reaktion bekommen, die im Client sichtbar wird.
10/05/2013 22:20 [uLow]NTX?!#3
Darf ich fragen, was du machen möchtest? Clientless Bot?

Kannst du jeze schon vergessen, da du ja ein tut dafür brauchtest.

[Only registered and activated users can see links. Click Here To Register...]

@qkuh die server sollten eig antworten, nur eben mit bullshit. so wie die metin2 server
10/06/2013 01:00 Doktor.#4
Quote:
Originally Posted by NTX?! View Post
Darf ich fragen, was du machen möchtest? Clientless Bot?

Kannst du jeze schon vergessen, da du ja ein tut dafür brauchtest.

[Only registered and activated users can see links. Click Here To Register...]

@qkuh die server sollten eig antworten, nur eben mit bullshit. so wie die metin2 server
Ne wollte einfache Packets senden um zu gehen, hab mich noch nie damit beschäftigt daher war dies auch nur ein Versuch.

Quote:
Originally Posted by NTX?! View Post
Kannst du jeze schon vergessen, da du ja ein tut dafür brauchtest.
Und wer sagt das man sowas nur ohne Tut's schafft? O.o
Jeder fängt mit Büchern und/oder Tutorials an und schafft es irgendwann sowas hinzubekommen.
10/06/2013 01:11 snow#5
Quote:
Originally Posted by NTX?! View Post
Kannst du jeze schon vergessen, da du ja ein tut dafür brauchtest.
Als ich angefangen habe, HGWC zu emulieren, habe ich mich noch nie mit Sockets befasst. Nach 1-2 Tutorials in der Art stand die Kommunikation, so what?

@TE: Die NosTale Packets werden nach einer speziellen Struktur aufgebaut sein, damit der Server und der Client erkennen können, dass das tatsächlich Daten sind und wie sie verarbeitet werden müssen. Wenn das Packet nicht korrekt ist, wirst du deine Probleme mit dem Server bekommen. Je nachdem disconnectet der dann dich & damit deinen Client.
Um den Charakter zu bewegen, wirst du über die Verbindung des Spiels Daten senden müssen, ansonsten fehlen ja die gesamten Zusatzinformationen (Daten des Spielers, welcher Spieler ist überhaupt gemeint etc.). Ich glaube, Adroxxx hat mal ein Tutorial zum Sniffen und Verschicken von Packets geschrieben, evtl. ist das ja was für dich. :)
10/06/2013 07:52 Doktor.#6
Meinst bestimmt des: [Only registered and activated users can see links. Click Here To Register...]

Danke dir :)
10/07/2013 02:30 Cambios#7
Es ist schwachsinnig dich zum Server zu verbinden, und dem einfach irgendwas zuzusenden. Du hast dich mit deinem Programm ja nicht einmal eingeloggt oder verifiziert. Du bist mit deinem Client ständig mit einer Socket verbindung mit dem Server verbunden. Und der Server benutzt ein spezielles Protokoll, und vllt eine Verschlüsslung für die Kommunikation mit dem Client.
Dort musst du dich zwischen Schalten mit ner Man in the Middle (Hooking der Winsock Api).
Wenn du dich jetzt aber mit winsock einfach mit dem server connectest, und ihm zeug zuschickst.. da hast du keine verbindung zu deinem client. Was du tun müsstest wäre die Winsock Send Funktion zu Hooken in deinem Client, nicht ein eigenständiges Programm schreiben und dich dann damit verbinden. Du hookst die Winsock Funktionen von deinem Client,und kannst damit dann deine Pakete senden. Wenn du das richtig machst, klappt dann auch das bewegen ingame etc..
Aber dein Ansatz den du bisher hast, das funktioniert so nicht.

p.s: Die Verbindung die abbricht zum Server, das liegt daran weil dich der Server kickt weil du eben nicht das entsprechende Kommunikations Protokoll benutzt für die Kommunikation. Sobald du dem Server was sendest was nicht dem Protokoll entspricht wirst du gekickt.
10/07/2013 09:19 MrSm!th#8
^Das Protokoll wird er auch nicht automatisch durch einen Winsock Hook erhalten. Das muss er schon selbst nachbauen oder auf einer höheren Ebene eine Art MovePlayer Funktion des Clients aufrufen.
10/07/2013 18:30 Cambios#9
Quote:
Originally Posted by MrSm!th View Post
^Das Protokoll wird er auch nicht automatisch durch einen Winsock Hook erhalten. Das muss er schon selbst nachbauen oder auf einer höheren Ebene eine Art MovePlayer Funktion des Clients aufrufen.
Das sollte klar sein denke ich^^
Mir ging es nur darum das er nur so Pakete senden kann vom Client zum Server.
Ansonsten müsste er ja das komplette Protokoll reversen und komplett in sein Programm einbauen, sich zum Server connecten, sich authentifizieren usw.. und ich glaub das führt dann zu weit.
Das Protokoll ansich muss er dann halt selbst reversen, z.b wie er sich bewegt etc. - das ist dann aber unabhängig von seinem Programm, und muss er halt mit Paket Sniffing und Reversing rausfinden.

Aber ich denke wirklich wenn er eine Art Bot programmieren möchte.. wärs einfacher für ihn wenn er den Client hooked und die einzelnen Funktionen aufruft. Ich weiß nicht wie es in Nostale ist, aber da gibts sicher auch spezielle Funktionen für das Bewegen des Charakters etc. die er hooken kann, und womit er dann arbeiten könnte.. auch ohne Pakete manuell zu senden. Bei WoW würde man ja z.b ClickToMove gut nutzen können zum Bewegen der Figur, wie das dann bei Nostale ist.. keine Ahnung - muss er mal selbst Reversen.