Wysyłanie pakietów (winsock)

0

Witam, przeszukałem multum stron internetowych lecz nigdzie nie znalazłem odpowiedzi na nurtujące mnie pytanie. Do rzeczy!
Za pomocą programu Winsock Packet Editor (WPE) jestem w stanie wysłać określony pakiet wybierając z listy client gry.
Takim pakietem może być np. wiadomość.

Jestem w tym temacie zielony, więc bardzo prosiłbym o najbardziej szczegółowe informację i najlepiej przykład. Wyczytałem, że można zrobić to na "socketach" funkcją SendMessage. Bardzo prosiłbym o pomoc (najlepiej w oparciu o Borland c++).

Odczytany pakiet przez WPE wygląda następująco:
WPE_PAKIET

Zaś okno wysyłania tak:
WPE_OKNOSEND

Mam coś takiego:

HWND hClient = FindWindow(NULL, "Nazwa okna" );

char Packet[34] = {0x00, 0x22, 0x00, 0x43, 0x63, 0x20, 0x03, 0x00, 0x00, 0x69,
                   0x00, 0x33, 0x00, 0x73, 0x64, 0x61, 0x64, 0x6F, 0x6D, 0x6F,
                   0x73, 0x61, 0x64, 0x00, 0x00, 0x00, 0x00, 0x77, 0x69, 0x61,
                   0x64, 0x6F, 0x6D, 0x6F, 0x73, 0x63, 0x00};

SendMessage(hClient, Packet[34], NULL, NULL);

I tu pytanie - jak to napisać? Jak się połączyć, jak to przesłać?

0

Co tak właściwie chcesz zrobić i po co? Z Twojego opisu niewiele wynika.

0

Nie znam API windowsa zbyt dobrze, ale SendMessage to na pewno nie część interfejsu socketowego. Winsock ma API niemal identyczne do tego linuxowego (patrz mój link wcześniej) z wyjątkiem dodatkowego wywołania WSAStartup - jeśli dobrze pamiętam nazwę funkcji. Najlepsze co możesz zrobić to przeczytać BJ's Guide to Network Programming. Są tam zawarte wszystkie odpowiedzi na Twoje pytania bez zbędnego bullshitu.

EDIT
Z tego co widzę to Ty w swoim kodzie próbujesz wysłać payload do lokalnego programu a nie na serwer. Nie wiem po co Ci ten pośrednik.

0
Patryk27 napisał(a):

Co tak właściwie chcesz zrobić i po co? Z Twojego opisu niewiele wynika.

Pakiety mógłbym wysyłać poprzez WPE, lecz tam nie ma możliwości ustawienia wysyłania po wciśnięciu hotkeya (tylko wysyła cyklicznie co x sekund).
Chodzi o to, że program ułatwiłby mi przesyłanie ich tylko wtedy, gdy nacisnę określoną kombinację klawiszy.

Po co? Jest mi to przydatne do rozgrywki - to nie są żadne spamy itp ;-) Bardzo prosiłbym o przykład kodu (najlepiej do borlanda c++).

Mam mętlik w głowie i nie wiem jak połączyć się i to przesłać.

EDIT:
Tak jak pisałem - jestem zielony. Chciałbym ten pakiet wysłać do clienta gry.

0

Panie, a o jakie pakiety chodzi, jaki protokół, która warstwa? I do kogo chcesz je wysyłać? Co chcesz osiągnąć?

0
nalik napisał(a):

Panie, a o jakie pakiety chodzi, jaki protokół, która warstwa? I do kogo chcesz je wysyłać? Co chcesz osiągnąć?

Nie wiem jak to dokładnie wytłumaczyć. Wydaje mi się, że to pakiety wysyłane do procesu klienta.
W programie WPE wybieram "target process" z listy uruchomionych programów. Następnie klikam "przechwyć" i po wysłaniu wiadomości otrzymuję taki wynik jaki opisałem w pierwszym poście.

Jeżeli łączyłoby się to z serwerem to podejrzewam, że TCP.

0

Ale co chcesz osiągnąć? Zobaczyć komunikację? To może odpal wiresharka po prostu.

0
nalik napisał(a):

Ale co chcesz osiągnąć? Zobaczyć komunikację? To może odpal wiresharka po prostu.

Chcę wysyłać dany pakiet z poziomu własnego programu na dany socket (w tym przypadku 692).

Może ten kawałek kodu coś podpowie - chodzi o istotę rzeczy:

char Packet[34] = {0x00, 0x1C, 0x00, 0x43, 0x63, 0x20, 0x03, 0x00, 0x00, 0x73,
                   0x00, 0x39, 0x00, 0x73, 0x64, 0x61, 0x64, 0x73, 0x61, 0x64,
                   0x73, 0x61, 0x64, 0x00, 0x00, 0x00, 0x00, 0x61, 0x62, 0x63,
                   0x00};

int socket = 692;

ClientSocket1->Active = TRUE;

ClientSocket1->Host = "x.x.x.x";
ClientSocket1->Port = 1234;

ClientSocket1->Socket->Connect(socket);

if (ClientSocket1->Socket->Connected == TRUE) {
    Connect->Caption = "CONNECTED! SOCKET: " + IntToStr(socket);
    ClientSocket1->Socket->SendText(Packet[34]);
    ClientSocket1->Socket->Disconnect(socket);
}

TYLKO CHCĘ WYSŁAĆ TO PRZEZ CLIENT GRY, NIE BEZPOŚREDNIO!

0

A klient tej gry obsługuje jakąś formę Inter Process Communication? Jeśli tak to pewnie jest gdzieś opisane API. A jeśli nie to zakres problemu wybiega daleko poza winsocka. I tak w ogóle co Ci to miałoby dać? Jeśli protokół się zgadza to serwer nie będzie w stanie zdeterminować od kogo tak naprawdę dostał pakiet.

0

Musiałbyś się podpiąć pod proces. Nie jestem specem od windowsa, ale stwierdzam, że słabo googlałeś: http://stackoverflow.com/questions/23620434/using-an-existent-tcp-connection-to-send-packets
Inna możliwość to wstrzyknięcie bezpośrednio do sieci (stosu sieciowego systemu) pakietu IP, który w payloadzie ma sfabrykowany nagłówek i dane z warstwy 4 (sam pakiet plus port z warstwy 4 maja udawać flow stworzony przez twój proces gry). Jest to o tyle trudniejsze, że musisz wstrzelić się w odpowiedni sequence number, znać aktualny rozmiar okna odbioru (chyba, nie wiem jak się zachowa serwer jak podasz rozmiar, którego zupełnie się nie spodziewał, congestion control może zwariować), znać MSS dla tego połączenia, policzyć sumę kontrolną dla segmentu tcp.

0
several napisał(a):

A klient tej gry obsługuje jakąś formę Inter Process Communication? Jeśli tak to pewnie jest gdzieś opisane API. A jeśli nie to zakres problemu wybiega daleko poza winsocka. I tak w ogóle co Ci to miałoby dać? Jeśli protokół się zgadza to serwer nie będzie w stanie zdeterminować od kogo tak naprawdę dostał pakiet.

Skoro program Winsock Packet Editor (WPE) jest w stanie nawiązać połączenie i wysyłać pakiety to raczej jest to możliwe z użyciem winsock. Jeszcze raz napiszę krok po kroku:

  1. Otwieram WPE i wybieram PROCES KLIENTA GRY
  2. Klikam "start logging" po czym przechodzę do okna gry i wpisuję "wiadomość"
  3. Klikam "stop logging" i otrzymuję pakiet widoczny w pierwszym poście.

W tym programie mogę ustawić cykliczne wysyłanie go (np co sekundę) lecz nie ma możliwości ustawienia wysyłania dopiero po wciśnięciu odpowiedniej kombinacji klawiszy.

0

Nie chce mi się googlować jak działa WPE, ale idę o zakład że wybieranie procesu jest tylko dla wygody użytkownika. WPE po procesie determinuje z jakim portem jest on powiązany by posnifować co przychodzi na ten port. I tyle. Żadnego wysyłania odbierania z użyciem samego procesu tutaj nie ma.

W jaki niby sposób WPE będący narzędzie do użytku ogólnego miałoby znać IPC API akurat Twojej gry? WPE snifuje pakiet z portu i wysyła je dalej, nic więcej, coś jak lokalne TCP proxy. Powtarzasz w kółko to samo i liczysz, że dostaniesz inną odpowiedź. EOT z mojej strony, szkoda czasu. W moim pierwszym poscie napisałem wszystko co jest Ci potrzebne by rozeznać się w winsock.

0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>

int main(int argc, char **argv)
{

	WORD RequiredVersion;
	WSADATA WData;
	SOCKET s;
	struct sockaddr_in addr;
	long val;
	struct hostent *he;
	char host[128];;
	int port;

	char packet[3] = {0x00, 0x1C, 0x00};

	printf("Nazwa hosta: ");
	scanf("%s",host);
	printf("Numer portu: ");
	scanf("%d",&port);
	printf("Liczba do wyslania: ");
	scanf("%d",&val);

	RequiredVersion = MAKEWORD(2, 0);

	if (WSAStartup(RequiredVersion, &WData) != 0) {
		printf("Blad inicjalizacji WinSock2\n");
		return 1;
	}

	he = gethostbyname(host);
	
	if (he == NULL) {
		printf("Nie znaleziono hosta.\n");
		system("PAUSE");
		return 1;
	}

	addr.sin_family = AF_INET;
	addr.sin_port = htons(port);
	addr.sin_addr.s_addr = *((unsigned long*) he->h_addr);

	s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	connect(s, (struct sockaddr*) &addr, sizeof(addr));
	printf("Wysylam %d do %s\n",val,inet_ntoa(addr.sin_addr));

	val = htonl(val);
	send(s, (char*) &val, sizeof(long), 0);
	printf("Czekam na odpowiedz...\n");

	recv(s, (char*) &val, sizeof(long), 0);
	val = ntohl(val);
	printf("Odpowiedz: %d\n", val);
	closesocket(s);

	WSACleanup();

	system("PAUSE");
	return 0;

	
}

Mam coś takiego. W jaki sposób mogę przerobić to aby zamiast liczby przesyłało mój pakiet (char) na określony socket (692)?

EDIT:
Chodzi mi o połączenie się do otwartego socketu o ID 632. Utworzenie nowego nie wchodzi w grę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1