To pytanie przychodzi mi do głowy od dłuższego czasu ... głównie dlatego, że widzę boty do wszelkiego rodzaju gier, takich jak WoW i inne. Moje pytanie brzmi; skąd boty wiedzą, co pojawia się na ekranie? Nie gram w WoW, więc mój przykład może się mylić, ale jeśli na przykład istnieje potwór, skąd bot wie, gdzie ten potwór znajduje się na ekranie i jak się z nim komunikuje?
Czy możesz zastosować to do dowolnej gry, czy jest to specyficzne dla każdej gry? Przepraszam, jeśli pytanie nie jest jasne ... i nie pytam, jak zrobić bota, więcej pytam, jak wykrywają rzeczy na ekranie, co jest dla mnie dość fascynujące!
Z góry dziękuję :)
Odpowiedzi:
Istnieje wiele punktów, w których bot może wstrzyknąć się do gry.
Ekran jest jednym z nich, ale zdecydowanie nie jest najbardziej użyteczny. Jednak kiedyś widziałem bardzo wczesny aimbot do Counter Strike, który wykorzystywał kodowanie kolorami. Przyszedł z alternatywnymi modelami postaci z jednokolorowymi teksturami (gra była na tyle przyjazna dla modyfikacji, aby na to pozwolić), a następnie po prostu wykryła piksele tych kolorów. Jednak niezbyt skuteczna metoda. Było już wtedy dość niezgrabne i staje się coraz mniej realne, ponieważ silniki graficzne stają się coraz potężniejsze, co oznacza coraz więcej szczegółów w celu pomylenia algorytmów optycznego rozpoznawania.
Kolejnym punktem jest bezpośredni odczyt pamięci [1] . Możliwe jest, że jeden program na komputerze odczyta pamięć innego. Deweloper musi więc dowiedzieć się, pod jakim adresem pamięci gra zapisuje informacje istotne dla bota. Istnieją narzędzia, które pomagają programistom znaleźć to, czego chcą, tworząc obraz pamięci i udostępniając różne narzędzia wyszukiwania. Środkiem zaradczym jest zastosowanie losowości układu adresu, ale inteligentny bot może nadal automatycznie znaleźć to, czego szuka.
Możliwe jest zmodyfikowanie samego pliku wykonywalnego gry. Aby to zrobić, twórcy botów muszą być w stanie czytać i programować w asemblerze, co nie jest trudne przy pewnej praktyce. Następnie szukają kodu, który obsługuje informacje, którymi są zainteresowani, i przepisują go, aby przekazać go swojemu botowi. Możliwym przeciwdziałaniem z punktu widzenia twórcy gry jest użycie obfuscatora, aby kod asemblera gry był mniej czytelny, ale zwykle nie są one dobre dla wydajności i istnieją narzędzia dla wielu zaciemniaczy, które odwracają ich działanie.
A potem jest kod netto. W grze online serwer przesyła właściwości i pozycje wszystkich obiektów w grze za pośrednictwem sieci. Strumień danych sieciowych między serwerem a klientem może być przechwytywany i analizowany. Popularnym narzędziem do tego jest Wireshark. Gdy programista poddał inżynierii wstecznej kod sieciowy, może napisać bota, który przechwytuje ruch sieciowy, tak jak robi to Wireshark i wykorzystuje informacje do podjęcia decyzji. Gdy programiści są bardziej zmotywowani, mogą nawet opracować kompletnego klienta gry od zera, który implementuje protokół sieciowy i gra w tę grę, nawet bez żadnej grafiki. Takie boty są bardzo popularne wśród hodowców złota, ponieważ bez wyjścia graficznego klient jest zwykle znacznie bardziej przyjazny dla zasobów, co oznacza, że może uruchomić wiele z nich jednocześnie na małym serwerze.
1: Ponieważ wspominasz o WoW, warto zauważyć, że wczesny i notoryczny program botujący WoWGlider korzystał z bezpośredniego dostępu do pamięci. Blizzard miał podprogram o nazwie Warden, który został zaprojektowany do wykrywania i blokowania dostępu programów zewnętrznych do wewnętrznego stanu gry WoW. Ponieważ program bot ominął tę ochronę i odczytał pamięć bez pozwolenia, pozew MDY przeciwko Blizzard z 2006 r. Został rozstrzygnięty na korzyść Blizzarda z tego powodu, że twórca bota zachęcał i umożliwiał użytkownikom naruszanie praw autorskich i naruszenie DMCA .
źródło
Boty to gracze. Po prostu odczytują pozycje gracza / potwora z serwera, tak jak każdy inny gracz, i używają tych wartości w połączeniu z prostym skryptem sztucznej inteligencji do wykonywania działań w grze poprzez programową symulację pociągnięć klawiatury i kliknięć myszą. Gdyby boty faktycznie posiadały algorytm do wykrywania potwora na ekranie i interakcji z nim, byłby to dość imponujący program, który byłby wart miliony. To w zasadzie sztuczna inteligencja dla robotów.
źródło
Phillip przedstawił już świetny przegląd tego, jak działa większość botów, ale chciałem opisać wszystko bardziej szczegółowo, ponieważ mam trochę osobistego doświadczenia w rozwijaniu wszystkich rodzajów botów, które obejmował.
W Runescape istniał duży projekt (RSBot), który kopiowałby zawartość pamięci z klienta Runescape do swojej pamięci lokalnej, gdzie mógł następnie przeglądać cały stan gry bez ryzyka złapania klienta. Wymagało to trochę inżynierii wstecznej, aby ustalić, gdzie w pamięci szukać, aby znaleźć wskaźniki do danych, ale kiedy to zrobili, ujawnili API, aby skorzystać z informacji. Wiedziałby dokładnie, gdzie jest na świecie, uzyskując współrzędne obiektu, a następnie przekształcając je za pomocą matrycy transformacji kamery, aby uzyskać pozycję na ekranie. Maski uderzeń były również czytelne, więc ustalenie, do którego zakresu przesuwać mysz, było banalne, aby uzyskać pożądany wynik.
Bot dostarczył wiele informacji debugujących, takich jak adnotacje, które poinformowały dewelopera, gdzie są współrzędne kafelków, gdzie ma identyfikator tego obiektu, jaki identyfikator należy do danego elementu itp. Informacje te można następnie wykorzystać do stworzenia botów. Rzeczywisty proces tworzenia skryptów botów był w rzeczywistości dość prosty. Szkielet zapewniał wiele funkcji narzędziowych, takich jak
move_to(world_coordinates)
lub,mouse_move(x,y)
które wykonywałyby określone działania w nieco wiarygodny sposób (poruszanie myszą wzdłuż losowego splajnu, wielokrotne poruszanie się zarówno na minimapie, jak i ekranie itd.)Również w Runescape masz możliwość drastycznego obniżenia jakości grafiki. Stworzenie pewnego rodzaju botów było dość łatwe, filmując ekran i stosując podstawowe koncepcje wizji komputerowej w celu zbudowania modelu świata. Za pomocą tej techniki zrobiłem zarówno robota klątwę, jak i robota do wytapiania, które działały całkiem dobrze. Wystarczy wziąć ramkę, maksymalnie zwiększyć nasycenie, a następnie spróbować wyodrębnić z niej wzory, które mogłyby następnie wygenerować mapę prawdopodobieństwa dla stref kliknięć.
W przypadku bota przekleństwa celem był mniejszy demon, który jest po prostu wielką czerwoną rzeczą, którą można łatwo znaleźć. W przypadku bota do wytopu szukałby małego pomarańczowego trapezu otoczonego szarym, a byłby to piec. Próbowałby także znaleźć duży, jasnoszary kształt litery „L”, który byłby biurkiem bankowym. Dokonano tego dzięki zmniejszeniu skali i podstawowej heurystyce. Mógłby również zorientować się za pomocą poręcznego kompasu obok minimapy, dzięki czemu mógłby ustawić kamerę w bardziej niezawodnej pozycji, aby znaleźć obiekty docelowe.
W różnych grach Nexon serwery bardzo ufają klientom. Nadużyłem tego tonę w Maplestory, modyfikując mapy w celu usunięcia zagrożeń lub dodania wypaczeń, aby bot nie musiał być tak wyrafinowany. Chciałbym również monitorować ruch do iz serwera, aby zbudować model świata, który można by następnie wykorzystać do szybkiego znalezienia i zabicia potworów.
Kiedy zdałem sobie sprawę, że tak naprawdę nie gram już w MMO i po prostu je zautomatyzowałem, postanowiłem całkowicie przestać grać. Gdybym nie martwił się tak, że ujawnię się legalnie, prawdopodobnie zrobiłbym zabójstwo sprzedając boty MMO, ale tak naprawdę nie chciałem zostać pozwany. Dlatego spędzam teraz czas na prawdziwym programowaniu!
źródło
Odpowiedź Phillipa jest świetna, ale tylko krótka notatka na temat modelu / widoku / kontrolera lub w skrócie MVC.
Twój ekran jest częścią „widoku”, który przedstawia dane z „modelu”, który jest prawdziwym stanem gry, jeśli chcesz. Boty i twoja postać wszystkie „istnieją” (w pewnym sensie) w modelu. Wyobraź sobie, że odłączyłeś ekran - gra byłaby kontynuowana, nawet jeśli widok zniknął.
W grze sieciowej koncepcja „modelu” jest trochę skomplikowana, ponieważ faktycznie masz wiele modeli. Masz model na serwerze, a następnie model na każdym kliencie, który aktualizuje się częściowo z powodu danych, które otrzymuje z serwera. Możesz pomyśleć o „modelu” obejmującym model serwera i model klienta, lub możesz myśleć o nim tylko o modelu własnego klienta. Tak czy inaczej, tutaj mieszkają boty. Zatem ich „percepcje”, których moglibyśmy użyć jako skrótu dla ich danych wejściowych i stanu, są oparte na stanie modelu w tym czasie i interakcji między różnymi bytami / obiektami w tym modelu. W praktyce każdy bot może mieć funkcję o nazwie „refreshState”, która działa raz na ramkę lub coś i powoduje, że jest aktualizowany ”
źródło
Mogą czytać współrzędne z pliku lub serwera, ale także z systemem wykrywania kolizji promieni. Powszechnie stosuje się promienie, które przechodzą od bota (w tym przypadku) na zewnątrz. Jeśli promień zderza się z czymś, zwraca do bota pewne informacje, takie jak to, że znaleziony promień był graczem, botem, zwierzęciem lub zwykłą ścianą. Dzieje się tak dlatego, że na przykład w przypadku gracza i bota mają one niewidoczną kapsułę, która angażuje ich całkowicie w informacje na przykład o swoim typie (człowiek, bot, ...). Dzięki temu mogą uniknąć zderzenia ze ścianami i innymi elementami, jeśli na przykład cię śledzą.
Możesz zobaczyć część Wykrywanie kolizji na tej stronie
źródło