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

Czytanie pamięci programów na przykładzie Tibii


Rekomendowane odpowiedzi

Opublikowano

HSXGGk3.png

Witajcie, wielu z was zastanawia się pewnie jak ludzie piszą takie programy jak np. bot do Tibi, dlaczego Tibi, przedstawie tutaj tylko ten przykład bo z reszta nie chce mi się babrać z racji tego, że akurat pisze bota, może ktoś z was już zauważył..

Dodam, że ten tutorial jest dla osób które potrafią absolutne podstawy, żeby wiedziały gdzie co jest mniej więcej, nie będę opisywał tutaj jakoś bardzo szczegółowo wszystkich czynności.

Jak się do tego zabrać ?


- Ja osobiście polecam pobrać Visual Studio wersja 2010 lub ta nowsza 2012 tez nie jest zła.

-Tworzymy sobie nowy projekt aplikacja winforms, jest tym co będzie nam potrzebne.

ywlF5kb.png

- Teraz najlepiej będzie dodać sobie do projektu dwa obiekty, jeden odpowiadający za import bibliotek, potrzebnych do czytania pamięci z kernela (WinApi).

- Więc prawym na projekt i dodajemy 2 pliki .cs (ja nazwałem je WinApi.cs i Memory.cs)

- Teraz jak już wyżej napisałem, implementujemy sobie naszą funkcję czytania pamięci z Kernela do pliku WinApi.cs:

(polecam ustawienie klasy obiektu .cs na publiczną)

        [DllImport("kernel32.dll")]

        public static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,

        [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesRead);


        [DllImport("user32.dll", EntryPoint = "FindWindow")]
        private static extern IntPtr FindWindow(string lp1, string lp2);

- Już to mamy więc teraz przejdźmy do samej funkcji czytania pamięci (przyjmuję ona parametry handle okna oraz sam adress).

- Dodajemy funkcję poniżej do pliku Memory.cs

- Funkcja zwraca wartość int (w tym przypadku 32 bity), możemy zaimportować sobie także readstring czy funkcje czytania int pod 16 bitow np dla zmnnnej playerZ która i tak przyjmuję wartości bodajże z zakresu od 0 do 12 ?

(Tutaj też polecam ustawić klase obiektu na publiczną)

        public static int ReadInt32(IntPtr handle, long address)

        {

            return BitConverter.ToInt32(ReadBytes(handle, address, 4), 0);

        }

- No i okej już w zasadzie mamy większość tego czego potrzebujemy, żeby odczytać wartość.

- W tym momencie mamy fajną opcje do wyboru, możemy odwołać oczywiście się do funkcji bezpośrednio podając adres i klienta, ale ja preferuje poukładanie tego jak należy więc tworzymy sobie jeszcze dwa obiekty czyli w moim przypadku Player.cs i Addresses.cs.

- W Player.cs przechowywać będziemy wszystkie funkcje dotyczące czytania wartości z Tibii a w Addresses.cs nasze adresy do poszczególnych funkcji, w Tibii zmieniają się co update.

- UWAGA: Od systemu wyżej niz win Xp wprowadzony jest tak zwany ASLR (Address space layout randomization (ASLR) is a computer security technique involved in protection from buffer overflow attacks.)

Dlatego do adresów czytanych z cheat engine musimy dodawać base adress aktualnie otwartej Tibii (tak, zmienia się co zamknięcie)

Jak to zrobić ? ŁATWO ! :D

- Dodajemy do pliku Addresses.cs kod:

        public static readonly uint baseAdress = (uint)Client.Tibia.MainModule.BaseAddress.ToInt32();

U mnie baseAddress jest równy BaseAdress processu Tibii jednak wy musicie sobie troszkę zmienić, bo inaczej będziecie rozpoznawać klienta, podam to później, teraz skoro już jesteśmy w Addresses.cs to podam wam przy okazji adresik na czytanie HP i XOR, co to XOR można dowiedzieć się w google.

        public static readonly uint XOR = 0x7C1200 - 0x400000 + baseAdress;  // 10.31

        public static readonly uint Player_Health = 0x956000 - 0x400000 + baseAdress; // 10.31

Nasze Addresses.cs jest gotowe, przejdźmy więc do już czytania naszej pamięci....

W pliku Player.cs dodajemy sobie taką funkcyjke:

        public static uint Health

        {

            get

            {

                uint hp1 = Convert.ToUInt32(Memory.ReadInt32(Client.Tibia.Handle, Addresses.Player_Health));

                uint hp2 = Convert.ToUInt32(Memory.ReadInt32(Client.Tibia.Handle, Addresses.XOR));

                return hp1 ^ hp2;

            }

        }

Czyli czytamy wartość adresu hp i xor następnie xorujemy to i wychodzi hp naszej postaci.

Ok wracając do tego Clienta, nie będę tutaj podawał Wam jak zrobić cały wybór postaci itp bo to jest sprawa prosta ale długa i logiczna więc jak ktoś pomyśli to prosto sobie dopisze już mc do clienta, podam jak uzyskać sobie pierwszy proces otwartej Tibii.

- U góry podawałem (Process)Tibia, który znajdował się w pliku Client.cs więc go sobie wypadało by stworzyć.

W środku dajemy sobie:

        public static Process Tibia; // Tworzymy process Tibia
        Tibia = WinApi.FindWindow("tibiaclient", "Tibia");
 

Teraz możemy dodać sobie button1 do formy1, bo przecież utworzyliśmy WnForm App i podpisać go:

MessageBox.Show(Player.Health.ToString());

I to by było na tyle, jeśli jakieś pytania to piszcie, niedługo pewnie dodam coś z battlelista czy coś w tym stylu, ogólnie większość działa na tej samej zasadzie.

Pozdrawiam Arkes

  • 2 tygodnie później...
Opublikowano

Mam mały problem. Przy kodzie:

Tibia = WinApi.FindWindow("tibiaclient", "Tibia");

mam następujący błąd: Error 2 'WindowsFormsApplication1.WinApi.FindWindow(string, string)' is inaccessible due to its protection level "

 

Także w pliku Memory.cs przy kodzie:

return BitConverter.ToInt32(ReadBytes(handle, address, 4), 0);

mam błąd: Error 5 The name 'ReadBytes' does not exist in the current context .

 

 

Proszę o jakieś wskazówki. :)

Opublikowano
The name 'ReadBytes' does not exist in the current context .

 

 

Nie masz funkcji readbytes.

 

A co do 1 błędu musiał bym zobaczyć to w kompilatorze bo nie pamiętam xD

Opublikowano
Mógłbym prosić o cały kod z pliku Memory.cs oraz Client.cs?

 

 

Nie udostępnię Ci kodu mojego projektu, sory.

  • 2 lata później...
Opublikowano

 

    U mnie baseAddress jest równy BaseAdress processu Tibii jednak wy musicie sobie troszkę zmienić, bo inaczej będziecie rozpoznawać klienta, podam to później, teraz skoro już jesteśmy w Addresses.cs to podam wam przy okazji adresik na czytanie HP i XOR, co to XOR można dowiedzieć się w google.      

 

Pozdrawiam Arkes

 

 

@Arkeus Mam taką jedną prośbę czy mógłbyś wytłumaczyć dlaczego dodatkowo muszę odejmować jeszcze 0x400000 od adresu. Napisałeś ze twój base address jest równy base addressowi procesu Tibii dlaczego mój nie jest? Jak to zmienić?

  •  carbonx zmienił(a) tytuł na Czytanie pamięci programów na przykładzie Tibii

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...