Witamy z powrotem.
Po całej tej teorii przyjrzyjmy się teraz kilku praktycznym ćwiczeniom.
Zobaczmy, jak możemy zahaczyć i rozłożyć metodę za pierwszym razem, gdy robimy to w prosty sposób.
I nie ma absolutnie żadnego powodu, aby iść jedną trudną drogą, jeśli istnieje tak łatwa droga, jak ta
tutaj.
Więc kiedy robimy to tutaj, możesz naprawdę pomyśleć, że cię trolluję, ale nie chcę tego
zbytnio zepsuć.
Dlatego przyjrzyjmy się tej sprawie.
Dobrze.
Mamy więc z powrotem maszynę wirtualną Ubuntu, a teraz przyjrzyjmy się tej aplikacji, którą
można znaleźć jako załącznik do sekcji tutaj i która nazywa się zobaczmy.
Ale Frida wskazuje.
W porządku i zainstalujmy tę aplikację.
Przywracamy więc ekran naszego smartfona.
No i proszę.
Następnie skopiujmy tę aplikację do nowego katalogu.
Więc w ramach EPS i uwolnij końcowy rozkład.
W porządku.
Teraz otwieramy go w nowym terminalu i przeprowadzamy instalację ADB na tym terminalu.
Przyjrzyjmy się temu.
Mamy to.
Widać więc, że często bawię się różnymi kolorami w moich aplikacjach i to jest to, co naprawdę
lubię.
W porządku.
Otwórzmy ten.
I tutaj możemy zobaczyć, że tym razem naprawdę bawiłem się może trochę za dużo.
Niemniej jednak musimy patrzeć na funkcję, a nie na wygląd.
Teraz.
Mamy ten tekst tutaj.
Masz na myśli hakowanie aplikacji?
Jeśli klikniemy skrypt, zobaczymy go tutaj.
Jest to więc odszyfrowany tekst.
Ok, teraz zmieńmy ten tekst tutaj.
W tym przypadku powiedzmy, że Frieda jest niesamowita.
Naciskamy przycisk i widzimy, że odszyfrowany tekst również się zmienia.
Nieźle.
Przyjrzyjmy się tej aplikacji.
W tym momencie przeprowadzamy inżynierię wsteczną tej aplikacji.
Dlatego przechodzimy do aplikacji bezpłatnych do wskazania i otwieramy tę z wymówką cienia.
Dobrze.
Po pierwszym spojrzeniu na manifest Androida.
A ten tutaj, widzimy, że mamy pozwolenie na Internet, a następnie widzimy tylko jedną
aktywność i poza tym nic tam nie ma.
Widzimy tutaj, że mamy wargę lub wiele warg.
Mamy tu więc wiele kompatybilnych bibliotek.
Mamy obsługę 64 bitów.
Mamy 32-bitową obsługę ARM.
Mamy X 86 i 64 dla naszej maszyny wirtualnej.
Teraz jednak pracujemy nad nowym urządzeniem.
Ten tutaj to ramię, 64-bitowe.
Ta wersja, warga, natywna kreska, warga.
Jest to więc obiekt współdzielony przez bibliotekę, który jest ładowany do naszej aplikacji, gdzie domyślam się, że w ramach głównej
aktywności.
Przyjrzyjmy się temu.
Tak.
Więc mamy to.
Tutaj mamy statyczną bibliotekę ładowania systemu kontekstowego, a następnie mamy tę natywną bibliotekę.
W porządku.
Widzimy również, że mamy tutaj natywną funkcję, ciąg znaków.
Tak więc ten przyjmuje parametr i parametr łańcuchowy oraz wartość całkowitą.
Wydaje mi się, że to dokładnie ta sama funkcja.
Przeanalizowaliśmy już kod źródłowy dotyczący tej aplikacji na slajdach.
W porządku.
To oznacza ten tutaj.
To jest nasz parametr.
Zobaczmy więc, gdzie jest to wywoływane.
Tutaj i został pokryty tym paszportem i tym tutaj oraz wartością za.
Więc to są nasze drogi.
Dobrze.
Jeśli chcesz teraz zajrzeć do tej funkcji, niestety nie jest to takie proste, ponieważ jest ona zawarta
w naszej bibliotece w tej małej natywnej bibliotece.
Oznacza to, że nawet jeśli klikniesz na ten tutaj, nie jest on zdefiniowany w naszym kodzie Java.
Musielibyśmy więc odwrócić inżynierię tego tutaj.
Ale to tylko próbka.
Jest to temat, którego nie możemy teraz omówić w tym kursie.
Przygotuję kolejny kurs dla tego.
Ale na razie będziemy absolutnie w porządku, jeśli będziemy w stanie podłączyć tę funkcję, aby zobaczyć, jakie
są te wartości, te parametry, bawić się tymi wartościami, a także obserwować wartość zwracaną.
Przyjrzyjmy się, jak możemy to zrobić.
Więc umieściliśmy to po prawej stronie.
Otwieramy nasze wizyty w kodzie i projekcie tutaj.
W porządku, teraz nowy plik i zobaczmy.
Ok, więc powiedziałem ci, że jeśli chcesz hakować, obserwować metodę natywną, musimy to zrobić za pomocą przechwytywacza.
Dołącz ten tutaj i najpierw zmieńmy na JavaScript, interceptor, dot attach.
Następnie mamy nasze dwa parametry, wskaźnik funkcji natywnej
i nasze wywołania zwrotne.
Ups, jest jakiś problem.
Nieważne.
Tak.
Kopia ekranu.
Rozłączenie.
Ale teraz możemy o tym zapomnieć.
Może.
Umieśćmy to po lewej stronie.
Dobrze.
W ten sposób możemy podpiąć natywne funkcje, ale jest to trudny sposób.
Więc to jest trudny sposób, teraz jest pytanie, jaki jest łatwy sposób?
Cóż, jeśli przyjrzymy się temu, możemy po prostu podłączyć funkcję Java.
W tej aplikacji nie ma więc absolutnie żadnego powodu, aby podpinać tutaj natywną funkcję.
Funkcja natywna jest definiowana w tej bibliotece i to, co musimy zrobić, to uzyskać adres tej funkcji, następnie
musimy dostarczyć nasze wywołania zwrotne, a następnie możemy obserwować parametry i wartości zwracane.
Zrobimy to w następnym filmie, ale tutaj jest to absolutnie wystarczające, jeśli po prostu podpinasz
funkcję Java.
To znaczy, to jest dokładnie to samo.
Wywołujemy tę funkcję po stronie Java.
Przechodzimy do strony C++, a następnie cofamy się.
W zupełności wystarczy podpiąć tylko stronę Java.
A teraz możesz zadać sobie pytanie: Dlaczego w ogóle się tego uczymy?
Dlaczego uczymy się hakowania funkcji natywnych za pomocą intercept attach?
Powodem tego jest to, że nie wszystkie funkcje, które chcemy zahaczyć, są zdefiniowane w słowie Java.
Na przykład, załóżmy, że mamy funkcję napisaną tylko w C C++ i ta funkcja wykonuje pewne rzeczy
w tej bibliotece, ale nigdy jej nie opuszcza.
Oznacza to również, że nie musimy definiować funkcji w naszym kodzie Java w prototypie dla tej
funkcji.
A to oznacza, że nie możemy tego zahaczyć w naszym świecie Java.
No dobra, może nie, ale o tym przekonamy się w kolejnych odcinkach.
Jeśli mamy do czynienia z natywną funkcją, która ma jakiś prototyp w świecie Javy, idziemy na
łatwiznę, a łatwizna to sposób, który już znamy.
Więc pozbądźmy się tego.
Odejdź.
Chcemy mieć łatwy sposób.
Dobrze.
Co musimy zrobić?
Chodzi mi o to, że jest to po prostu metoda klasy, więc pobierzmy referencję do klasy.
Zdefiniujmy nową implementację dla tego, a następnie zobaczmy, jakie są parametry, jaka jest wartość
zwracana?
I pobawmy się z tym.
W porządku.
Niesamowite.
Zróbmy to.
Wracamy więc do wydajności.
Mamy już naszą anonimową funkcję i teraz musimy pobrać referencję do klasy głównej aktywności.
Tak więc główna aktywność w użyciu Java.
Nazwa pakietu dodająca A, która nie została skopiowana i pobierająca klasę.
W porządku.
Teraz mamy odniesienie do tej klasy.
Metoda ta została zdefiniowana w tej klasie i dlatego możemy teraz również uzyskać do niej dostęp.
Używamy więc tej głównej aktywności, a następnie tej nazwy metody i chcemy zdefiniować nową implementację.
Zapewniamy tę anonimową funkcję.
Mamy parametr pierwszy, mamy parametr do whoops.
A teraz chcemy je po prostu wydrukować.
Param jeden jest równy.
Pozwolę sobie umieścić to po prawej stronie.
Parametr pierwszy i parametr drugi są równe.
Parametr drugi Teraz możemy również sprawdzić wartość zwracaną.
Tak więc nasza wartość zwracana znajduje się w tym.
Może wrzućmy to do zmiennej.
Zobaczmy, musimy pobrać ten obiekt z oryginału.
Musimy więc wywołać oryginalną metodę.
Dlatego ta myśl odszyfrowuje ciąg znaków.
Następnie musimy podać nasze dwa parametry.
A teraz mamy tutaj naszą wartość zwracaną.
Ups, to nie jest nawias.
Dobrze.
Teraz możemy również wydrukować wartość zwracaną.
Teraz możemy również zwrócić wartość zwracaną.
W porządku.
A teraz zrobiliśmy wszystko, aby to wydrukować.
Drukujemy więc te dwa parametry tej funkcji.
Następnie pobieramy oryginalną wartość zwracaną do zmiennej, którą możemy wydrukować, a także możemy zwrócić
oryginalną wartość, która była tutaj, która została zwrócona z tej metody tutaj, oryginalnej
metody.
W porządku.
Ok, zobaczmy.
Odzyskujemy ekran naszego smartfona.
Mamy to.
Następnie musimy uruchomić dane naszego serwera Frida, lokalny temp.
Frida W porządku, to działa w tle.
Następnie musimy dołączyć do tego procesu bezpłatną emisję danych.
Możemy znaleźć ten identyfikator pakietu w manifeście Androida.
Cóż, wciąż mamy to tutaj.
Zobaczmy.
Nazywasz je dziobaniem i rozkładem, Frieda.
W porządku.
Hakowanie aplikacji Com i wolność rozkładu.
Teraz jesteśmy przywiązani.
Zastosujmy nasz skrypt.
I po prostu podepnijmy ten tutaj.
Zobaczmy.
Robię to trochę większe.
To chyba dobrze.
A teraz klikam surowe 3 do 1.
Proszę bardzo.
Mamy ładunek pierwszy.
To jest nasz tekst.
W porządku.
To jest tekst, który jest dostarczany tutaj.
To także nasz ładunek.
To jest wartość całkowita, a to jest zwracany tekst.
Doskonale.
Zahaczyliśmy o funkcję antyk w wolności.
Dobra, ten.
To znaczy, jest to łatwy sposób, ponieważ mamy tutaj prototyp i definicję funkcji w naszym świecie
Java.
Wtedy mamy łatwy dostęp.
I proszę, jeśli masz tak łatwy dostęp, nie ma absolutnie żadnego powodu, aby iść na trudną drogę
do tego.
W porządku.
Jedynym powodem, aby przejść tę trudną drogę, jest napinanie się w jakimś raporcie.
Jeśli więc dostarczasz raport klientowi, możesz chcieć się tam wyginać i pokazać wszystkie swoje umiejętności,
które masz teraz.
Ale jeśli robisz to w ramach inżynierii wstecznej lub testowania aplikacji, nie ma absolutnie żadnego
powodu, aby to robić.
W porządku.
Dobrze.
Teraz pomanipulujmy trochę tymi wartościami.
Zobaczmy więc.
Chodzi mi o to, że ten tutaj jest okrągły.
Może ustawmy tę liczbę na jeden.
Zobaczmy, co stanie się z danymi wyjściowymi.
Ten jest teraz dla mnie trochę irytujący.
Dlatego przenieśmy to do skryptu, a następnie po prostu zapisujemy ten i aktualizujemy nasz darmowy
do instancji.
Więc zapisujemy to.
W aplikacjach i swobodnie wskazywać
zginanie na natywnych metodach.
Tak.
W porządku.
A teraz zamknijmy ten tutaj i załadujmy go skryptem.
W aplikacjach mogę swobodnie wskazywać elastyczne metody natywne.
W porządku, teraz przywróćmy ekran naszego smartfona, który ponownie zniknął.
Ten jest trochę trudny do wyciągnięcia.
Dobrze.
Mamy to.
W porządku.
Teraz tylko trochę.
Dobrze.
Więc mamy to z powrotem.
Zobaczmy.
Realizujemy scenariusz.
Aha, a ten tutaj się zmienił.
Tak więc ilość rund wydaje się wpływać na naszą wydajność.
I czy mamy poczucie, w jaki sposób to wpływa?
Chodzi mi o to, że coś jest rozpoznawalne.
Jeśli więc spojrzymy na te dwie spacje, zobaczymy, że są one teraz reprezentowane przez
ten wykrzyknik.
Może się to również zdarzyć w przypadku innych liter.
Zobaczmy.
Przynajmniej ja nic nie widzę.
W porządku.
Możemy teraz przeprowadzić pewnego rodzaju analizę.
I na przykład, możemy umieścić to trochę niżej.
Następnie możemy przeprosić i zmienić 1 na 2.
Niech to pozostanie na pierwszym planie.
Zapisujemy to i ponownie trafiamy w crop.
Ok, więc znowu trochę się zmienia.
Dlatego mamy teraz te dwie postacie trzy zapisane.
Batten Po raz kolejny wydaje się, że istnieje pewien wzorzec.
Zobaczmy.
Pewna wartość ujemna.
W porządku.
Prawidłowo.
Po raz kolejny mamy kilka niedrukowalnych znaków ASCII.
Ok, podajmy liczbę zero.
Co?
Ograniczyliśmy naszą produkcję.
Jest to jeden z najbardziej podstawowych przykładów kryptograficznych, jakie można znaleźć.
To jest klucz szyfrujący.
Jeśli masz stałą wartość, na przykład liczbę 13, może ona być również znana jako rot 13.
Jest to więc tylko notacja oparta na liczbie rund, które tutaj podajemy.
Na przykład, liczba 13 obróci każdy znak w naszej literze o 13 wartości.
Na przykład, A staje się, zobaczmy, nie jestem pewien, rot 13.
Zróbmy tylko wielką literę A.
Cóż, muszę to zapisać.
Dobrze.
Teraz możemy to zrobić.
Staje się i tak dalej.
Zróbmy to w ten sposób.
Tak.
I tak oto mamy to.
W porządku.
To wszystko, jeśli chodzi o ten film.
Widzieliśmy, że jeśli mamy definicję funkcji w naszym kodzie Java tutaj, to możemy łatwo podłączyć tę
metodę, nawet jeśli jest to SDK w naszym świecie Java.
Absolutnie łatwe, ale mimo to wykonamy również podejście K w następnej sekcji.
Powodem tego jest to, że musimy być zaznajomieni z tym również na przykładzie szkoleniowym, takim jak ten
tutaj, aby zagłębić się w ten temat, ponieważ po tym, co robimy, niektóre złożone hakowanie, hakujemy natywne funkcje,
które są zdefiniowane tylko w tej natywnej bibliotece.
Nie mają więc zewnętrznego dostępu tutaj, w naszym świecie Java.
A to oznaczałoby, że nie jesteśmy w stanie ich łatwo zaczepić, tak jak widzieliśmy to tutaj.
Więc jeśli ta funkcja została zdefiniowana tylko w tej natywnej bibliotece, to nie mamy tutaj tego podejścia Java
i musimy być zaznajomieni z tym, jak to zrobić, ponieważ wtedy możemy również rozwiązać naprawdę złożone
wyzwania w ciągu zaledwie kilku minut.
W porządku.
Dobrze.
Z niecierpliwością czekam więc na kolejny odcinek, w którym porozmawiamy o trudnej drodze.
Do zobaczenia.