Bot do gry Tibia

Dawno nic nie pisałem na blogu, więc postanowiłem podzielić się swoimi osiągnięciami z dziedziny botów. Dawno temu grałem w grę o nazwie Tibia. Jako że miałem ją na starym dysku, to właśnie do niej postanowiłem napisać prostego bota. Nie posiadam zbyt dużej wiedzy z C#, a ten język wybrałem do napisania bota, także bot będzie bardzo prosty – leczenie, odnowa many.

Od razu zaznaczam, że nie udostępniam tu plików bota, a sam artykuł jest tylko w celach edukacyjnych.

Zacznę od teorii. Działanie bota polega na odczytaniu wartości hp i many z pamięci i gdy wartość jest niższa niż w texboxach, użyć odpowiedniego klawisza na klawiaturze (choćby f1). Proste, prawda?

 

Krok 1. Utworzenie formatki.

Tego opisywać nie będę. Każdy może poustawiać przyciski, jak tylko chce. U mnie wygląda to tak:

Krok 2. Poznanie adresów w pamięci.

Musimy dowiedzieć się, gdzie trzymane są wartości HP, many oraz adres XOR.

Otwieramy OllyDBG, prawy przycisk myszy na kodzie ASM i wybieramy: Search for -> All referenced text strings. W nowym otwartym oknie wybieramy: Search for text i szukamy „Hit Points”. Powinniśmy ujrzeć coś takiego:

00443121  |> 68 407B9D00    PUSH Tibia.009D7B40                      ;  ASCII "Hit Points"; Case 3 of switch 0044308F
00443126  |. 57             PUSH EDI
00443127  |. E8 03892300    CALL Tibia.0067BA2F
0044312C  |. 83C4 08        ADD ESP,8
0044312F  |. A1 D0CF7A00    MOV EAX,DWORD PTR DS:[7ACFD0]            ;  XOR Address
00443134  |. 3305 00209400  XOR EAX,DWORD PTR DS:[942000]            ;  Health Address
0044313A  |. 99             CDQ

Mamy adresy. Pozostaje nam jedynie odjąć adres bazowy od tych wartości i gotowe.

Krok 3. Programowanie.

Teraz już tylko programowanie. Wkleję kilka urywków, które są „trudniejsze”.

Czytanie z pamięci:

[DllImport("kernel32.dll")]
public static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,
[In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesRead);

public static byte[] ReadBytes(IntPtr Handle, Int64 Address, uint BytesToRead)
{
IntPtr ptrBytesRead;
byte[] buffer = new byte[BytesToRead];
ReadProcessMemory(Handle, new IntPtr(Address), buffer, BytesToRead, out ptrBytesRead);

return buffer;
}

public static int ReadInt32(IntPtr Handle, long Address)
{
return BitConverter.ToInt32(ReadBytes(Handle, Address, 4), 0);
}
int hp = ReadInt32(Tibia.Handle, (addressHp + Base)) ^ ReadInt32(Tibia.Handle, (addressXor + Base));

Ustalenie procesu Tibii oraz adresu bazowego:

Process[] TibiaProcess = Process.GetProcessesByName("Tibia");
Tibia = TibiaProcess[0];
Base = Tibia.MainModule.BaseAddress.ToInt32();

Kliknięcie klawisza:

SendKeys.Send("{" + mana_key + "}");

Oczywiście, należy skorzystać z timerów, aby sprawdzały co jakiś czas, ile wynoszą wartości hp, many.

Gdyby były jakieś pytanie, to postaram się, w miarę możliwości, odpowiedzieć w komentarzach 🙂

{ 5 komentarze… przeczytaj je poniżej albo dodaj swój }

Siula 2 stycznia, 2014 o 17:28

Jakiego typu są
Tibia = TibiaProcess[0];
Base = Tibia.MainModule.BaseAddress.ToInt32();

Process Tibia… domyślam się
a Base?

Odpowiedz

Mateusz Kapuściński 2 stycznia, 2014 o 17:48

Bardzo chętnie bym Ci pomógł, ale tworzyłem ten program lata temu. Polecam jednak zajrzeć tu: http://tpforums.org/forum/forums/7-Tibia Tam jest bardzo dużo rzeczy, które ułatwią Ci pracę. Od adresów, po inne zmienne, których nie będziesz musiał/a szukać 🙂

Odpowiedz

Siula 2 stycznia, 2014 o 18:12

Ok, dzieki 😉

Odpowiedz

Mateusz Kapuściński 2 stycznia, 2014 o 18:19

Proszę bardzo i powodzenia z botem 🙂

Odpowiedz

Siula 2 stycznia, 2014 o 17:40

i nie znajduje mi jeszcze „Hit Points” w OllyDBG

Odpowiedz

Odpowiedź