Witamy z powrotem.
Widzieliśmy, że radzenie sobie z antycznymi metodami nie jest takie proste, ale też nie musimy tego robić.
Zawsze istnieje to proste podejście, polegające na zaczepieniu metody po stronie kierowcy.
Wówczas mamy łatwy dostęp do parametrów, a także wartości zwracanej.
Niemniej jednak, zakończmy to ćwiczenie tutaj.
Przyjrzyjmy się, jak moglibyśmy manipulować tymi parametrami, a także wartością zwracaną.
Potraktuj to jako swego rodzaju przygotowanie do naszego ostatniego wyzwania.
Ostatnie wyzwanie będzie dotyczyło funkcji lub metody, która jest dostępna tylko w języku C++.
Nie mamy więc dostępu do naszego kodu Java, a także nie możemy wpływać na parametry lub wartości zwracane.
Niestety, to wyzwanie po raz kolejny będzie nieco inne od tego, co widzimy
tutaj.
Po przejściu tego tutaj nie będzie to już takie trudne.
Przyjrzyjmy się zatem temu zagadnieniu.
Wracamy więc do naszej maszyny wirtualnej Ubuntu.
Najpierw uruchommy nasz serwer Freedom.
W ten sposób nawiązujemy połączenie z naszym urządzeniem.
Otrzymujemy uprawnienia roota, a następnie w ramach danych, lokalnego temp, uruchamiamy serwer.
W porządku.
Wróćmy teraz do ekranu smartfona.
No i proszę.
I wciąż rozmawiamy o tej aplikacji.
Który?
Ten, Alfreda, wskazuje.
Dobrze.
Gdybyśmy przycięli.
Tak, wciąż działa.
Wszystko zostało już skonfigurowane.
Dobrze.
W ostatnim filmie wykonaliśmy następujące czynności.
Wciąż mam go otwartego tutaj.
Tak, mamy to.
Umieściliśmy więc te parametry po stronie indeksu.
To są nasze argumenty i widzieliśmy, jak możemy je wykorzystać.
Musimy utworzyć nowy ciąg znaków, a następnie możemy go rzutować.
Ten argument to string i w odniesieniu do naszej wartości całkowitej, musimy użyć funkcji, aby wprowadzić
32.
W porządku.
Widzę, że teraz nie zrobiliśmy tego dla wartości zwracanej, więc może zróbmy to tutaj naprawdę szybko.
Sprawdźmy, czy ten skrypt działa tutaj.
Więc kopiuję to, a następnie używamy darmowych danych, ponieważ przychodzisz ab hacking i rozkładasz darmowe dane.
Tak.
Teraz dołączamy do tego procesu.
Powiększyłem to trochę i umieściłem po lewej stronie.
Ok, więc teraz zobaczmy, wklejam to i jeśli klikniemy crypt.
Tak.
Następnie widzimy, że to jest nasz tekst, to jest nasz parametr, to jest liczba rund.
I tutaj mamy tę dziwną wartość hex 75 W porządku.
Jeśli chcemy również wypisać wartość zwracaną jako ciąg znaków, musimy zrobić dokładnie to samo.
Wróćmy do scenariusza.
Dobrze.
Musimy więc skomentować to tutaj.
Otrzymuję odwołanie do klasy string, a następnie musimy.
Musimy go typować.
Prawo do sznurka.
Dobrze.
Zobaczmy więc.
Najpierw pobierzmy ten ciąg znaków.
Przenieśmy tutaj odniesienie do klasy string.
Tak więc klasa string ref.
Można to zrobić za pomocą kropki.
Jest to klasa, której chcemy później użyć do rzutowania typu.
Więc java lang string.
Brakuje średnika i teraz musimy go wpisać.
Musimy więc utworzyć nową instancję, ciąg w lub nazwijmy to czerwoną instancją lub instancją wartości zwracanej.
A teraz musimy użyć rzutowania Java.
Następnie mamy nasz punkt, który jest czerwony i chcemy go typecastować do tej klasy string ref.
W porządku.
A teraz możemy użyć tego tutaj.
To powinno działać.
Zobaczmy.
Kopiuję to i wracam do tego.
Przekonaliśmy się również, że nie jest dobrym pomysłem nadpisywanie skryptów dołączanych za pomocą Intercept.
Tak więc skrypty korzystające z interceptora dołączają.
Jeśli będziesz je nadpisywać, skończysz w bałaganie.
W związku z tym zamykamy to i używamy bezpłatnie, aby uruchomić tę aplikację i nie chcemy wznawiać
jej automatycznie.
Przepraszamy, nie chcemy wznawiać ręcznie.
Dlatego robimy to automatycznie bez pauzy.
W porządku, zróbmy to.
Teraz go wkleję i zobaczymy.
Tak.
Doskonale.
I tak oto możemy zobaczyć.
W porządku.
A to jest nasza wartość zwracana, zwracany ciąg znaków.
Nieźle.
Spójrzmy wstecz.
Dobrze.
To jest teraz nasz ostateczny skrypt.
Zapisuję to.
Następną rzeczą, którą chcemy zrobić, jest manipulowanie tymi wartościami.
I, na przykład, ten argument tutaj lub, powiedzmy, ta wartość całkowita tutaj, a może także
wartość zwracana.
Dlatego też zaczynamy od nowego scenariusza.
Chodzi mi o to, że zmodyfikowanie tego byłoby bardzo wygodne w tej chwili, ale nie mamy zbyt dużej praktyki,
jeśli chodzi o nasze przechwytywanie do dołączenia.
W związku z tym chciałbym, aby nadal ćwiczył.
Jest to więc powód, dla którego chciałbym rozpocząć nowy skrypt.
Ponieważ wtedy możemy również podsumować wszystko, co powinniśmy wiedzieć o tej grze.
Przejdźmy do JavaScript.
W porządku.
Tym razem robimy to nieco szybciej niż ostatnio.
Zobaczmy więc.
Chcemy podłączyć metodę i ciąg skryptu, a ten ma jakiś ciąg PV, przepraszam, p w i liczbę całkowitą root,
a to znajduje się w natywnej kresce świetlnej.
Pierwszym krokiem jest więc uzyskanie adresu tej funkcji, co można zrobić za pomocą modułu enumerate x
ports, a następnie potrzebujemy, aby nasz interceptor nie dołączał się do tego adresu.
I tutaj mamy nasze oddzwanianie.
W porządku, zróbmy to.
Podnieśmy nasz darmowy terminal tutaj.
Dobra, zróbmy to na darmowym terminalu.
A jeśli tam działa, to kopiujemy i wklejamy polecenie po lewej stronie.
Tak więc moduł dot wylicza eksporty.
Wymień produkty eksportowe.
Mamy to.
A ten ma pewien parametr, który jest nazwą biblioteki.
Szukamy tych produktów eksportowych.
To jest natywna kreska.
Pobierzmy więc tę nazwę z wyjścia handlowego, więc dokonaliśmy inżynierii wstecznej tej aplikacji i zobaczyliśmy,
że znajduje się ona w katalogu lib.
W tym katalogu lib mamy tę bibliotekę.
Zobaczmy, czy to zadziała.
Tak.
Doskonale.
Oto nasza metoda.
Kopiujemy to.
A potem zobaczmy.
Dobrze.
To jest część pierwsza.
Ten tutaj zwraca błąd.
Musimy więc utworzyć nową tablicę.
To jest nasza tablica funkcji eksportu.
A teraz musimy znaleźć.
Zobaczmy adres.
A to jest powrót ups.
Dobrze.
Więc jeśli używamy tego, to mamy tę tablicę funkcji eksportu i tutaj mamy na przykład element
zero, a następnie możemy uzyskać dostęp do adresu lub nazwy za pośrednictwem tego pola.
Więc to jest nasz pierwszy wpis, nazwa.
Dobrze.
To co musimy zrobić, to iterować po tej tablicy i tej tutaj, możemy to zrobić
z jednym dla każdego, zapewniając anonimową funkcję i mamy element tutaj.
A teraz, jeśli nazwa kropki elementu jest pisana małymi literami.
Więc ten tutaj jest teraz naszym elementem i możemy uzyskać dostęp do tej nazwy.
Tak.
W ten sposób.
Tutaj.
OC, jeśli element nazwy i w JavaScript nie zawiera, to zawiera, jak sądzę.
Tak.
Tak więc naprawdę mam trudności z zapamiętaniem tego tutaj.
Więc tak, jeśli chcesz wyszukać i dołączyć ciąg znaków w naszej nazwie, musisz użyć includes.
Szukamy więc odszyfrowania ciągu znaków.
Jeśli tak jest, chcemy to wydrukować, więc chcemy mieć konsolę. log.
Następnie mamy nazwę elementu równą nazwie elementu.
I tutaj drukujemy równe adresy elementów.
Ups.
Przepraszam.
Co się dzieje?
Postawmy nas po prawej stronie jak równych sobie.
Element adresu.
Zobaczmy, czy to zadziała.
Nie dlatego, że zrobiłem literówkę.
Tak.
Element.
Dlatego lubię pisać moje skrypty po prawej stronie, a następnie uwalniać terminal i stosować go po lewej stronie
do odczytu skryptu.
Mamy też podświetlanie składni i tego typu rzeczy.
Dobrze.
Wygląda na to, że działa.
Ale fakt, że twoje imię jest inne.
Och, to ciąg deszyfrujący.
Przepraszam.
Mam nadzieję, że jesteś gotowy do pracy.
Tak.
Dobrze.
Proszę bardzo.
Oto adres naszego elementu.
Nieźle.
Teraz możemy utworzyć nową zmienną.
Jaka jest funkcja odszyfrowywania adresu ciągu.
A teraz przypisujemy ten tutaj.
Element adresu.
Teraz możemy użyć tego w naszym interceptorze dot attach.
Więc interceptor
dot attach.
Tak.
Wygląda dobrze.
Oto nasz adres łańcucha deszyfrującego, a tutaj mamy nasze wywołania zwrotne.
Umieszczam kursor myszy po prawej stronie i nieco go powiększam.
Książka.
Tak więc wywołania zwrotne wystarczy kliknąć dwukrotnie, a następnie nawiasy klamrowe i enter.
Pierwszy jest na wejściu.
Anonimowa funkcja, którą mamy tutaj naszą siekierę.
To jest tablica.
I oto mamy naszą funkcję urlopową.
Mamy również wartość zwracaną i to wszystko.
Może to tylko niektóre stwierdzenia Deepaka.
Znajdujemy się teraz w funkcji crypt string ET.
I tutaj drukujemy piasek, a teraz wychodzimy i odszyfrowujemy funkcję string.
Cóż, bez średników.
Zobaczmy, czy to zadziała.
Więc kopiujemy, wklejamy to wszystko.
I tak, wspomniałem o nadpisywaniu go po raz kolejny i nie jest to dobry pomysł.
Ale tak, jeśli to się nie powiedzie, uruchomimy tę aplikację ponownie.
W przeciwnym razie pozostańmy na razie przy tym.
Więc zobaczmy, wciskamy przycisk skryptu i tak, mamy kilka danych wyjściowych.
Tak, widzimy, że nie jest to dobry pomysł, ponieważ dotyczą one naszego pierwszego podejścia do skryptu.
W porządku.
Umieściłem to po lewej stronie, a to po prawej, a następnie ponownie uruchamiamy tę aplikację.
Dobrze.
A teraz skopiujmy i wklejmy ten jeden raz.
Jeszcze raz wciskamy skrypt i gotowe.
Jesteśmy teraz w ciągu skryptów.
I ten.
Tak.
Domyślam się, że angielski lub gramatyka nie są tak dobre.
Dobrze.
Teraz jesteśmy gotowi do pracy.
Ok, więc mamy teraz skrypt i w ten sposób możemy wskazać funkcję.
W tym momencie chciałbym nadal ćwiczyć to podejście, ponieważ wszystkie te kroki zasadniczo mówią,
że musimy zidentyfikować adres.
Możemy to zrobić za pomocą modułu enumerate spots, a następnie musimy dołączyć do niego i zdefiniować nasze dwa wywołania
zwrotne.
Nie mieliśmy zbyt wiele praktyki w odniesieniu do tego tutaj.
Dlatego to powtarzam.
W porządku.
Dobrze.
Teraz jednak chcemy je zmodyfikować.
Zobaczmy więc nasze x.
Gdzie je mamy?
Oto one.
Więc ten ax jest tablicą, a naszym pierwszym parametrem jest nasz ciąg pv p w przepraszam.
A ten jest ax two, ponieważ nasze zero odnosi się do wskaźnika funkcji środowiskowej chain II
i ax one.
Tak więc drugi parametr w naszej funkcji wskaźnika odnosi się do tego obiektu,
a zatem nasz pierwszy parametr tutaj i ten tutaj, ciąg p w rozpocznie się od osi drugiej, a to oznacza, że nasza liczba
całkowita zaokrągli się i zaokrągli się do osi trzeciej.
Ok, fajnie.
Teraz, jeśli chcesz zmodyfikować wartość całkowitą, zacznijmy od tego tutaj, ponieważ jest
to o wiele łatwiejsze niż inne.
Następnie musimy zastąpić ten argument.
Tak więc w naszym podejściu Java po prostu wzięliśmy te parametry, a następnie wywołaliśmy oryginalną metodę
z naszymi zmodyfikowanymi wersjami.
Ale tutaj nie jest to możliwe.
Więc tutaj musimy zrobić to inaczej.
Musimy pobrać wskaźnik do tego argumentu i tego tutaj, a następnie musimy go nadpisać.
Oznacza to, że pobieramy AX trzy, która jest naszą wartością całkowitą, wartością całkowitą zaokrąglenia, a następnie możemy spróbować
przypisać nową wartość.
Powiedzmy dwa, to może nie zadziałać, ale później zobaczymy, jak to działa.
Zobaczmy więc, co drukuje Frieda.
Ok, uruchommy to ponownie.
Wkładamy go i naciskamy przycisk.
Tak, spodziewaliśmy się wskaźnika i ma to absolutny sens.
Jeśli się cofniemy, zobaczymy ten tutaj.
Jest to wskaźnik do argumentu w tej chwili, a my nadpisujemy ten wskaźnik wartością estetyczną i nie ma to absolutnie
żadnego sensu.
Więc to, co musimy tutaj podać, to wskaźnik do tej wartości do, a dźwięki są teraz absolutnie
złożone, ale nie są darmowe.
To absolutnie niesamowite.
I również autor pomyślał o tym problemie.
Dlatego utworzenie nowego wskaźnika i przypisanie go tutaj może być zbyt skomplikowane.
Dlatego autor wspomniał o tym i udostępnił nam funkcję, która wykonuje cały sklep.
Ładnie, prawda?
Możemy więc znaleźć te informacje w oficjalnej dokumentacji.
Przyjrzyjmy się zatem tej sprawie.
Tak więc mamy tutaj oficjalną dokumentację i darmowe Daktari, a w API JavaScript Doc możemy szukać
funkcji.
Peter A to jest ochrona pamięci.
Wydaje mi się, że jesteśmy w temacie iOS.
Zobaczmy.
Tak.
Dokładnie.
Nieźle.
Wykorzystaliśmy go już w naszym podejściu do prognozowania podróży.
Dobrze.
Tak więc ta funkcja zapewnia wskaźnik dotyczący wartości, którą podajemy tutaj.
Zobaczmy więc.
Jeśli oczekujesz punktu tutaj, wszystko, co musimy zrobić, to podać ten wskaźnik funkcji, a ten
pobierze naszą wartość i utworzy z niej punkt.
Nieźle.
Możemy to zamknąć i sprawdzić, czy to działa.
Więc skopiowałem to.
Ponownie uruchamiamy aplikację i zobaczmy, wciskam skrypt.
Tak, widzimy.
Wygląda na to, że działa, ponieważ ten tutaj jest teraz w innym wyjściu.
Zobaczmy.
Ok, więc podajmy tam wartość zero.
Wracamy więc, ponownie uruchamiamy aplikację, wciskamy skrypt i gotowe.
Mamy więc ponownie nasz tekst, co oznacza, że nie podajemy tego okrągłego parametru lub podajemy
go, ale tym razem z wartością zero.
Dlatego nie zakodujemy naszego tekstu.
Niesamowite.
W ten sposób możemy podłączyć lub zmodyfikować wartość całkowitą.
Ładnie, prawda?
Absolutnie.
Spójrzmy na ciąg znaków w tym miejscu.
Nie ten.
Przepraszam, ten.
Zobaczmy więc, jak możemy podłączyć ten ciąg znaków.
Jest to niestety nieco bardziej skomplikowane, ale pokażę ci podejście, które w większości przypadków
powinno działać.
Powinniśmy również pamiętać, że hakujemy i rozkładamy funkcję w funkcji, która ma interfejs
do naszego świata Java i jest to bardzo ważne.
Zobaczmy więc.
A to jest zaokrąglenie naszej wartości całkowitej i teraz ax to.
Równa się punkt.
Moglibyśmy spróbować czegoś takiego i zobaczyć, czy to zadziała.
Więc kopiujemy to.
Wychodzimy.
I zobaczmy.
Nie spodziewałem się wskaźnika.
Więc zapewniamy tutaj punkt, prawda?
Tak.
Ale niestety nie działa to w ten sposób.
I dla wartości całkowitych lub takich rzeczy.
Tak, ale nie w odniesieniu do strun.
Dobrze.
Jeśli więc chcesz zmodyfikować ciąg w Akcie drugim, to podejście to nie zadziała.
Nie możemy więc po prostu użyć tekstu i zrobić z niego wskaźnika.
Musimy utworzyć nowy ciąg znaków, ale nie w ciągu Java.
Tak więc w Javie String również nie działa tutaj.
Sprężyna, którą musimy utworzyć, jest ciągiem UTF i możemy to zrobić za pomocą środowiska Java.
Więc jeśli wrócisz do naszego wolnego wyznacznika.
Ale mamy to.
A ten tutaj.
Uruchommy ponownie tę aplikację.
Ok, więc mamy coś, co nazywa się Java VM.
I ten i ten ma metodę get environment.
Metoda ta ma wiele przydatnych funkcji.
Możemy to znaleźć tutaj, w darmowym kodzie źródłowym.
Tak więc w ramach Free to Java Bridge możemy teraz zobaczyć wszystkie te funkcje, które mamy tutaj.
Jednym z nich jest nowy ciąg UTF.
W ten sposób tworzony jest nowy ciąg UTF, który może zostać przypisany do naszych argumentów.
To znaczy, musimy to wiedzieć.
To nie jest coś, co możemy podsumować tutaj.
Musimy po prostu już o tym wiedzieć.
Dobrze.
Teraz to wiemy i możemy to wykorzystać.
Więc może wróćmy tutaj.
Czy jest to również wspomniane w dokumentacji?
Niestety nie.
Ale może dostaniemy inv.
Tak.
Widzimy więc tutaj obiekt z następującymi metodami i otrzymujemy wrapper dla bieżących zagrożeń w
środowisku chain II.
Tak więc nasze środowisko łańcuchowe, to jest nasz pierwszy lub pierwszy parametr, a ten ma kilka
wskaźników do wszystkich tych funkcji, a jedną z nich jest nowy ciąg UTF, który może być użyty do utworzenia
nowego ciągu UTF, który jest zgodny z tym tutaj do tego argumentu w tym.
Jak już wspomniano, jest to po prostu coś, co musimy już wiedzieć.
Dobrze.
Zobaczmy więc.
Jeśli chcemy utworzyć nowy ciąg znaków, którego możemy teraz użyć w java dot vm, to pobieramy E i v.
Zobaczmy, myślę, że to E to kapitał.
Tak.
Tak więc E jest kapitałem, a następnie możemy uzyskać dostęp do tej funkcji.
Przegląd wszystkich tych funkcji znajduje się tutaj.
Tak więc w ramach Free Java Bridge i jednym z nich jest nowy ciąg UTF.
Nowy ciąg UTF.
I dostarczamy tutaj teraz nowy ciąg znaków nadpisujący argument.
Dobrze.
Zobaczmy, czy to zadziała.
Więc skopiujmy to.
Zamykamy ten tutaj.
Uruchamiamy go ponownie.
Miejmy to również na pierwszym planie.
Nieźle.
W tej chwili nie mamy błędu, ale być może otrzymamy go, jeśli naciśniemy przycisk crib.
Zobaczmy więc.
Uderzamy w to na trzy i dwa jeden.
Niezłe nadpisywanie argumentów.
Więc to działa.
Doskonale.
Widzimy tutaj, to jest nasz argument, który przedstawiliśmy.
A tutaj wciąż mamy nasz tekst.
Więc ten wchodzi do naszej funkcji, ale nadpisujemy go tutaj.
Niesamowite.
Więc to działa dobrze.
W ten sposób możemy modyfikować i rozkładać funkcje dotyczące dwóch ciągów znaków i wartości całkowitych.
Dobrze.
Ok, więc spójrzmy na wartość zwracaną, jeśli to również działa.
Wracamy.
Dobrze.
Więc jeśli skopiujemy ten tutaj, zobaczmy.
Prawo jak równy z równym.
Ten?
Tak.
Napiszmy to jeszcze raz.
Może nadpisanie zwrotu wartości.
W porządku.
Zobaczmy, czy to zadziała.
Skopiujemy to i ponownie uruchomimy aplikację.
Wklejamy go i wciskamy skrypt.
Nadpisując argument, wygląda na to, że wartość zwracana nie została zastąpiona.
To trochę niefortunne, ale mamy też rozwiązanie tego problemu.
Jeśli więc wrócimy do dokumentacji.
W porządku.
A jeśli tego szukasz, wymień.
A potem zobaczmy.
Tak.
Widzimy więc tutaj w funkcji wywołania zwrotnego po wyjściu jeden argument, który jest natywnym wskaźnikiem.
Zawierając zerową wartość zwracaną, można wywołać red will replace, aby zastąpić wartość zwracaną liczbą całkowitą.
W porządku.
Dlatego musimy użyć tej funkcji tutaj, tej funkcji replace po naszej prawej stronie.
Cóż, możemy to również znaleźć w pętlach.
Możemy to również znaleźć w dokumentacji tutaj.
Widzimy, że nie jest tak w przypadku naszego wejścia.
Znajduje się tylko w wartości zwracanej.
Dlatego, jak już wielokrotnie wspomniano, ta dokumentacja jest skarbem.
Przyjrzyj się temu i tak, przeczytaj to wszystko.
W porządku.
Dobrze.
Cofnijmy się więc.
To nie działa.
Ale ten tutaj wygląda bardzo, bardzo niechlujnie.
Właściwie to brudny.
Można by to jednak nazwać.
Niemniej jednak, zróbmy to.
Ponownie uruchamiamy więc tę aplikację.
Wstawiamy ten, wciskamy przycisk skryptu i zobaczymy.
I 3 do 1.
No i proszę.
Niesamowite.
W ten sposób możemy zmodyfikować wartość zwracaną.
Nieźle.
Wygląda to na skomplikowane.
Jeśli więc się cofniemy, musimy wspomnieć o wielu rzeczach.
A ten tutaj można po prostu nadpisać znakiem równości.
Tak więc przypisanie nowej wartości, ta tutaj musi zostać zastąpiona funkcją replace.
Przepraszam za tę część, naprawdę tego nie lubię.
Więc zwróć wartość jako równą.
Ujmijmy to tak.
Wyciągnijmy to.
Dobrze.
To jest o wiele lepsze.
Ta funkcja musi więc zostać zastąpiona funkcją replace.
Ale podejście jest takie samo.
Tutaj otrzymujemy nasz punkt środowiskowy.
Używamy nowej funkcji string UTF, aby utworzyć ciąg zgodny z tym tutaj, tym zwrotem lub tym argumentem,
a następnie możemy pobawić się tym.
Dobrze.
Jeśli chodzi o skrypt, załączyłem kilka komentarzy, które są o wiele łatwiejsze do naśladowania i w ten
sposób możemy hakować i modyfikować funkcje i K.
Jeśli więc chcemy zmodyfikować argument dotyczący ciągu znaków, musimy użyć wskaźnika środowiska do pobrania
i funkcji.
Na przykład ta nowa funkcja string UTF, która może utworzyć ciąg zgodny z naszym argumentem, to samo dla wartości
zwracanej, ale wtedy musimy użyć naszego wywołania metody replace.
Jest to więc coś, co po prostu musimy wiedzieć.
Nie da się tego obejść.
Nie możemy wyciągać z tego wniosków, aby dojść do tego punktu.
W porządku.
Dobrze.
To wszystko, jeśli chodzi o ten film.
W następnym filmie przyjrzymy się funkcji play C C++.
Nie mamy więc dostępu do tych parametrów i wartości zwracanej, a mimo to będziemy w stanie dowiedzieć
się, jak podłączyć tam określone metody.
W porządku.
Dobrze.
Więc naprawdę nie mogę się doczekać, aby cię tam zobaczyć.