Niedawno natknąłem się na tę aplikację Kup aplikacje , która w jakiś sposób jest w stanie odzyskać aplikacje, za które zapłaciłem w Google Play po zalogowaniu się przy użyciu konta Google.
Próbuję dowiedzieć się, jak to się robi, ponieważ chcę zbudować podobną aplikację, ale dla bezpłatnych aplikacji, które zostały pobrane.
Nie mogę jednak znaleźć zakresu interfejsu API OAuth, który został użyty do pobrania tych informacji, nawet po przejrzeniu całej listy interfejsów API .
EDYCJA: Stawiam nową nagrodę za to pytanie, jak sugeruje podobne pytanie, o które tutaj zadałem , a ponieważ tu i tam nie widzę prawdziwej odpowiedzi, jak to zrobić i co można zrobić z tym.
Chciałbym zawęzić pytania do kilku części:
Jaki interfejs API można wykorzystać do uzyskania informacji o zakupionych aplikacjach? Gdzie mogę o tym poczytać? Pokaż pełny, działający przykład, jak to zrobić.
Czy może więcej? Może przeprowadzić wyszukiwanie? Może pokazać darmowe aplikacje, które zostały zainstalowane? Może kiedy zostały zainstalowane i odinstalowane? A kategorie tych aplikacji?
Czy są jakieś specjalne wymagania dotyczące korzystania z tego interfejsu API?
EDYCJA: Stawiam za to maksymalną nagrodę, ponieważ bez względu na to, ile przeczytałem i próbowałem, nadal nie udało mi się utworzyć POC, który może wysyłać zapytania do aplikacji ze Sklepu Play, które użytkownik kiedykolwiek pobrał (nazwa, pakiet nazwa, data zainstalowania i / lub usunięcia, adres URL ikony, cena ...), w tym zarówno płatne, jak i bezpłatne aplikacje.
Jeśli ktoś znajdzie działającą próbkę, pokaż, jak to się robi, a także pokaż, w jaki sposób ją znalazłeś (dokumentacja lub cokolwiek, co doprowadziło Cię do rozwiązania). Nie mogę go nigdzie znaleźć, a obecne rozwiązania są dla mnie zbyt niejasne, aby zacząć od nich.
Purchase Apps
plik apk przez dekompilację. Nigdy nie korzystał z żadnego interfejsu API, aby uzyskać listę zakupionych aplikacji. Jego podejście jest takie samo, jak wiemy, które analizuje zawartość html strony internetowej sklepu Play. Oto fragment tego kodu: hastebin.com/uceyavurij.jsPurchased Apps
można pobrać z treści internetowych sklepu playstore. Niestety nie mam dostępu do kupowania aplikacji z Google Play. Jeśli udostępniasz mi konto, na którym jest kupiona aplikacja, mogę opracować dla Ciebie przykładowy kod.Odpowiedzi:
Problem został rozwiązany. Exploit został zamknięty.
Najnowsza aktualizacja:
To jest błąd i Google zajmie się nim w następnej aktualizacji.
Ta odpowiedź przekształciła się w konglomerat pomysłów i została zredagowana tak, aby zawierała informacje z dyskusji w komentarzach.
Interfejs
androidmarket
API byłby dostosowanym interfejsem API napisanym przez programistę. Nie jest dostępny publicznie.Aby odpowiedzieć na Twoje obawy w komentarzach. Deweloper wykorzystałby obecny interfejs API dostępny w Android Developer i Google, aby stworzyć projekt, który zarządza wszystkimi tymi elementami.
Jeśli chodzi o dostęp
Full Account Access
, nie jestem pewien, jak dokładnie ci programiści to osiągnęli.Polecam użycie AccountManagera , który jest częścią android.accounts, ma dostęp do poświadczeń i metody getUserData . Menedżer konta ma dostęp do haseł i jest w stanie tworzyć i usuwać konta. To prawdopodobnie używane z dostawcą treści
Zobacz Uwierzytelnianie Udinic / SyncAdapter .
Aby odpowiedzieć na Twój komentarz:
Ten blog powinien pomóc Ci zacząć. Napisz swój własny Android Authenticator .
Jak te aplikacje faktycznie działają, nie mogę ci powiedzieć. Mogą również mieć różne implementacje (chyba że są wspólnym wysiłkiem za kulisami, z pewnością będą inne).
Jedno przypuszczenie. Najpierw użyj GoogleSignInAccount z com.google.android.gms.auth.api.signin .
Istnieje definicja zakresu , aby określić zakres uprawnień, które aplikacja jest przyznawana.
Korzystanie requestScopes () ,
public static final String PROFILE
Na przykład :
Jeśli można uzyskać pełny dostęp, można znaleźć listę wszystkich aplikacji używanych przez właściciela konta i porównać ją z tym, co jest na urządzeniu.
Menedżer pakietów pobierze listę wszystkich aplikacji aktualnie zainstalowanych na urządzeniu.
PackageInfo zawiera szczegółowe informacje o aplikacji.
INSTALL_REASON_USER odfiltruje również aplikacje, które zostały aktywnie zainstalowane przez użytkownika.
Warto przyjrzeć się com.google.firebase.appindexing i rejestrować działania użytkownika . Można śledzić różne działania .
Historia kont użytkowników znajduje się pod adresem https://myactivity.google.com/myactivity .
Pomocnym łączem jest OAuth 2.0 Playground .
Ten węzeł repozytorium github -google-play , używający węzła, jest aktualny i będzie wywoływał interfejsy API Google Play. Podobnie jak archiwum, które było używane jako „nieoficjalny” interfejs API, android-market-api , do wysyłania zapytań o rynek.
Aplikacja 1
Aplikacja twierdzi wykorzystać następujące uprawnienia:
Warto zauważyć, że aplikacja nie ustawia żadnych uprawnień, gdy była podstawowa instalacja. Nie mogłem skorzystać z żadnej funkcji, ponieważ nie mam płatnych aplikacji. Więc dla początkowego wyszukiwania - nie były potrzebne żadne uprawnienia, co wskazywałoby, że aplikacja nie miała dostępu do mojego konta.
Sprawdziłem uprawnienia - nie były ustawione. Więc jedyną wymaganą rzeczą było zaakceptowanie wyskakującego okienka wyświetlanego w pytaniu.
Aplikacja 2
Druga aplikacja, do której się odnosisz, robi to samo, jest bardziej otwarta na temat tego, do czego uzyskujesz dostęp.
Moje płatne aplikacje
Omówiłem szczegółowo te aplikacje w tym poście na blogu , który dotyczył projektu zwieńczenia uniwersytetu (bez zysku finansowego). Jestem skłonny sądzić, że jest to exploit w API, a nie stan z założenia przez Google, ponieważ nie ma wywołań API w celu pobrania zakupów aplikacji innych niż własna aplikacja programisty. Stawiam hipotezę, że jest to exploit typu zero day, w którym to przypadku nie ma legalnego sposobu uzyskania dostępu do tych informacji.
źródło
W przypadku jednej z tych aplikacji (My Paid Apps), po sprawdzeniu ruchu sieciowego jest całkiem oczywiste, że używa ona strony Konta Sklepu do pobrania listy płatnych aplikacji. Teraz mechanizm, którego używa, jest tym samym mechanizmem, którego używa Google Chrome obecnie i Pokemon GO podobno w pewnym momencie.
Krótko mówiąc, kroki, które należy wykonać, są następujące:
Logowanie : Wspomniany program w pierwszym kroku loguje użytkownika i uzyskuje dostęp do tokena dostępu użytkownika. Aby to zrobić, używa
android.accounts.AccountManager.getAuthToken()
metody. (Zobacz więcej: AccountManager ) Jednak, jak w przypadku zakresu tokenu,oauth2:https://www.google.com/accounts/OAuthLogin
jest wymagane. Warto zauważyć, że na podstawie dokumentacji OAth2 od Google ten zakres jest nieprawidłowy; wydaje się jednak, że jest to prawidłowy zakres dla Google OAuth v1.Konwersja nowo pobranego tokena dostępu na a
ubertoken
: Teraz, co właściwieubertoken
powinno zrobić, jest nieznane i nie ma na ten temat oficjalnej dokumentacji. Jednak w środowisku naturalnym był używany przez przeglądarkę Chrome do logowania użytkowników. Odbywa się to poprzez żądaniehttps://accounts.google.com/OAuthLogin?source=ChromiumBrowser&issueuberauth=1
strony.Konwersja
ubertoken
na sesję WWW : Później za pomocą nowo utworzonejubertoken
sesji można uzyskać sesję WWW za pomocąhttps://accounts.google.com/MergeSession
punktu końcowego API. Po tym kroku aplikacja jest w zasadzie w stanie załadować wszystkie osobiste strony, które możesz otworzyć za pomocą przeglądarki po zalogowaniu; z wyjątkiem niektórych stron specjalnych, w tym ustawień płatności.Pobieranie listy płatnych aplikacji: żądanie i analiza
https://play.google.com/store/account
strony.Poniżej przedstawiono ruch aplikacji przechwycony przez „ Przechwytywanie pakietów ” :
Jak widać na zdjęciu, efekt końcowy jest identyczny z tym, co otrzymuję, gdy normalnie otwieram stronę konta sklepu na moim komputerze z Chrome Desktop:
Uwaga dodatkowa :
Wygląda na to, że żaden z tych punktów końcowych nie jest udokumentowany, ponieważ są używane głównie przez własne programy Google i powinny być traktowane jako wewnętrzne. Dlatego zdecydowanie odradzam używanie ich w żadnym programie lub kodzie, który ma działać przez długi czas lub w środowisku produkcyjnym. Jest też dla ciebie zła wiadomość, wydaje się, że strona konta Google Play zawiera tylko płatne aplikacje lub specjalne bezpłatne aplikacje (zwłaszcza aplikacje OEM). Postaram się znaleźć trochę czasu i zagłębić się w inną aplikację.
Ciekawe artykuły :
Tokeny Pokemonów
Wykorzystywanie tokenów OAuth2 przeglądarki Google Chrome
źródło
Jeśli masz uprawnienia administratora, możesz uzyskać dostęp
/data/data/com.android.vending/databases/library.db
Ta baza danych zawiera wszystkie informacje, którą aplikację pobrałeś, które aplikacje kupiłeś, a nawet w której aplikacji zrobiłeś
IAP
.Sprawdź tabelę własności, zawiera wszystkie informacje.
źródło
Radzenie sobie z nieoficjalnymi interfejsami API Google to niezwykle skomplikowany obszar. Będzie możliwe, aby to zadziałało, ale to wszystko, co powiem. Postępuj na własne ryzyko.
Pierwszą rzeczą, którą musisz zrobić, jest zdobycie tokena autoryzacji Google Play . Można to zrobić na kilka sposobów, ale oto jak robią to w zakupionych aplikacjach:
Kilka rzeczy, na które należy zwrócić uwagę:
AccountManager
.Po uzyskaniu tokena uwierzytelniania możesz teraz uzyskać dostęp do dowolnego punktu końcowego Sklepu Google Play . Głównym używanym przez zakupione aplikacje jest
https://android.clients.google.com/fdfe/purchaseHistory
. Innym, który może Cię zainteresować, jesthttps://android.clients.google.com/fdfe/details?doc=(package name)
(z kodu APKfetch ). Oto strona zawierająca więcej i trochę analiz. Jeśli wysyłasz żądanie do tych interfejsów API, musisz podać kilka nagłówków:Authorization
-"GoogleLogin auth=(your auth token)"
User-Agent
-"Android-Finsky/6.4.12.C-all%20%5B0%5D%202744941 (api=3,versionCode=80641200,sdk=" + VERSION.SDK_INT + ",isWideScreen=0)";
X-DFE-Device-Id
- identyfikator Google Services Framework Twojego urządzenia uzyskany z AdvertisingIdClient .X-DFE-Client-Id
-"am-android-google"
Accept-Language
- Kod języka urządzenia, np"en"
.Teraz musisz przeanalizować odpowiedź . Oto, gdzie sprawy stają się trudne. Te interfejsy API zwracają wiadomość zakodowaną jako Protobuf , więc zasadniczo są to tylko dane binarne, chyba że masz schemat (który oczywiście ma tylko Google). Jednym ze sposobów rozwiązania tego w teorii jest dekompilacja aplikacji Sklep Google Play i ponowne użycie ich wygenerowanych modeli protobuf za pomocą narzędzia takiego jak JADX .
Niestety próbowałem tego i tak naprawdę nie działa. Klasy modeli Protobuf są po prostu zbyt złożone dla standardowego dekompilatora. Możesz użyć narzędzia o nazwie PBTK . Najlepiej byłoby uruchomić to w Google Play Store 6.1.12 APK, ponieważ jest to ostatnia wersja przed rozpoczęciem korzystania z ProGuard. Zwróć uwagę, że ten program ma dwa błędy w swoim skrypcie, które należy naprawić przed jego uruchomieniem: zmiana
'extracto'
na'extractor'
w gui.py i usunięcie instrukcji asercji w wierszu 500 pliku jar_extract.py .Teraz powinno to wypisać wszystkie klasy odpowiedzi jako pliki .proto. Utwórz folder w src / main o nazwie
proto
i przeciągnij do niego cały wygenerowany katalog „com”. Możesz usunąć wszystko, czego nie ma podcom/google/android/finsky/protos
. Postępuj zgodnie z instrukcjami online, aby skonfigurować Gradle z wtyczką Protobuf Lite.Jeśli chcesz przeanalizować odpowiedź, możesz użyć klasy ResponseWrapper, ponieważ wszystkie wydają się być pod nią zawarte.
To mniej więcej tak daleko, jak mogę cię zabrać. Jest duża szansa, że jakaś część tego pomyliłem; JADX jest tutaj Twoim najlepszym przyjacielem, ponieważ najlepszym sposobem sprawdzenia, co robi aplikacja, jest spojrzenie na jej kod. Mam nadzieję, że to pomoże i szczęśliwego rozwoju!
źródło
AccountManager
, czy na pewno jest nadal dostępny? Myślę, że w dzisiejszych czasach Google daje tylko możliwość użyciaAccountPicker
(jak tutaj: stackoverflow.com/a/26888259/878126 ). Ale jak mam wykonać resztę? Czy to przetestowałeś? Czy to zadziałało? Udostępnij kod. Dlatego wyznaczyłem nagrodę, aby zobaczyć, jak działa ...możesz uzyskać nazwę pakietu wszystkich zainstalowanych aplikacji na urządzeniu, a następnie uzyskać informacje o każdym zainstalowanym pakiecie, który znajdziesz na urządzeniu z Google Play, bez konieczności uzyskiwania dostępu do konta użytkownika. istnieje nieoficjalny interfejs API innej firmy lub nieoficjalny plik API, który pobiera szczegóły aplikacji Google Play jako json, pobierając nazwę pakietu aplikacji. na przykład: https://42matters.com/ następnie użyj otrzymanych informacji dla każdego pakietu, aby znaleźć darmowe.
źródło
Mam do rozważenia dwa źródła, ale po pierwsze, jednym słowem, nie. nie ma interfejsu API od GOOGLE, który pozwoliłby ci robić to, co chcesz, ponieważ te dane nie są przechowywane w telefonie, są na serwerach sklepu Google Play, a Google nie ma OFICJALNEGO interfejsu API dla Sklepu Play. możesz jednak zebrać informacje z tych dwóch witryn:
https://www.quora.com/Is-there-an-API-for-the-Google-Play-Store wprowadź opis linku tutaj
/android/162146/how-to-see-all-the-apps-i-have-downloaded-from-google-play-store
i to wystarczy, aby zobaczyć, jak to osiągnąć.
po pierwsze, lista aplikacji, które zostały pobrane przez konto, jest dostępna tylko dla tego konta. i można to zrobić za pośrednictwem sklepu Play. ponieważ Twoja aplikacja zostanie zainstalowana na telefonie tego użytkownika, to nie ma znaczenia ... jesteś w środku.
po drugie, będziesz potrzebować interfejsu API innej firmy, zbudowanego dla SKLEPU GOOGLE PLAY, jest kilka, sprawdź pierwszy link.
korzystając z wybranego interfejsu API, wyślesz żądanie pobierania do sklepu Play, aw zamian w większości przypadków powinieneś otrzymać obiekt json do deserializacji.
zdeserializuj obiekt, a będziesz mieć swoją listę. lista, którą otrzymasz, będzie zależeć od używanego punktu końcowego, ale powinno to zostać wyjaśnione przez / w samym interfejsie API.
powodzenia!
źródło