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 }
Jakiego typu są
Tibia = TibiaProcess[0];
Base = Tibia.MainModule.BaseAddress.ToInt32();
Process Tibia… domyślam się
a Base?
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ć 🙂
Ok, dzieki 😉
Proszę bardzo i powodzenia z botem 🙂
i nie znajduje mi jeszcze „Hit Points” w OllyDBG