Sprawdź, czy pakiet APK został zbudowany z podanego kodu źródłowego

10

Do tej samej aplikacji mam:

  • APK ze sklepu z aplikacjami,
  • co jest rzekomo kodem źródłowym dla tej samej wersji. Z całkiem zwykłym skryptem i strukturą kompilacji Gradle.

Chcę sprawdzić, czy pakiet APK został naprawdę zbudowany z tego kodu źródłowego, czy nie.
Jak to sprawdzić?

Uwagi:

  • Plik APK nie jest zaciemniony.
  • Nie mam powodu ufać niczyjemu podpisowi. Ufam tylko kodowi źródłowemu.
  • Zbudowałem już aplikację dla siebie, ale teraz chcę wiedzieć, czy APK był OK, czy nie.
  • Najlepiej z narzędziami wiersza poleceń Linuksa, ale każde narzędzie jest OK.
Nicolas Raoul
źródło
2
Nie próbowałem tego, ale powinieneś być w stanie użyć Apktool w tym celu: Przeprowadź inżynierię obu .apkplików, a następnie uruchom różnicę względem wynikowych katalogów. Jedyną różnicą powinna być zatem sygnatura (która z oczywistych powodów nie może się równać). Myślenie o tym: po prostu rozpakowanie .apkplików i zrobienie binarnego pliku różnicowego powinno zrobić to samo. Oba oczywiście wymagałyby użycia tych samych wersji bibliotek itp. Podczas kompilacji :)
Izzy
@Izzy: „te same wersje bibliotek ”: Wersja API jest zapisana w manifeście, a wersja bibliotek w skrypcie Gradle, więc chyba ta część powinna być OK. Lista plików / folderów, które można zignorować, byłaby świetną odpowiedzią (premia za rzeczywiste wiersze poleceń).
Nicolas Raoul,
1
Mógłbym to zrobić, gdybym był na komputerze w domu, którego obecnie nie mam. Ale żeby była to „honorowa odpowiedź”, najpierw musiałbym ją wypróbować :) Na wypadek, gdyby zapomniałem (i nikt inny nie zrobił tego przede mną), wyślij mi kolejny ping (np. Na czacie) 8..10h :)
Izzy
@Izzy diffMetoda wydaje się zgrabna ... ale co jeśli faceci z App Store zaciemnili APK podczas kompilacji?
Grimoire
IMHO właśnie tutaj wchodzi Apktool. Czy sprawdziłeś link? Zobacz także LibRadar, który tego używa. AFAIR pomaga w zaciemnianiu (coś musi, inaczej LibRadar miałby ciężką pracę w wykrywaniu tych bibliotek).
Izzy

Odpowiedzi:

2

Możesz to zrobić tylko z odtwarzalnymi kompilacjami:

„Kompilacja jest odtwarzalna, jeśli otrzyma ten sam kod źródłowy, środowisko kompilacji i instrukcje kompilacji, każda ze stron może odtworzyć krok po kroku identyczne kopie wszystkich określonych artefaktów”.

Aby program działał, programista aplikacji lub sklep z aplikacjami musi być na pokładzie.
W przeciwnym razie jedyną opcją jest zbudowanie go samemu.

Jednym z przykładów programisty, który obecnie to robi, jest Open Whisper Systems: https://github.com/WhisperSystems/Signal-Android/wiki/Reproducible-Builds

iDevW
źródło
Bardzo interesujące! Czy jesteś pewien, że porównania nie da się zrobić bez udziału programisty? Niestety (ale co zrozumiałe) większość aplikacji open source nie używa Dockera lub podobnego do kompilacji, są one po prostu zbudowane na dowolnym systemie uruchomionym przez opiekuna.
Nicolas Raoul,
Nie musi być programistą, o ile ktokolwiek tworzy aplikację ze źródła, umożliwia dokładne odtworzenie środowiska kompilacji. Zależności mogą być ogromnym bólem podczas konfigurowania tego typu kompilacji.
iDevW,
„dokładnie odtwórz środowisko kompilacji”: czy można zgadywać? Na przykład, jeśli z jakiegoś powodu budowanie na Macu lub Linuksie daje inny APK, czy mogę zgadnąć, czy APK sklepu z aplikacjami został zbudowany na Macu lub Linuksie?
Nicolas Raoul,
Nie można zgadywać i mieć znaczące wyniki. W końcu będzie to łatwiejsze do wdrożenia i zobaczysz, że robi to coraz więcej projektów open source.
iDewW,
1

Jedną wielką rzeczą dotyczącą Java i APK jest to, że możesz całkowicie zdekompilować APK do kodu źródłowego Java.

Jednak wynikowy kod źródłowy nie może być identyczny.

Jednym dobrym sposobem, aby spróbować dopasować wynikowy kod źródłowy do znanej wersji, jest sprawdzenie, jakie modyfikacje zostały wprowadzone bezpośrednio przed i po znanym zatwierdzeniu w repozytorium, i sprawdzenie, czy te modyfikacje są również obecne w zdekompilowanym źródle.

Aby dekompilować, użyj dex2jar i JD-Gui .

edit Właśnie zauważyłem, że chciałeś narzędzi linuxowych. Moje jedyne doświadczenie dotyczy Windowsa, ale jestem pewien, że istnieją podobne narzędzia dla systemu Linux.

Mark Ch
źródło
Jeśli dobrze rozumiem, twoja metoda polega na sprawdzeniu, jaka była ostatnia zmiana w repozytorium kodu źródłowego, a następnie dekompilacji APK i ręcznym sprawdzeniu, czy najnowsza zmiana znajduje się również w zdekompilowanym kodzie, prawda? Ciekawe podejście, ale to nie powie mi, czy do wersji APK dodano reklamę domową lub wbudowaną, prawda?
Nicolas Raoul,
1
To podejście zastosowałem w biurze, aby dopasować nieznany pakiet APK do wersji źródłowej, co jest wystarczająco dobre, jeśli wiesz, że możesz zaufać programistom. Ale, jak mówisz, prawdopodobnie wciąż nie jest możliwe, aby niewiarygodna impreza mogła się do niej zakraść. Mam nadzieję, że ktoś udzieli bardziej ostatecznej odpowiedzi, przyda mi się również.
Mark Ch.
Co powiesz na samodzielną kompilację źródła w APK, a następnie dekompilację z powrotem do kodu źródłowego i porównanie go ze zdekompilowanym źródłem z APK Play Store? Czy ktoś tego próbował?
Sergiy Belozorov
1
@SergiyBelozorov przepraszam, nie mogę na to odpowiedzieć, tak naprawdę nie współpracuję już z Androidem, ale to brzmi jak bardzo dobry pomysł.
Mark Ch