Jak robią boty/addony do gier?

1

Cześć
Chodzi mi bardziej o sposób zapamiętywania, pod jakim adresem znajduję się jakaś zmienna. Za pomocą np. Cheat Engine możemy znaleźć adres interesującej nas zmiennej w grze lub programie np. pod jakim adresem znajduję się zmienna przechowująca wartość HP :P
Ale przecież przy każdym uruchomieniu gry praktycznie niemożliwe jest, aby te dane zostały załadowane do tych samych adresów w pamięci. Jak więc to robią?

0

Dlatego w cheat engine podajesz nazwę procesu którego pamięć ma być obserwowana

0

Co to znaczy? Przecież jak pobieram bota to on już wie co gdzie jest.

1

Będę jasnowidzem i powiem ci ze jak uruchomisz notatnik będzie to proces notepad.exe. To się tyczy wszystkich programów. Jest z góry zdefiniowana nazwa

0

Ale dla danej gry proces ma zawsze tą samą nazwę więc to twórca bota ją podaje

0

Nadal nie rozumiem. Przecież zmienne programu mogą być rozmieszczone po całej pamięci RAM, zależy gdzie akurat jest miejsce wolne. Skąd bot ma wiedzieć, że pod adresem A jest akurat wartość paska zdrowia, a nie czego innego?

7

@Dzonzi to nie do końca jest tak jak myślisz. Pamięć jest wirtualizowana i każdy proces może "widzieć" takie same adresy a mimo to odnoszą się one fizycznie do innych komórek pamięci ram. Ważne jest to co widzi proces bo jak podepniesz sie do niego debuggerem to będziesz wdział jego przestrzeń adresową.
Idąc dalej, jeśli nie ma tam działającego ASLR (address space layout randomization) to proces dostanie zawsze takie same adresy! Nawet jeśli jest w systemie ASLR to znów można polegać na realtywnej adresacji, tzn wystarczy że wiesz że zmienna przechowująca X znajduje sie Y bajtów za jakimś stałym markerem i znów mozesz przeszukać pamięć w poszukiwaniu tego markera a potem wyliczyć adres interesującej cie zmiennej.

0

Czyli jak używamy wskaźników to operujemy na tych wirtualnych adresach pamięci, a nie fizycznych, dzięki czemu ten sam adres wirtualny może znajdować się w różnych miejscach w pamięci fizycznej za każdym uruchomieniem procesu?

Czy w takim razie jest jakiś sposób na wyłuskanie adresów fizycznych pamięci? np. chciałbym zobaczyć jaka jest teraz wartość w pierwszej komórce pamieć RAM. (pewnie to bedzie coś z procesu Windowsa która pierwszy ładuje się do pamięci)

0

Podepnę się z ciekawości. @Shalom bardzo fajnie opisał, ale. Przecież jak dwa razy uruchomię program, to pewnie dwa razy adres zmiennej będzie inny. OK, napisałeś, żeby znaleźć odniesienie. Ale adres odniesienia też może być inny. No to odniesienie do odniesienia ;) Itd. Gdzie tu jest początek? Czy może trzeba po prostu przeanalizować samemu konkretny produkt, żeby znaleźć stałe miejsca?

0

W przestrzeni adresowej danej programu adres zmiennej będzie taki sam niezależnie od tego ile razy go uruchomisz, będą tylko fizycznie w innym miejscu. W dodatku w przypadku gier raczej nikt nie uruchamia dwóch instancji jednocześnie ;)

0

Nie, nie będzie. Sprawdź sobie na debugu jakikolwiek program trochę większy niż hello world i zobaczysz, że adresy się zmieniają. Offsety się nie zmienią między różnymi punktami.

0

Zazwyczaj wystarczy base address i kilka offsetów żeby dojść do dowolnej zmiennej, ale po aktualizacji trzeba odświeżać.

2

@Dzonzi to zainstaluj DOSa ;)
@Juhas to zależy. Adresy funkcji, o ile nie ma ASLR, będą stałe. Jeśli binarka nie jest stripowana to będzie też miała symbole. Jeśli nie to zawsze mozesz skanować sekcje .text binarki i znaleźć funkcje która cie interesuje, bo jej kod przecież jest ustalony. Jeśli juz wiesz gdzie jest funkcja na przykład aktualizująca jakąś wartość, to możesz zobaczyć jaki adres dostaje przy wywołaniu i voila, nawet jeśli to jest losowy adres na stercie to juz go właśnie złapałeś.
Analogicznie możesz skoczyć do ramki stosu z wywołaniem jakiejś funkcji (np. main) i wiesz że na przykład interesujace cie zmienne są X bajtów wcześniej/później nż ta ramka. Bo to znów jest ściśle ustalone.

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