Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Program wysyłający pakiety do servera gry


Rekomendowane odpowiedzi

Opublikowano

Witam

Czy wie ktoś jak napisać taki program który potrafi wysłać pakiet o treści say123 na server 91.145.32.77.

Przeszukałem wiele tematów i nie znalazłem czegoś takiego, a jest mi bardzo potrzebne.

Weteran
Opublikowano

Jeśli to nie musi być koniecznie program, spróbuj wysyłać ten pakiet telnetem.

A jeśli koniecznie musisz to napisać, podaj chociaż o jaką bibliotekę czy język ci chodzi oraz dodam że, nie można od tak po prostu wysłać pakietu na serwer, trzeba jeszcze podać port.

Opublikowano

Port to 5202, musi to być program najlepiej w c++, biblioteka obojętnie jaka (ważne żeby działało) .

Wie ktoś jak się za to zabrać?

Opublikowano

Czy ja wiem, na twoim miejscu zrobiłbym to w Delphi z komponentami Indy, przykład:

procedure TForm1.Button1Click(Sender: TObject);
begin
 IdUDPClient1.Host := '91.145.32.77';
 IdUDPClient1.Port := 5202;
 IdUDPClient1.Send('say123');
end;

Musisz też wiedzieć czy komunikacja ma się odbywać protokołem UDP czy TCP.

Twoja stara robi catch the clowny w Game Makerze.

Weteran
Opublikowano

Łap, chyba będzie działać:

 

#include <iostream>
#include <winsock2.h>

using namespace std;

u_long resolveHost( const string &host )
{
LPHOSTENT hostEntry = gethostbyname(host.c_str());

if ( !hostEntry )
{
unsigned int addr = inet_addr( host.c_str() );
hostEntry = gethostbyaddr((char *)&addr, 4, AF_INET);

if ( !hostEntry )
{
return 0;
}
}

return *((int*)*hostEntry->h_addr_list);
}


int main(int argc, char* argv[])
{
WSADATA wsaData;
SOCKADDR_IN saddr;
SOCKET sock;
WSAStartup( MAKEWORD(2,2), &wsaData );

sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

saddr.sin_addr.S_un.S_addr = resolveHost ("91.145.32.77");
saddr.sin_family = AF_INET;
saddr.sin_port = htons(5202);

char *text = "say123";
send(sock,text,6,0);
closesocket(sock);
WSACleanup();
return 0;
}

Opublikowano

Łap, chyba będzie działać:

 

#include <iostream>
#include <winsock2.h>

using namespace std;

u_long resolveHost( const string &host )
{
LPHOSTENT hostEntry = gethostbyname(host.c_str());

if ( !hostEntry )
{
unsigned int addr = inet_addr( host.c_str() );
hostEntry = gethostbyaddr((char *)&addr, 4, AF_INET);

if ( !hostEntry )
{
return 0;
}
}

return *((int*)*hostEntry->h_addr_list);
}


int main(int argc, char* argv[])
{
WSADATA wsaData;
SOCKADDR_IN saddr;
SOCKET sock;
WSAStartup( MAKEWORD(2,2), &wsaData );

sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

saddr.sin_addr.S_un.S_addr = resolveHost ("91.145.32.77");
saddr.sin_family = AF_INET;
saddr.sin_port = htons(5202);

char *text = "say123";
send(sock,text,6,0);
closesocket(sock);
WSACleanup();
return 0;
}

 

 

 

Nie chce mi skompilować.

Mam błąd w linijce z tym kodem: char *text = "say123";

Dev c++ pokazuje takie błędy:

C:\Documents and Settings\admin\Moje dokumenty\BezNazwy1.cpp In function 'int main(int, char**)':

 

38 14 C:\Documents and Settings\admin\Moje dokumenty\BezNazwy1.cpp [Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]

 

[Linker error] C:\DOCUME~1\admin\USTAWI~1\Temp\cctVhT3k.o:BezNazwy1.cpp:(.text+0x15): undefined reference to `gethostbyname@4'

 

[Linker error] C:\DOCUME~1\admin\USTAWI~1\Temp\cctVhT3k.o:BezNazwy1.cpp:(.text+0x34): undefined reference to `inet_addr@4'

 

[Linker error] C:\DOCUME~1\admin\USTAWI~1\Temp\cctVhT3k.o:BezNazwy1.cpp:(.text+0x55): undefined reference to `gethostbyaddr@12'

 

[Linker error] C:\DOCUME~1\admin\USTAWI~1\Temp\cctVhT3k.o:BezNazwy1.cpp:(.text+0xa4): undefined reference to `WSAStartup@8'

 

[Linker error] C:\DOCUME~1\admin\USTAWI~1\Temp\cctVhT3k.o:BezNazwy1.cpp:(.text+0x162): undefined reference to `closesocket@4'

 

[Linker error] C:\DOCUME~1\admin\USTAWI~1\Temp\cctVhT3k.o:BezNazwy1.cpp:(.text+0x16a): undefined reference to `WSACleanup@0'

 

Da się z tym coś zrobić?

Opublikowano

Żeby zbytnio nie gadać bez sensu dam Ci kod pod C#.

Możesz sobie go łatwo przerobić pod C++/CLI (głównie zamienić "." na "->") lol.

 

 

 


TcpClient bot = new TcpClient();
NetworkStream stream;
StreamReader streamr;
StreamWriter streamw;


bot.Connect(Current_IP, default_port);
Stream stream = bot.GetStream();
streamr = new StreamReader(stream);
streamw = new StreamWriter(stream);


       public void bot_send(string packet)
       {
               streamw.WriteLine(packet);
               streamw.Flush();
       }

 

 

 

 

I wysyłanie pakietów:

bot_send("PNG");

 

Piszę pewnego bota i u mnie to działa.

 

P.S. Możesz zainteresować się również Socketami.

Wystarczy wpisać TCPClient Examples / Sockets examples.

________________________________________________________________________________

 

Sekhmet

________________________________________________________________________________

Weteran
Opublikowano

@Up

Ale mu chodzi o prawdziwe, męskie C++! A nie o jakieś "c++/cli" czy "ci sharp". Pff...

 

@Topic

Zapomniałem dodać że należy dolinkować dodatkowego liba - ws2.

Opublikowano

Po dodaniu #pragma comment(lib, "ws2_32.lib") i dodaniu do parametrów projektu libws2_32.a błędy "linker error" znikły ale został jeszcze błąd w tym kodzie char *text = "say123"; po dopisaniu przed char const program skompilował się bez błędów, ale gdy wejde do jego procesu programem WPE PRO to wyświetla że żadne pakiety nie zostały wysłane, w grze też nie ma żadnego efektu. Wie ktoś może czemu pakiety nie zostają wysłane? Ostateczny kod program:

 

#include <iostream>

#include <winsock2.h>

 

#pragma comment(lib, "ws2_32.lib")

using namespace std;

 

u_long resolveHost( const string &host )

{

LPHOSTENT hostEntry = gethostbyname(host.c_str());

 

if ( !hostEntry )

{

unsigned int addr = inet_addr( host.c_str() );

hostEntry = gethostbyaddr((char *)&addr, 4, AF_INET);

 

if ( !hostEntry )

{

return 0;

}

}

 

return *((int*)*hostEntry->h_addr_list);

}

 

 

int main(int argc, char* argv[])

{

WSADATA wsaData;

SOCKADDR_IN saddr;

SOCKET sock;

WSAStartup( MAKEWORD(2,2), &wsaData );

 

sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

 

saddr.sin_addr.S_un.S_addr = resolveHost ("91.195.80.98");

saddr.sin_family = AF_INET;

saddr.sin_port = htons(5202);

 

const char *text = "say123";

send(sock,text,6,0);

closesocket(sock);

WSACleanup();

return 0;

}

Opublikowano

Program się nie łączy z serwerem :E

 

if (connect(sock, (SOCKADDR*)&saddr, sizeof(saddr)) == SOCKET_ERROR)
{
   printf("Nie polaczyl :< (%d)", WSAGetLastError());
   WSACleanup();
   return 0;
}

 

dodaj powyższy kod przed funkcję send.

YOU MUST DIE

- Ganon, Koridai

Opublikowano

Po dodaniu tych paru linijek co napisał mirraseq i dodaniu biblioteki <cstdio> program elegancko wysyła pakieta, sniffera też pokazuje ze pakiety są wysyłane, ale serwer chyba je odrzuca ponieważ po pierwsze wysłanie pakietu nie daje zamierzonego efektu w grze, po drugie jak wejdę do procesu tego napisanego programu i próbuje wysłać pakiet "ręcznie" to kończy się to błędem. Myślę że serwer odbiera tylko pakiety od procesu tej gry.

 

Żeby hax działał to muszę pisać go jako dll?

Jeśli tak to wie moze ktoś jak się zabrać do pisania dll które by wysyłało pakiet lub coś zrobić żeby ten program który już został napisany działał tak żeby gra reagowała na jego pakiety?

Kod tego programu:

 

#include <iostream>

#include <winsock2.h>

#include <cstdio>

 

#pragma comment(lib, "ws2_32.lib")

using namespace std;

 

u_long resolveHost( const string &host )

{

LPHOSTENT hostEntry = gethostbyname(host.c_str());

 

if ( !hostEntry )

{

unsigned int addr = inet_addr( host.c_str() );

hostEntry = gethostbyaddr((char *)&addr, 4, AF_INET);

 

if ( !hostEntry )

{

return 0;

}

}

 

return *((int*)*hostEntry->h_addr_list);

}

 

 

int main(int argc, char* argv[])

{

WSADATA wsaData;

SOCKADDR_IN saddr;

SOCKET sock;

WSAStartup( MAKEWORD(2,2), &wsaData );

 

sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

 

saddr.sin_addr.S_un.S_addr = resolveHost ("91.195.80.98");

saddr.sin_family = AF_INET;

saddr.sin_port = htons(5202);

 

const char *text = "say123";

if (connect(sock, (SOCKADDR*)&saddr, sizeof(saddr)) == SOCKET_ERROR)

{

printf("Nie polaczyl :< (%d)", WSAGetLastError());

WSACleanup();

return 0;

}

send(sock,text,6,0);

closesocket(sock);

WSACleanup();

return 0;

}

Weteran
Opublikowano

@Up

Serwer nie reaguję gdyż gra wysyła pakiety innym socketem, a ten program innym.

Nie jestem pewien czy zrobienie drugiego wątku tej gry przez plik .dll coś da, ale jak chcesz, to możesz spróbować.

Opublikowano

Nic nie da ;)

Zrób sobie przekierowanie z funkcji send czy sendto w aplikacji na funkcje w swojej dll'ce - pobieraj w nim socket i wyślij pakiet oryginalną funkcją. Potem po prostu wysyłaj pakiet przez ten socket.

Twoja stara robi catch the clowny w Game Makerze.

Opublikowano

Nic nie da ;)

Zrób sobie przekierowanie z funkcji send czy sendto w aplikacji na funkcje w swojej dll'ce - pobieraj w nim socket i wyślij pakiet oryginalną funkcją. Potem po prostu wysyłaj pakiet przez ten socket.

 

Ale jak zrobić takie przekierunkowanie?

 

Jak ktos zna jakis prostrzy sposob níz ten co podal Wobniar to tez niech pisze.

Opublikowano

Cóż, możesz ewentualnie odnaleźć wskaźnik socketa w aplikacji i go w ten sposób pobierać ale takie rozwiązanie jest niewygodne i nieuniwersalne.

YOU MUST DIE

- Ganon, Koridai

Opublikowano

Cóż, możesz ewentualnie odnaleźć wskaźnik socketa w aplikacji i go w ten sposób pobierać ale takie rozwiązanie jest niewygodne i nieuniwersalne.

 

A wiesz jak zrobić coś takiego? Bo ja raczej nie. Myślałem, o tym żeby spróbować znaleść w pamięci adres w którym jest jest przechowywane te socked id i zrobić żeby cheat je odczytywał, ale przy każdym uruchomieniu gry adresy się zmieniają więc to pewnie nic nie da. Ma ktoś jakiś pomysł? A może wie ktoś jak zrobić te przekierunkowanie, o którym pisał woBniaR?

Opublikowano

No trochę się musisz na tym znać, bo bez tego to ani rusz.

W IDA albo podobnym programie (w Cheat Engine jak by nie było też się da - przydatne gdy plik gry jest zabezpieczony, nie trzeba się męczyć z rozpakowywaniem) musisz otworzyć aplikację gry, wejść w importy i wyszukać sendto. Jak znajdzie to klikasz na tym 2 razy lewym myszki i przeniesie cie do kodu, tam będzie coś takiego:

.idata:00C67C44 ; int __stdcall sendto(SOCKET s,const char *buf,int len,int flags,const struct sockaddr *to,int tolen)
.idata:00C67C44				 extrn __imp_sendto:dword ; DATA XREF: sendto^r

 

Klikasz 2x na sendto które jest na końcu 2 linii, przeniesie cie to do kodu:

.text:004BC124 ; int __stdcall sendto(SOCKET s,const char *buf,int len,int flags,const struct sockaddr *to,int tolen)
.text:004BC124 sendto		  proc near			   ; CODE XREF: sub_4BCA50+129p
.text:004BC124				 jmp	 ds:__imp_sendto ; Send data to a specific destination
.text:004BC124 sendto		  endp

 

004BC124 to adres skoku do funkcji sendto, zapisz go sobie.

 

W c++ robisz coś typu:

SOCKET* s2 = NULL;

int __stdcall mysendto(SOCKET s,const char *buf,int len,int flags,const struct sockaddr *to,int tolen)
{
 s2 = s;
 sendto(s,buf,len,flags,to,tolen);
}

s2 będzie wskaźnikiem do socketu, a funkcja mysendto będzie go ustawiać i wysyłać pakiet.

Nie wiem czy 'to' i 'tolen' (i może też 'flags') też trzeba pobrać, bo nigdy nie próbowałem nic potem wysyłać.

 

Teraz skopiuj sobie te 2 funkcje u góry stąd: http://celestialcodi...hp?topic=1520.0

 


void CopyBuffer(BYTE *Buffer, int Size, DWORD *Address)  
{  
  DWORD pPrevious = 0;  
  VirtualProtect(Address, Size, PAGE_EXECUTE_READWRITE, &pPrevious);  
  memcpy(Address, Buffer, Size);  
  VirtualProtect(Address, Size, pPrevious, &pPrevious);  
}  

void SetupHook(DWORD Function, DWORD Hook, int Size)  
{  
  Hook = Hook - Function - 5;  
  BYTE bHook[4];  
  memcpy(bHook,(void*)&Hook,4);  
  BYTE Buffer[10];  
  memset(Buffer,0x90,10);  
  Buffer[0] = 0xE9;  
  Buffer[1] = bHook[0];  
  Buffer[2] = bHook[1];  
  Buffer[3] = bHook[2];  
  Buffer[4] = bHook[3];  
  CopyBuffer(Buffer, Size, (DWORD*)Function);  
}  

 

Potem przy starcie bilbioteki dll ustawiaj przekierowanie z tego oryginalnego sendto na mysendto, prototyp:


SOCKET* s2 = NULL;
struct sockaddr* to2 = NULL;
int tolen2 = 0;
int flags2 = 0;

int __stdcall mysendto(SOCKET s,const char *buf,int len,int flags,const struct sockaddr *to,int tolen)
{
  s2 = s;
  to2 = to;
  tolen2 = tolen;
  flags2 = flags;
  sendto(s,buf,len,flags,to,tolen);
}

void CopyBuffer(BYTE *Buffer, int Size, DWORD *Address)  
{  
  DWORD pPrevious = 0;  
  VirtualProtect(Address, Size, PAGE_EXECUTE_READWRITE, &pPrevious);  
  memcpy(Address, Buffer, Size);  
  VirtualProtect(Address, Size, pPrevious, &pPrevious);  
}  

void SetupHook(DWORD Function, DWORD Hook, int Size)  
{  
  Hook = Hook - Function - 5;  
  BYTE bHook[4];  
  memcpy(bHook,(void*)&Hook,4);  
  BYTE Buffer[10];  
  memset(Buffer,0x90,10);  
  Buffer[0] = 0xE9;  
  Buffer[1] = bHook[0];  
  Buffer[2] = bHook[1];  
  Buffer[3] = bHook[2];  
  Buffer[4] = bHook[3];  
  CopyBuffer(Buffer, Size, (DWORD*)Function);  
}  

void START()
{

  // 0x004BC124 - ten adres który znalazłeś w IDA
  SetupHook(0x004BC124,(DWORD)mysendto,6)

}

BOOL WINAPI DllMain ( HMODULE hDll, DWORD dwReason, LPVOID lpReserved )
{
  DisableThreadLibraryCalls(hDll);

  if ( dwReason == DLL_PROCESS_ATTACH )
  CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)START, NULL, NULL, NULL);

  return TRUE;
}

 

No i mniej więcej tak to powinno działać. Potem wysyłasz:

 

char buffer [] = "say123";
sendto(s2,buffer,sizeof(buffer),flags2,to2,tolen2);

 

Pewnie jak wyśle to ipb zrobi ten kod jeszcze bardziej nieczytelny niż jest, ale może troche zrozumiesz ;)

 

Aha no i nie zapomnij dodać do projektu winsocks2.h i ws2_32.lib.

Twoja stara robi catch the clowny w Game Makerze.

Opublikowano

No trochę się musisz na tym znać, bo bez tego to ani rusz.

W IDA albo podobnym programie (w Cheat Engine jak by nie było też się da - przydatne gdy plik gry jest zabezpieczony, nie trzeba się męczyć z rozpakowywaniem) musisz otworzyć aplikację gry, wejść w importy i wyszukać sendto. Jak znajdzie to klikasz na tym 2 razy lewym myszki i przeniesie cie do kodu, tam będzie coś takiego:

.idata:00C67C44 ; int __stdcall sendto(SOCKET s,const char *buf,int len,int flags,const struct sockaddr *to,int tolen)
.idata:00C67C44				 extrn __imp_sendto:dword ; DATA XREF: sendto^r

 

Klikasz 2x na sendto które jest na końcu 2 linii, przeniesie cie to do kodu:

.text:004BC124 ; int __stdcall sendto(SOCKET s,const char *buf,int len,int flags,const struct sockaddr *to,int tolen)
.text:004BC124 sendto		  proc near			   ; CODE XREF: sub_4BCA50+129p
.text:004BC124				 jmp	 ds:__imp_sendto ; Send data to a specific destination
.text:004BC124 sendto		  endp

 

004BC124 to adres skoku do funkcji sendto, zapisz go sobie.

 

W c++ robisz coś typu:

SOCKET* s2 = NULL;

int __stdcall mysendto(SOCKET s,const char *buf,int len,int flags,const struct sockaddr *to,int tolen)
{
 s2 = s;
 sendto(s,buf,len,flags,to,tolen);
}

s2 będzie wskaźnikiem do socketu, a funkcja mysendto będzie go ustawiać i wysyłać pakiet.

Nie wiem czy 'to' i 'tolen' (i może też 'flags') też trzeba pobrać, bo nigdy nie próbowałem nic potem wysyłać.

 

Teraz skopiuj sobie te 2 funkcje u góry stąd: http://celestialcodi...hp?topic=1520.0

 


void CopyBuffer(BYTE *Buffer, int Size, DWORD *Address)  
{  
  DWORD pPrevious = 0;  
  VirtualProtect(Address, Size, PAGE_EXECUTE_READWRITE, &pPrevious);  
  memcpy(Address, Buffer, Size);  
  VirtualProtect(Address, Size, pPrevious, &pPrevious);  
}  

void SetupHook(DWORD Function, DWORD Hook, int Size)  
{  
  Hook = Hook - Function - 5;  
  BYTE bHook[4];  
  memcpy(bHook,(void*)&Hook,4);  
  BYTE Buffer[10];  
  memset(Buffer,0x90,10);  
  Buffer[0] = 0xE9;  
  Buffer[1] = bHook[0];  
  Buffer[2] = bHook[1];  
  Buffer[3] = bHook[2];  
  Buffer[4] = bHook[3];  
  CopyBuffer(Buffer, Size, (DWORD*)Function);  
}  

 

Potem przy starcie bilbioteki dll ustawiaj przekierowanie z tego oryginalnego sendto na mysendto, prototyp:


SOCKET* s2 = NULL;
struct sockaddr* to2 = NULL;
int tolen2 = 0;
int flags2 = 0;

int __stdcall mysendto(SOCKET s,const char *buf,int len,int flags,const struct sockaddr *to,int tolen)
{
  s2 = s;
  to2 = to;
  tolen2 = tolen;
  flags2 = flags;
  sendto(s,buf,len,flags,to,tolen);
}

void CopyBuffer(BYTE *Buffer, int Size, DWORD *Address)  
{  
  DWORD pPrevious = 0;  
  VirtualProtect(Address, Size, PAGE_EXECUTE_READWRITE, &pPrevious);  
  memcpy(Address, Buffer, Size);  
  VirtualProtect(Address, Size, pPrevious, &pPrevious);  
}  

void SetupHook(DWORD Function, DWORD Hook, int Size)  
{  
  Hook = Hook - Function - 5;  
  BYTE bHook[4];  
  memcpy(bHook,(void*)&Hook,4);  
  BYTE Buffer[10];  
  memset(Buffer,0x90,10);  
  Buffer[0] = 0xE9;  
  Buffer[1] = bHook[0];  
  Buffer[2] = bHook[1];  
  Buffer[3] = bHook[2];  
  Buffer[4] = bHook[3];  
  CopyBuffer(Buffer, Size, (DWORD*)Function);  
}  

void START()
{

  // 0x004BC124 - ten adres który znalazłeś w IDA
  SetupHook(0x004BC124,(DWORD)mysendto,6)

}

BOOL WINAPI DllMain ( HMODULE hDll, DWORD dwReason, LPVOID lpReserved )
{
  DisableThreadLibraryCalls(hDll);

  if ( dwReason == DLL_PROCESS_ATTACH )
  CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)START, NULL, NULL, NULL);

  return TRUE;
}

 

No i mniej więcej tak to powinno działać. Potem wysyłasz:

 

char buffer [] = "say123";
sendto(s2,buffer,sizeof(buffer),flags2,to2,tolen2);

 

Pewnie jak wyśle to ipb zrobi ten kod jeszcze bardziej nieczytelny niż jest, ale może troche zrozumiesz ;)

 

Aha no i nie zapomnij dodać do projektu winsocks2.h i ws2_32.lib.

 

Jest jeden problem. Te 00C67C44 to jest z tego co wiem adres w pamięci.

Wszystkie adresy w pamięci w tej grze się zmieniają po jej ponownym uruchomieniu, jest tak chyba we wszystkich grach Flash, więc tej programik co napisałeś chyba nie zadziała :/

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...