Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Optymalizacja zewnętrzna
#1
Nie wiem, czy można to potraktować jako samouczek, bardziej jak kilka przyjaznych dla początkujących pomysłów, aby zacząć od optymalizacji i podążania za strumieniem myśli, który robiłem podczas hackowania. Mam nadzieję, że znajdziesz przydatne informacje!     Ostatnio postanowiłem rozpocząć własny zewnętrzny hack, zaczynając od ESP. Dzięki użyteczne informacje w tym wątku, zrobiłem to i byłem bardzo zadowolony z testowania na lokalnym serwerze. Potem postanowiłem przetestować go na serwerze na żywo i voila, 5 FPS.   Dla przykładu, załóżmy, że nasz hack wyświetla tylko Zwierzęta i Gracze. (Zakładam, że znasz już struktury rdzy. Jeśli nie, zdecydowanie radzę przeczytać ten wątek, zanim przejdziesz dalej.   Po prostu skomentował pseudo kod tego, co robi teraz haker:     Kod:   // Zakładamy, że mamy już Game Object Manager currentObjectPointer = gameObjectManager. taggedObjects; LastObjectPointer = gameObjectManager. lastTaggedObject; GameObject gameObject; BaseObject baseObject while (currentObjectPointer! = LastObjectPointer) {// iterowanie przez listę // Poniższe pytanie jest ważne. Istnieje szansa, że lista ulegnie zmianie podczas czytania. // Jeśli tak się stanie, możesz nigdy nie osiągnąć oryginalnego lastObjectPointer // i w zależności od tego, gdzie jesteś na liście, możesz nigdy nie dostać się do nowego getGameObjectManager (); jeśli (gameObjectManager. lastTaggedObjects! = lastObjectPointer) zepsuje się; readMem (& baseObject, currentObjectPointer); // Abstrakcja do RPM. Czyta rozmiar pierwszego parametru z adresu w drugim parametrze. Zapisz wynik w pierwszym parametrze readMem (i gameObject, baseObject. Object) switch (tag gameObject.) {Case ANIMAL: storeAnimal (gameObject); // Wyodrębnienie tego, czego chcemy z obiektu i zapisanie go w łamaniu listy; case GRACZ: storePlayer (gameObject); // To samo co zwierzęce, ale z przerwą dla graczy; } currentObjectPointer = baseObject. nextObjectLink; } renderowanie (); // Nakładka D3D lub cokolwiek, co iteruje z listy graczy i zwierząt, które zrobiliśmy, i wyświetlamy je na ekranie.   (Pomijamy ostatni byt za pomocą tego kodu, ale chcę, aby przykład był prosty do odczytania). Załóżmy, że ten kod jest zapętlony oczywiście.   Z tego kodu widzimy, że renderujemy jedną ramkę po każdym przejściu do listy taggedObjects. Oczywiście, lista encji na lokalnym serwerze zawierała się w przedziale 80-120 jednostek (kilka ms do iteracji), podczas gdy na serwerze na żywo znajdowała się gdzieś pomiędzy 30k-60k (do 200ms na moim komputerze). Dlatego powtarzanie całej listy i renderowanie ramki co 200ms nie jest dopuszczalnym sposobem robienia tego.     Więc co możemy zrobić ?       Fałszywe rozwiązanie 1: Umieszczenie licznika i iteracja tylko z części listy   Nie, to jest złe. Chcemy całej listy.     Crappy solution 2: Iterowanie po całej liście raz na X sekund. W przeciwnym razie odśwież obiekty graczy i zwierząt   Nie tak źle, ale wciąż nie. Po pierwsze, będziemy otrzymywać tylko nowe obiekty co X sekund. Dodatkowo, co X sekund, będziemy nadal musieli czekać na pełną listę taggedObjects, podczas gdy nie zostanie wykonane renderowanie.     Crappy solution 3: Pieprzyć to sh * t, idę wewnętrznie   Możesz to zrobić, jeśli możesz żyć ze sobą będąc żałosnym tchórzem, który nie chce zmierzyć się z żadną trudnością Żartujesz, ale możesz osiągnąć bardzo dobrą wydajność z zewnętrznym! Nie poddawaj się, ponieważ mamy:     Rozwiązanie wyścigu mistrzowskiego: Wielowątkowość \ o /   Prawdopodobnie myślałeś o tym wcześniej (mam taką nadzieję). Ale co mamy zamiar uruchomić w którym wątku? Jak możemy to zorganizować? Tyle pytań, na które nie odpowiem tutaj.   Ok, kłamałem, będę! Przedstawię koncepcję mojego hacka, który osiąga bardzo dobre wyniki. Oczywiście, wątek jest otwarty do dyskusji Nie twierdzę, że to najlepszy sposób na zrobienie tego, tak właśnie zrobiłem. Zapraszam do udziału.   Rozsądne rozwiązanie 2 nie było takie bzdurne. W rzeczywistości zamierzamy zrównoleglić ten pomysł. Jeden wątek będzie iterować przez całą listę taggedObjects, aby jak najszybciej uzyskać nowe obiekty, podczas gdy inny wątek będzie tylko iterować przez nasze przechowywane obiekty (zwierzęta i graczy) i odświeżać je (pozycja, zdrowie ...), aby być na bieżąco informacje o wyświetlanych obiektach tak szybko, jak to możliwe.   A co z viewMatrix?   Nie wspominałem o tym wcześniej. Funkcje renderowania wymagają dostępu do viewMatrix w celu wykonania worldToScreen. No cóż, w rzeczywistości również będziemy gwintować rendering i aktualizować matrycę w tym ostatnim wątku. Czemu ? Cóż, kiedy narysujemy nasze informacje na ekranie, robimy to zgodnie z ostatnim viewMatrix, który dostaliśmy z pamięci. Jeśli nie odświeżymy tego viewMatrix wystarczająco szybko, dostaniemy ten efekt jąkania, w którym informacje "przykleją się" do ekranu po szybkim ruchu myszy. Dzieje się tak, gdy nasz viewMatrix c
Reply
#2
Zewnętrzny zawsze będzie powolny jak cholera, ponieważ musisz wywołać ReadProcessMemory dla każdego wskaźnika. Wersja TL; DR: Jeśli ludzie renderują w tym samym wątku, co ich przeczytane wątki, zasługują na śmierć.
Reply
#3
Zacytować: Originally Posted by Yazzn Zewnętrzny zawsze będzie powolny jak cholera, ponieważ musisz wywołać ReadProcessMemory dla każdego wskaźnika. Wersja TL; DR: Jeśli ludzie renderują w tym samym wątku, co ich przeczytane wątki, zasługują na śmierć. Bardzo dobry TL; DR To może być oczywiste, ale znowu nie jestem tu długo, ale widzę głównie 3 rodzaje ludzi: - Te są przyzwoite na odwrócenie, ale niezbyt dobre w koncepcji oprogramowania - Te są przyzwoite w koncepcji oprogramowania, ale niezbyt dobre w odwracaniu - Te są dobre w obu Jestem z drugiej kategorii i mam nadzieję, że ten post może pomóc lub dać wskazówki dla osób z pierwszej kategorii ^^ Zewnętrzna wola ofc zawsze będzie najwolniejsza niż Wewnętrzna z powodu wywołań RPM, jednak przy pewnym inteligentnym projekcie możemy nadal uzyskiwać wydajności, które są wystarczająco dobre, aby nie uzasadniać wewnętrznego, ponieważ "Zewnętrzny jest zbyt wolny Nie mogę zrobić porządnego włamania" Może później zmienię zdanie, ale na razie zaczynam myśleć o oprogramowaniu hakerskim, a korzystanie z niego jest łatwiejsze do obejścia AC i debugowania
Reply
#4
Stworzyłem silnik hackowy Unity. Hack wysyła prośbę o aktualizację wątku w celu przygotowania listy jednostek, wszystkich posortowanych według znaczników i warstw. Każda klatka hackowa sprawdza stan żądania, jeśli jest zakończona, przełącza ptr na kontener std :: map i voila. A także zmienione zmienne, które będą używane przez hakerów, gdy aktualizacja nie będzie jeszcze gotowa. Po chwili rozszerzyłem system na żądania konkretnych list obiektów, według nazwy obiektu. Nie mam żadnych lagów. Z czego jestem naprawdę dumny, ukończyłem klasę Structure, przyjrzyj się przyjaciołom: Kod: void Player :: setYawNPitch (rozstaw float, float yaw) {// Struktura m_base_entity; m_base_entity. buildNew (& BaseEntity :: input). setVar (& PlayerInput :: bodyAngles, D3DXVECTOR3 (wysokość, odchylenie, 0)); } Jestem całkowicie zewnętrzny. W ten sposób mam do czynienia z wskaźnikami do dereferencji, więc tylko rzeczy, które muszę zaktualizować, to klasy, które są wykonywane automatycznie przez mój wywrotka klasy.
Reply
#5
Zacytować: Originally Posted by Yazzn musisz wywołać ReadProcessMemory dla każdego wskaźnika. Właściwie nie. Możesz czytać całe struktury naraz. Oczywiście nadal musisz wywoływać RPM wiele razy, a jego partie są wolniejsze od wewnętrznych, ale nie, nie musisz wywoływać RPM dla każdego ptr, jeśli są w tej samej klasie. Niestety wiele osób nadal to robi
Reply
#6
Zacytować: Originally Posted by Yazzn musisz wywołać ReadProcessMemory dla każdego wskaźnika. chyba że chcesz przeczytać 2 występy barana.
Reply
#7
Zacytować: Napisał pierwotnie macho105 Stworzyłem silnik hackowy Unity. Hack wysyła prośbę o aktualizację wątku w celu przygotowania listy jednostek, wszystkich posortowanych według znaczników i warstw. Każda klatka hackowa sprawdza stan żądania, jeśli jest zakończona, przełącza ptr na kontener std :: map i voila. A także zmienione zmienne, które będą używane przez hakerów, gdy aktualizacja nie będzie jeszcze gotowa. Po chwili rozszerzyłem system na żądania konkretnych list obiektów, według nazwy obiektu. Nie mam żadnych lagów. Z czego jestem naprawdę dumny, ukończyłem klasę Structure, przyjrzyj się przyjaciołom: Kod: void Player :: setYawNPitch (rozstaw float, float yaw) {// Struktura m_base_entity; m_base_entity. buildNew (& BaseEntity :: input). setVar (& PlayerInput :: bodyAngles, D3DXVECTOR3 (wysokość, odchylenie, 0)); } Jestem całkowicie zewnętrzny. W ten sposób mam do czynienia z wskaźnikami do dereferencji, więc tylko rzeczy, które muszę zaktualizować, to klasy, które są wykonywane automatycznie przez mój wywrotka klasy. To bardzo interesujące, brzmi jak bardziej rozwinięta wersja tego, co próbowałem tutaj zrobić. Ciekawi mnie, co masz na myśli, mówiąc: "Hack wysyła prośbę o aktualizację wątku w celu przygotowania listy jednostek, wszystkich posortowanych według tagów i warstw".
Reply
#8
Zacytować: Napisał gnjax To bardzo interesujące, brzmi jak bardziej rozwinięta wersja tego, co próbowałem tutaj zrobić. Ciekawi mnie, co masz na myśli, mówiąc: "Hack wysyła prośbę o aktualizację wątku w celu przygotowania listy jednostek, wszystkich posortowanych według tagów i warstw". Kod: używanie GameObject_List = std :: list >; za pomocą GameObject_Map_Tag = std :: map ; używanie GameObject_Map_Layer = std :: map ; // Typy i używają std :: shared_ptr mapTag; std :: shared_ptr mapLayer; std :: shared_ptr m_worker_map; std :: shared_ptr m_worker_layer_map; // Usuage: for (auto player: Unity :: g_pUnity -> getMap () -> at (PLAYER)) {// Do cholery} Hack sprawdza status wątku roboczego, który zapełnia mapy pracowników, gdy jego parametr future_state :: zakończył się, a następnie zamienia mapy i asynchronicznie uruchamia nowy wątek, aby zniszczyć wszystkie niepotrzebne obiekty.
Reply




Users browsing this thread: 1 Guest(s)