Tibia Development Series #1

Status
Zamknięty.

Norbert

Forum friend
Przyjaciel forum
Dołączył
Listopad 8, 2009
Posty
1125
Liczba reakcji
31
Wiek
36
Witam.
Tibia Development Series w za?o?eniu b?dzie zbiorem artyku??w, kt?re pomog? pocz?tkuj?cym programistom zacz?? swoj? przygod? z pisaniem cheat?w.
Aby m?c w pe?ni zrozumie? przes?anie kursu potrzebna b?dzie podstawowa wiedza z zakresu programowania oraz obs?ugi kompilator?w.
Wszystkie dzieci, kt?rym wydaje si?, ?e po przeczytaniu takiego poradnika stworz? drugiego ElfBota mog? ju? opu?ci? ten temat. Kraina bajek jest kilka dzia??w ni?ej.
Wi?kszo?? przyk?ad?w b?d? podawa? w Delphi oraz by? mo?e w C++. Dodatkowo nie zaszkodzi?yby r?wnie? podstawy asemblera, co jednak na etapie tego kursu nie b?dzie wymagane.

Modyfikacja pami?ci za pomoc? WinApi.

1. Cel zadania

Ka?dy program uruchomiony pod systemem windows, dostaje pewn? cz??? pami?ci wirtualnej (Na systemach 32 bitowych s? to 4 GB).
To w?a?nie do tej pami?ci programi?ci maj? dost?p z poziomu systemowego API (WinApi).
Program to nic innego jak wielka tablica bajt?w zawieraj?ca si? w?a?nie w tej przestrzeni wirtualnej, kt?ra p??niej znajduje swoje odzwierciedlenie w pami?ci RAM.
Naszym celem b?dzie uzyskanie dost?pu do pami?ci wirtualnej, oraz modyfikacja pewnych warto?ci. Dok?adniej to zmienimy aktualny stan HP naszej postaci. B?dzie to jednak akcja widziana tylko po stronie naszego klienta.

2. Narz?dzia

Narz?dzia z jakich b?dziemy korzysta? to kompilator Delphi 7 (wystarczy w wersji Personal) oraz Cheat Engine 5.5

Cheat Engine - Download

3. Teoria

Dost?p do pami?ci wirtualnej wymaga skorzystania przez programist? z kilku funkcji. Na pocz?tku musimy znale?? PID (Process ID). Je?eli w??czymy Mened?er zada? (ctrl+alt+delete), przejdziemy do menu Widok->Wybierz kolumny... i zaznaczymy checkboxa PID, b?dziemy mogli podgl?dn?? ID ka?dego uruchomionego procesu, w tym Tibii ;]
Aby uzyska? PID mo?emy skorzysta? z kilku opcji, ja jednak zaprezentuje tutaj najprostsz? ale skuteczn? metod? polegaj?c? na znalezieniu uchwytu do okna.
Dlatego pierwsz? funkcj? z jakiej b?dziemy korzysta? to FindWindow
(dokumentacj? ka?dej funkcji znajdziecie na msdn wpisuj?c w googlach jej dok?adn? nazw?).
Za jej pomoc? uzyskamy uchwyt okna, kt?ry b?dzie nam niezb?dny do wykorzystania w funkcji GetWindowThreadProcessID, kt?ra zwr?ci PID.
Maj?c ID procesu mo?emy go sobie "otworzy?" za pomoc? funkcji OpenProcess i uzyska? do niego odpowiedni uchwyt.
Teraz ?mia?o b?dziemy mogli korzysta? z WriteProcessMemory/ReadProcessMemory.

Funkcje, mamy ju? pokr?tce om?wione. Teraz wypada?oby zastanowi? si? co chcemy edytowa?. Jako przyk?adem pos?u?? si? warto?ci? HP naszej postaci.
W kliencie Tibii przechowywane s? 2 informacje odnosz?ce si? do poziomu ?ycia. Pierwsza z nich to aktualna ilo?? HP a druga to maksymalna ilo?? HP.
My zajmiemy si? tylko aktualn? ilo?ci?.

Aby odszuka? adres naszego poziomu ?ycia pos?u?ymy si? cheat enginem.

1.JPG

W odpowiednich okienkach wpisujemy warto?ci:

Value - 295 (stan naszego HP)
Scan Type - Exact Value (szukamy dok?adnie warto?ci 295)
Value Type - 4 byte (ilo?? naszego HP w pami?ci zajmuje 4 bajty, jest to typ integer).

Naciskamy "First Scan" i naszym oczom ukazuje si? d?uga lista adres?w.
Teraz udajemy si? na pobliski resp rat?w. Tracimy kilka HP. Wpisujemy w okienko Value nasz aktualny poziom ?ycia i klikamy "Next Scan".
Liczba adres?w powinna si? zmniejszy?. Akcj? powtarzamy do czasu otrzymania jednego wyniku.
Adres, kt?ry szukamy prawdopodobnie b?dzie zielony (sta?y).

Dla Tibii 8.54 jest to 00635F0C

W Delphi warto?ci w systemie hexadecymalnym zapisujemy tak:

$635F0C

W C++ natomiast ten sam zapis wygl?da tak:

0x635F0C

4. Implementacja

Tworzymy nowy projekt aplikacji konsolowej. Oboj?tnie czy to w Delphi czy C++ i zapisujemy gdzie? na dysku. Nasz programik b?dzie bardzo prymitywny poniewa? zmieni on tylko aktualny stan naszego HP na ustalon? przez nas wcze?niej warto??.
W Delphi do sekcji uses musimy doda? modu? Windows w c/c++ natomiast include "windows.h", dzi?ki temu b?dziemy mogli korzysta? z systemowego API.
Ja bardzo s?abo programuj? w C/C++ dlatego je?eli w przyk?adach znajd? si? jakie? b??dy typu "mo?na to zrobi? lepiej, bardziej optymalnie" wcale nie b?d? zdziwiony :P

Kod Delphi z komentarzami:

Kod:
program Tibia;

{$APPTYPE CONSOLE}

uses
  Windows;

//Deklaracja wa?ny zmiennych
var
  WindowHandle  : HWND;
  PID : DWORD;
  hProcess  : DWORD;
  Value : DWORD;
  NBR : Cardinal;
const
  ClassName = 'TibiaClient';
  WindowName = 'Tibia';
  HP = $635F0C;
begin
  // W tej funkcji mo?emy w pierwszym parametrze
  //skorzystac z ClassName lub z WindowName w drugim
  WindowHandle := FindWindow(ClassName,nil);
  //Otrzymalismy w ten sposob uchwyt okna Tibii

  //sprawdzamy czy okno zostalo znalezione
  if not(WindowHandle=0) then
    begin
      //Teraz za pomoca funkcji GetWindowThreadProcessID
      //uzyskamy PID klienta Tibii
      GetWindowThreadProcessID(WindowHandle, @PID);

      //Otwieramy Process z odpowiednimi prawami dostepu
      //i tym samym uzyskujemy wymagany pozniej uchwyt.
      hProcess := OpenProcess(PROCESS_ALL_ACCESS, false, PID);

      //Zapisujemy do adresu $635F0C (aktualne HP) wartosc 10
      Value:= 295;
      WriteProcessMemory(hProcess,ptr(HP),@Value,4,NBR);

      //Zamykamy uchwyt do procesu
      CloseHandle(hProcess);
    end;
end.

Teraz przyk?ad w C++ ale ju? bez komentarzy:

Kod:
#include "stdafx.h"
#include "windows.h"

int _tmain(int argc, _TCHAR* argv[])
{
	HWND WindowHandle = 0;
	
	WindowHandle = FindWindow(L"TibiaClient",0);

	if (WindowHandle!=0)
	{
		DWORD PID = 0;

		GetWindowThreadProcessId(WindowHandle, &PID);

		HANDLE hProcess;

		hProcess = OpenProcess(0x0FFF, false, PID);
		
		int LastErr = 0;
		LastErr = GetLastError();

		int Value = 10;
		int HP = 0x635F0C;
		
      	WriteProcessMemory(hProcess,&HP,&Value,4,0);

		CloseHandle(hProcess);
	}

	return 0;
}
Ten przyk?ad by? pisany ca?kowicie z pami?ci wi?c co? mo?e nie dzia?a?. Licz? jednak, ?e ka?dy kto chocia? troch? pisz? w c zrozumie o co chodzi.

5. Podsumowanie

Pierwsza cz??? kursu Tibia Development Series w?a?nie dobieg?a ko?ca.
Mam nadziej?, ?e te kilka s??w da wam jaki? podstawowy zarys sytuacji.
Korzystaj?c z wymienionych wy?ej funkcji mo?ecie ca?kiem ?mia?o napisa? prostego light hacka czy outfit changera.
Je?eli jednak nie czujecie si? na si?ach poczekajcie do kolejnego odcinak, w kt?rym zaprezentuje jak napisa? bardzo proste ale funkcjonalne macro do Tibii.


Tibia Development Series nie mo?e by? kopiowane i rozpowszechniane na stronach innych ni? Tibia.net.pl bez mojej zgody.
 
Odp: Tibia Development Series #1

Wykona?em, doda?em nawet w?asn? funkcj? zmiany punkt?w many. Poradnik jak najbardziej na plus:d
2houy43.png


kolejny ssik:D
ru028o.png
 
Ostatnia edycja:
Odp: Tibia Development Series #1

Visual Cpp:

Kod:
Cannot open include file: 'stdafx.h': No such file or directory

Wtf? Zrobi?bym sobie mini programik zmieniaj?cy wszystko, skille, etc. ale nie dzia?a nawet to do zmiany ?ycia ;o
 
Odp: Tibia Development Series #1

Visual Cpp:
Kod:
Cannot open include file: 'stdafx.h': No such file or directory
Wtf? Zrobi?bym sobie mini programik zmieniaj?cy wszystko, skille, etc. ale nie dzia?a nawet to do zmiany ?ycia ;o

Podstawy programowania si? k?aniaj? xd Chocia? mo?e co? porypa?em w tym przyk?adzie C++
 
Odp: Tibia Development Series #1

A da si? zapisa? to jako zmienn? (rezultat "wyszukania" klienta) i wtedy "przyczepi?" kopi? bota do programu (Delphi ofc.).
 
Odp: Tibia Development Series #1

A da si? zapisa? to jako zmienn? (rezultat "wyszukania" klienta) i wtedy "przyczepi?" kopi? bota do programu (Delphi ofc.).

Nie bardzo rozumiem o co Ci chodzi, ale ja np. w swoim programie robi? tak, ?e przeszukuje wszystkie procesy w systemie, sprawdzam czy jest, kt?ry? jest Tibi?. Je?eli jest to sprawdzam czy moja dll'ka jest wstrzykni?ta, je?eli nie jest to zwracam PID.
 
Odp: Tibia Development Series #1

O to mi chodzi?o, thx.

Skorzystaj z modu?u "tlhelp32"

Jest w nim pewna funkcja, "CreateToolhelp32Snapshot".

Dzi?ki tej funkcji mo?esz stworzy? sobie list?:

- dzia?aj?cych proces?w
- dzia?aj?cych w?tk?w
- modu??w w procesach

W googlach na 100% co? o tym znajdziesz.
 
Odp: Tibia Development Series #1

wyobraz sobie to jako urzadzenie, ktore wstrzykuje ci ktos do organizmu, moze to urzadzenie robic dowolne rzeczy,

co to daje? nie ma zadnych ograniczen, czujesz sie wtedy w 'procesie tibii' jak w domu,
wiecej informacji znajdziesz uzywajac frazy dll injection,
do prostych zmian wartosci komorek w pamieci wystarcza dostep do tego obszaru pamieci,

jesli np. chcialbys byc informowany o kazdym odebranym lub wyslanym pakiecie przez klienta gry, to mozesz uzyskac to poprzez hook'a na recv() lub send() (ktore w kliencie sa zaimplementowane z bibliotek ws2_32.lib),
Jak wygl?da?oby zmuszenie klienta, do poinformowania ci? o ka?dym pakiecie? Je?li mieliby?my dost?p do ?r?d?a, to dodaliby?my w definicji jakiej? funkcji wywo?uj?cej wysy?anie pakiet?w send() co?, co dawa?oby nam wgl?d do danych, np. zwyk?e, najprostsze okienko z zawarto?ci?.
CipSoft nie udost?pnia ?r?d?a, dlatego musimy sobie poradzi? inaczej.
Do zrozumienia tego wymagana jest podstawowa wiedza o wska?nikach (na funkcje).
Klient gry wywo?uje funkcje send() z jej adresu przechowywanego pod nazwa zmiennej np. ADRES_SEND, kt?ra ma warto?? ADRES_SEND=&send, mo?na powiedzie?, ze w wywo?anie tej funkcji polega na odwo?aniu si? do tego adresu z odpowiednimi parametrami.
Je?li napiszemy w?asny odpowiednik funkcji send(), kt?rej deklaracja wygl?da tak samo, jak ta z winsock'a (ws2_32.lib send(...)), to zmiana ADRES_SEND=&nasza_funkcja spowoduje, ?e to nasza_funkcja bedzie wykonywane w momencie wy?ania pakietu. ?eby nadal m?c "gra?" musimy w naszej funkcji umie?ci? odwo?anie do send().

Innymi s?owy dodajemy fragment kodu, kt?ry b?dzie wykonywany przy czym?.
 
Odp: Tibia Development Series #1

Mam kilka pyta? co do kodu :) Jak by? mia? chwilk? i ch?ci mo?esz mi pom?c w zrozumieniu :)
#include "stdafx.h" // do??czamy biblioteki + je?eli nie u?ywamy VS wywalamy ten wpis
#include "windows.h" // do??czamy biblioteki
int _tmain(int argc, _TCHAR* argv[]) // dla kompilator?w innych ni? VS wystarczy u?y? int main()
{
HWND WindowHandle = 0;
WindowHandle = FindWindow(L"TibiaClient",0); // co to jest "L" ?standardowe long czy co? innego? Czy znalezienie klienta tibii nie mo?na by zapisa? w typie bool ?
if (WindowHandle!=0)
{
DWORD PID = 0; // PID to jest "numer" procesu ?
GetWindowThreadProcessId(WindowHandle, &PID);
HANDLE hProcess;
hProcess = OpenProcess(0x0FFF, false, PID);
int LastErr = 0; (ta zmienna i kolejna funkcja s? potrzebne ?)
LastErr = GetLastError(); // czy zwr?cony kod b??du jest nam do czego? potrzebny ? Je?li ju? wywo?ujemy mo?e doda? jaki? stosowny komunikat ?
int Value = 10;
int HP = 0x635F0C;
WriteProcessMemory(hProcess,&HP,&Value,4,0); // 4 to liczba bit?w czy co? innego ? Co oznacza zero jako argument ?
CloseHandle(hProcess);
}
return 0;
Z g?ry dzi?kuje za odpowied? i sorry za noobowskie pytania :)
 
Ostatnia edycja:
Odp: Tibia Development Series #1

Witam, mam pytanie mianowicie, jak zrobi? ?eby makro zacze?o dzia?a?? tzn. mam kod ale jak zrobi? button, kt?ry to uaktywnia
 
Ostatnia edycja:
Odp: Tibia Development Series #1

button1
begin
kod
end
hmm, to by?o trudne?
 
Status
Zamknięty.
Back
Do góry