Jak zrobić trainer (z ewentualną iniekcją dll) w Delphi?

0

witam :P od dawno się zastanawiałem nad napisaniem małego toola do gry ;p lecz nie wiem jak się do tego zabrać i tutaj mam kilka pytań ;P

  1. znam adresy z gry np. adres poziomu i teraz w jaki sposób mogę wysłać jakieś dane do tego adresu tak aby z 10 poziomu zrobił się 40, czyli wysłać do adresu dany tekst lub numer...?
  2. podobnie do up tylko że z przyciskami ;p one zapewne też mają swoje adresy czy dam rade z poziomu delphi klikać sobie te przyciski ?:D proszę o odpowiedzi i prosiłbym jak by ktoś miał jakiś tutotrial do tego co napisałem czyli wysyłanie danych do adresów z góry dziękuję.
0

ad 1: Po kilku sekundach szukania w google:
Wstęp do programowania z użyciem gniazd
Rozdział 11

Daleko nie trzeba szukać...

0

to wszystko to o aplikacjach sieciowych a mi chodzi o zwykłą grę która nie łączy się z netem :D

0
  1. znam adresy z gry np. adres poziomu i teraz w jaki sposób mogę wysłać jakieś dane do tego adresu tak aby z 10 poziomu zrobił się 40, czyli wysłać do adresu dany tekst lub numer...?

Co to znaczy wysłać do adresu? W ogóle to o jaki adres Ci chodzi? Adres w pamięci masz? Poza tym jeżeli chcesz zrobić narzędzie do tibii albo podobnej to Ci się nie uda, bo informacje takie jak Level i podobne są nie u Ciebie na dyksu, a na sarwerze do którego raczej dostępu nie będziesz miał nigdy; Jeżeli zaś te informacje są w pamięci na Twoim komputerze, wystarczy znać podstawowe funkcje do czytania i zapisywania danych w pamięci;

  1. podobnie do up tylko że z przyciskami ;p one zapewne też mają swoje adresy czy dam rade z poziomu delphi klikać sobie te przyciski ?

Tobie widzę wszystko się już kojarzy z poziomami... Wszystko ma swój adres w pamięci, ale do klikania na jakieś buttony raczej przydało by się zrobić symulacje poruszania mychą; Jeżeli przyciski są ciągle w tym samym miejscu łatwo odczytać współrzędne takiego przycisku; Później to tylko kwestia oprogramowania myszki tak, by klikała w daną współrzędną o określonej częstotliwości;

Poza tym: Korzystanie w grach z botów, modów, cheatów i innego gówna jest nieuczciwe względem innych graczy i łamie podstawowe zasady regulaminu gry; Zastanów się nad tym;

0

no nie chce pisać żadnego bota do Tibii !... gra jest na kompie i nie wczytuje danych z bazy danych... znam adres np. Nazwy Gracza i chcę tam wstrzyknąć swoje dane za pomocą delphi... :D

0

Nie znam się na delphi, ale jestem pewien, że chodzi Ci o funkcje w stylu MemoryWrite / MemoryRead

Odnośnie klikania na przyciski - nie, nie da rady zrobić tego tym co napisałem tobie wyżej

Da się przywołać funkcje z gry, ale jest to bardzo wysoka szkoła jazdy (przede wszystkim debugging, OllyDbg jest do tego najbardziej zaawansowanym programem. Dla laików został stworzony Cheatengine, ale nie wiem, czy tego na nim dokonasz. Musiał byś znać adres funkcji, jej parametry, ich typ... jeżeli nie masz pojęcia o "inżynierii wstecznej" aka Reverse Engineering, to się za to nie bierz i ogranicz do manipulacji pamięcią).

Przykład zaawansowanego bota korzystającego w owy sposób
http://www.assembla.com/code/d2bs/subversion/nodes

Edit: (tu mowa o C++) Za pomocą SendMessage nie zedytujesz pamięci, nawet wysyłanie klawiszy, np. by otworzyć ekwipunek nie zadziała bo nie jest to traktowane jako fizyczne wciśnięcie klawisza (co niektóre gry weryfikują), do tego trzeba użyć SendInput

Edit2: Bawiłem się tym kiedyś trochę, i nie czuję się przez to bardziej doświadczonym programistą. Napisanie prostego bota to wbrew pozorom nie jest coś wybitnego

0

nie wiem nie rozumiem tego... wiem jak wyswietlic dane z adresu na labelu, ale jak tam coś wstrzyknąć to nie wiem ...

0

Oczywiście, że da się zrobić to co chcesz w Delphi. Nazywa się to Trainer. I w googlach jest mnóstwo przykładów, rownież w Delphi, które można bardzo łatwo znaleźć, a które pokazują jak napisać trainer - jeżeli znamy konkretny adres. Można posłużyć się rownież programem "Cheat Engine" i dodatkowo metodą wyszukiwania Pointerów (wskaźników na adresy danych złota, energii, żyć czy czego tam chcesz w pamięci), która jest pokazana również na kilku filmikach do znalezienia na YT (polecam te zagraniczne, bo Polacy jak robią jakiś video tutorial to często na poziomie gówniarzerii ze jakiś tam spryciarzy.pl). Także minus ode mnie za totalne lenistwo i brak chęci poszukania tego w googlach samodzielnie. Na pocieszenie dorzucam exek (uwaga do użytkownika o inicjałach t.r - w rarze jest exek, mały, ale wiem że ci mama nie pozwala pobierać takich, więc nie rób tego) wraz ze źródlem w Delphi - wszystko pisane w WinAPI. Później jak napiszę, bo wcześniej nie miałem pojęcia o tym, że można tak wyszukiwać i zmieniać pointery robiąc trainer na zasadzie injekcji dllki do procesu z grą to też tutaj wrzucę. Wracając do mojego trainera. Jest on do starej dosowej gry Horde, ktorą można pobrać z: http://staregry.pl/?c=_gv&i=751 i należy ją uruchamiać pod emulatorem DosBox najpewniej na standardowej konfiguracji aby się nie ciął dźwięk i animacja. Sam DosBox do pobrania oczywiście z: http://www.dosbox.com a cały trainer działa banalnie, wyszukuje w pamięci procesu unikalnego ciągu bajtów, który można ustalić przez baczne przyglądanie się zawartości zdumpowanej do pliku pamięci i wyszukiwaniu charakterystycznych ciągów hexów w pobliżu adresów gdzie znajdują się wartości złota oraz energii dla konkretnej gry, a co pomaga ustalic właśnie Cheat Engine. Później do tego znalezionego adresu dodaje określoną stałymi ilość bajtów do przesunięcia, dzięki czemu zawsze trafi w przypadku gry Horde na właściwe dane. I jakby był problem z samą grą, to znaczy "cieła się" pod DosBoxem, to dołaczam też swój config. Należy sobie utworzyć katalog Horde, w nim katalog GAME i tam rozpakować grę, następnie w katalogu Horde utworzyć katalog DosBox, wrzucić tam najnowszego DosBoxa, bez pliku dosbox.conf jeżeli mamy go w katalogu, następnie wrzucić ten mój plik a.conf, do tego w Horde jakiś plik *.bat na przykład run.bat, do którego możesz zrobić skrót (jak coś ikonkę do skrótu możesz wziąć sobie z mojego trainera w pliku app_icon.ico). Wygląd przykładowego run.bat:

@echo off
cd DOSBOX
start dosbox.exe -conf a.conf
cd ..

Jeszcze słowo o trainerze, jak widać jest to zwykłe Read i Write ProcessMemory tylko, że trainej zrobiony w WinAPI aby exek do tak prostego zadania nie zajmował setki kb. Exek jest upxnięty, a okno dialogowe do zasobów przygotowałem w: http://www.oby.ro/rad_asm/resed/index.html i kod korzysta ze zoptymalizowanych modułów System oraz Windows do pobrania z http://kolmck.net/sys/SysDcu7.zip (tylko dla Delphi 7). A i poza tym jeżeli zadajesz takie bzdurne pytania jak "wysyłanie message do adresu w pamięci" to podejrzewam, że nie będziesz chciał się z ów kodu nic nauczyć, dlatego polecam Tobie raczej dowiedzieć się, że komunikaty śle się do okien, a nie do adresów pamięci, a dla Ciebie najprościej będzie zobaczyć w filmikach na YouTube jak używać Cheat Engine i najlepiej metodą z Pointerami i pod nim oszukiwać. Sorry za rozpiskę, a trainera miałem nie publikować, ale może komuś się przyda. Procka do wyszukiwania w pamięci działa w miarę szybko, bo operuje na pamięci, a konkretnie na jej fragmencie, nie zaś na jakimś dużym pliku na dysku. Oczywiśćie jej kod po przeróbkach znalazłem kiedyś na google i zaadoptowałem. Może komuś jeszcze poza pytającym się przyda ten kod trainera oraz konfiguracja DosBoxa dla tej konkretnie gry.

EDIT: a teraz widzę, że dopisałeś coś o wstrzykiwaniu, to zastanów się, czy chcesz robić Trainer z użyciem Read/Write ProcessMemory praz ewentualnym wyszukiwanem podobnych bajtów w celu ustalenia zmiennego adresu dla danych, czy chcesz wstrzykiwać dllkę, bo i to da się zrobić, a trzeba to robić w przypadku korzystania z Pointerów jako adresów ilości rzeczy w grze (jak życia czy złoto w przypadku Horde). Kod na wstrzyknięcie później moge napisać i wrzucić tutaj. Dodam tylko, że przydaje się tutaj moduł o nazwie afxcodehook.pas do wstrzykiwania dllki w proces. Samo ustawianie Pointerów również do znalezienia w google albo na video tutorialu na Youtube, w którym gościu w dużym przyśpieszeniu pokazuje jak pisze taką dllkę dla jednej gry, tylko że do wstrzykiwania używa jakiegoś badziewia, które w google można znaleźć na wielu stronach, ale ponoć zawirusowane, także temu narzędziu nie za bardzo ufam, wolę napisać swój kod z użyciem wspomnianego modułu, o którym też się dowiedziałem z google. Wystarczy tylko chcieć i wszystko można znaleźć, ale Tobie się pewnie nie chciało, bo po co - lepiej od razu smarować posta tutaj ;/

0

poke, peek ... to były czasy, ech :)

0

no dzięki olesio własnie szukam jakiegoś tuta tu znalazłem coś: http://www.gamerzplanet.net/forums/rumble-fighter-hacks-trainers-downloads/464415-how-to-create-dll-trainers-in-delphi-7-a.html może mi to pomoże ;p dzięki za pomoc może uda mi się coś znaleźć.

0

A no to jednak chcesz wstrzykiwać kod. To ja pokaże na szybko kod, który jest taką "wprawką" w celu sprawdzenia czy się da. Również dla gry Horde. Kod exeka: Button1 -wstrzykiwanie ładując z pliku, Button2 - wstrzykiwanie, odczytując dllkę z zasobów (zasób o nazwie adll jak widać:

//...
var
  Form1 : TForm1;
  APid : Cardinal;

implementation

{$R *.dfm}

function ProcessExists(ExeFileName : string; var PIDResult : Cardinal) : boolean;
var
  ContinueLoop : BOOL;
  FSnapshotHandle : THandle;
  FProcessEntry32 : TProcessEntry32;
begin
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
  Result := False;
  while Integer(ContinueLoop) <> 0 do
  begin
    if ((AnsiUpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
      AnsiUpperCase(ExeFileName)) or (AnsiUpperCase(FProcessEntry32.szExeFile) =
      AnsiUpperCase(ExeFileName))) then
    begin
      Result := True;
      PIDResult := FProcessEntry32.th32ProcessID;
    end;
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

procedure TForm1.Button1Click(Sender : TObject);
begin
  if ProcessExists('dosbox.exe', APid) then
  begin
    InjectLibrary(OpenProcess(PROCESS_ALL_ACCESS, False, APid),
      ExtractFilePath(Application.ExeName) + 'Project2.dll');
  end
  else
  begin
    ShowMessage('Cannot find dosbox.exe process!');
  end;
end;

procedure TForm1.FormClose(Sender : TObject; var Action : TCloseAction);
begin
  UninjectLibrary(OpenProcess(PROCESS_ALL_ACCESS, False, APid),
    ExtractFilePath(Application.ExeName) + 'Project2.dll');
end;

procedure TForm1.Button2Click(Sender : TObject);
{$R test.res}
var
  ResPtr : Pointer;
  HGlobal, HResInfo : THandle;
begin
  if ProcessExists('dosbox.exe', APid) then
  begin
    HResInfo := FindResource(HInstance, 'adll', RT_RCDATA);
    HGlobal := LoadResource(HInstance, HResInfo);
    ResPtr := PChar(LockResource(HGlobal));
    InjectLibrary(OpenProcess(PROCESS_ALL_ACCESS, False, APid), ResPtr);
  end
  else
  begin
    ShowMessage('Cannot find dosbox.exe process!');
  end;
end;

Oczywiście wszystko z wykorzystaniem modułu: afxcodehook.pas
Sama dllka - póki co to tylko test, procedura nazwana SelectMe, bo do Cheat Engine - o ile dobrze widziałem, da się wstrzyknąć tylko dllkę, która ma jakąś funkcję exportowaną i tę funkcję należy wybrać z listy.

library Project2;

uses
  Windows;

function _FormatC(const Format : string) : string; cdecl;
const
  StackSlotSize = SizeOf(Pointer);
var
  Args : VA_List;
  Buffer : array[0..1024] of Char;
begin
  Args := VA_List(PAnsiChar(@Format) + ((SizeOf(Format) + StackSlotSize - 1) and not (StackSlotSize - 1)));
  SetString(Result, Buffer, wvsprintfA(Buffer, PChar(Format), Args));
end;

var
  FormatC : function(const Format : string) : string; cdecl varargs = _FormatC;

procedure SelectMe; stdcall;
const
  Gold_Pointer = $74B6B0;
  Gold_Offset = $1B1E98;
  Energy_Pointer = $74B6B0;
  Energy_Offser = $1BA966;
var
  v : integer;
begin
  PDWORD(PDWORD(Gold_Pointer)^ + Gold_Offset)^ := 666;
  v := PDWORD(PDWORD(Gold_Pointer)^ + Gold_Offset)^;
  MessageBox(0, PChar(FormatC('%d', v)), 'Test dll', MB_ICONINFORMATION + MB_OK);
end;

begin
  SelectMe;
end.

U mnie jest dla kodu powyżej - bez exportów tylko od razu zostaje uruchomiona ta procedura. Powodzenia. I zawsze samodzielnie najpierw poszukaj zanim zapytasz na forum. I później całość przepiszę na WinAPI - korzystając z okien i części kodu trainera z WinAPI, tylko że będzie on w dllce.

EDIT: dołączyłem ten moduł do tego posta, bo jest ładnie przeformatowany i usunięte zostały z niego komentarze z dziwnymi znakami, chyba po rosyjsku albo może i po chińsku. Poza tym zmieniłem temat tego wątku na bardziej odpowiadający żeby łatwiej można było go znaleźć w przysłości, dodałem też tagi.

0

dziękuje... Za pomoc, nie spodziewałem się aż takiej pomocy ale dziękuje. teraz pytanko mam bo zapomniałem co dodać do uses... podswietla się TProcessEntry32

teraz podswietla mi się "InjectLibrary" ale z tym już sobie nie poradzę... proszę o pomoc.

0

Jaja sobie ze mnie robisz? Chyba tak, bo po adresach IP widze, że to ta sama osoba. Napisze wprost: jazda do kompendium i poczytaj o podstawach plus nauka używania google. Fakt, nie wkeiłem całego kodu mojego unit1.pas ale skąd ja mogłem przypuszczać, że ktoś nawet z gotowców nie umie skorzystać. Podpowiem dla tych funkcji z wyszukaniem procesu TlHelp32, a dla InjectLibrary tak jak pisałem afxcodehook - który musisz pobrać i wrzucić do katalogu z projektem. Bez podstaw języka będziesz błądził po omacku, wroć jak je ogarniesz i będziesz miał na prawdę z czymś konkretnym problemy. Ja rozumiem każdego początki, dział Newbie i tym podobne, ale bez przesady. Widzisz, Ty się nie spodziewałeś tutaj pomocy, ja jej mogłem Tobie udzielić, bo tak wyszło że ostatnio sam się bawiłrm w Delphi w robienie trainerów i ich udoskonalanie oraz kombinacje z Pointerami pod Cheat Engine. Ale nie myślałem, że Ty otrzymując pomoc nie będziesz nawet z gotowców umiał skorzystać ;/ Chociaż siedząc ponad trzy i pół roku na tym forum oraz regularnie czytając posty dotyczące Pascala / Delphi powinienem to przewidzieć ;( A i jak już się tak produkuje. Patrz, jak nie ma w helpie informacji o jakimś elemencie, którego nie ma w uses to robisz tak, w google wpisujesz na przykład: delphi TProcessEntry32 i po znalezionym gotowym kodzie w pierwszym wyniku wiesz jakiego modułu Ci może brakować.

EDIT: no wątek się zidenxował w google, ale póki co najszybciej go można znaleźć z parametrem site:4programmers.net/Forum, ale teraz informacje o przykładowym trainerze jak i sposobie na injeckcje dllki są podane na tym forum w jednym miejscu. A ja musiałem sobie ponarzekać, coż tak miewam, bywam marudny, ale nie inreal raczej, tylko na forum, bo chciałym żeby każdy pytający czasami wykazał się odrobioną samodzielności zanim zada pytanie :) A i może w przyszłości skrobne artykuł jak zrobic Trainer w Delphi oraz WinAPI, tylko nie wiem czy będzie na taki tekst zapotrzebowanie.

0
olesio napisał(a)

tylko nie wiem czy będzie na taki tekst zapotrzebowanie.

Ja się piszę na poczytanie ;)

0

Skoro jest tu osoba, która się w tym zakręciła, to zapytam, bo co prawda to napisała, ale nieco ogólnie

W przypadku dynamicznego adresu (np na 600 hp), jego statyczny adres to jest adres zawierający wskaźnik? np.

...
006FABD2 000BD384 // 006FABD2 statyczny adres
...
...
000BD384 600
...

ew.

...
006FABD2 000BD384
...
000BD384 01808978
...
01808978 600
...

Wspomniałeś też o dodawaniu do adresu procesu (to jest chyba zwracane przez handle'a) pewnej wartości w celu odczytaniu innej, czy to by było coś w stylu

HANDLE hwnd = 6FAB8C; // na sucho bez użycia FindWindow czy innych temu opcji

int life = hwnd + CF4; // Taki zapis dobrze określa to co napisałem ponad kodem? Czy nie do końca? Skąd CF4?

Wiem, że to jest napisane, ale trochę enigmatycznie (troszkę)

0

Na C++/C nie znam się prawie wcale, ale masz źródła w przejrzystym i prostym Delphi to sobie zobacz co i jak. Kwestia Pointerów jest pokazana na YouTube na tym: i wielu innych filmikach. A i chyba Ty nie myślisz - co robisz, bo coż ma wspólnego adres na przykład żyć w pamięci z uchwytem do okna aplikacji? Uchwyt okna to jedno, z niego możemy pobrać PID na przykład przez GetWindowThreadProcessId(hHwnd, pPid);, a adres w pamięci to drugie. Nie ogarniasz takich kwestii, to korzystaj z Cheat Engine, będzie Tobie łatwiej niż pisać trainer od zera, w czym nie pomogę, bo widzę że chcesz skorzystać z innego języka niż znane mi Delphi. Poza tym jeżeli chcesz operować na Pointerach, tak jak to pokazałem w późniejszym moim postcie to jeśli się nie mylę - potrzebna Ci będzie odpowiednio napisana dllka oraz program do jej wstrzyknięcia (można to zrobić przy użyciu Cheat Engine oraz polecenia w oknie "Memory View" (odpowiednia opcja jest w menu "Tools"). Tylko ważne żeby dllka miała jakieś exporty. Albo też możesz po prostu dodać odpowiednio Pointery i ładować sobie pliki *.ct po wybraniu procesu danej gry, którą chcesz oszukać.

0

Odświeżam szybko wątek, bo bawiłęm się nie mogąc spać pół nocy i trochę teraz żeby "dopieścić" oba trainery. Także dołaczam je do tego posta. W pliku horde_trainer.rar kod i exek trainera wyszukująegoy po charakterystycznym ciągu bajtów w pamięci procesu. Jest on ciutke wolniejszy i inaczej odświeża energię po zamrożeniu. Natomiast w archiwum horde_trainer_v2.rar jest trainer, który w zaosbach ma dllkę a_trainer.dll i ją wstrzykuje w proces DosBOX'a. Dałem na sztywno adres $400000 ale można ModuleHandle ustalić kodem pokazanym między innymi w postach w tym wątku: http://forum.cheatengine.org/viewtopic.php?t=533598 - można ławo funkcję do pobierania Pid'a z nazwy procesu przerobić na pobieranie nazwy procesu z istniejącego Pid'a. Mam nadzieję, że kod jest jasny. Niestety trainer z iniekcją dllki zrobiłem tak jak umiałem żeby w ogóle działał, ponieważ wcześniej podawając na sztywno adresy Pointerów i Offset dla energii gracza miałem zamrożenie poruszania gracza w fazie walki (klawisze do wyjścia z rozgrywki, ładowania oraz opcji i sama pauza działąły, ale gracz nie poruszał się w ogóle, podejrzewam że to jakieś zabezpieczenie które mogło działać w samych trainerach dosowych albo coś źle robiłem, jak ktoś chce może się pobawić i ewentualnie zmienić kod jak mu zadziała to ok może się tutaj pochwalić). Faktyczny adres do Pointera energii ustaliłem wyszukując ten uniklny ciąg bajtów z kodu horde_trainer i dodałem do niego $8ADE. Taki sposób zadziałal, bo wcześniej ustawiając energię po wyszkaniu offsetów nie zawsze się ona chciałą zmienić na ustawioną pod Cheat Engine wartość. Kto ma chęć może sobie mój kod przetłumaczyć na C/C++ jeżeli mu nie pasuje Delphi, ale nie wiem czy uzyska pod kompilatotami C/C++ mniejsze pliki wykonywalne lub bardziej optymalny kod, ale nikomu nie bronię kombinowac. Ja stworzyłem ten trainer tak jak umiałem i tak by działały prawidłowo. Enjoy it :)

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