2015-05-23 8 views
13

Wiem, jak wyodrębnić pliki APK do klas stosując system oparty okna jak poniżej:W jaki sposób mogę programowo dekompilować pliki w formacie Xx w systemie Android?

Krok 1: Zmiana nazwy pliku apk

Zmień nazwę pliku APK z rozszerzeniem .zip (dla przykładem niech będzie plik "demofile.apk", a następnie po zmianie nazwy staje się "demofile.apk.zip")

Krok 2: Pobieranie plików Java z apk

Teraz wyodrębnij plik zip o zmienionej nazwie do określonego folderu, na przykład pozwól , aby ten folder był "demofolder". Teraz pobierz plik dex2jar z linku do okna i wypakuj ten plik zip w folderze "demofolder".

Teraz otwórz wiersz polecenia i przejdź do folderu utworzonego w poprzednim kroku i wpisz polecenie „dex2jar classes.dex” i enter.This prasowe będą generować „classes.dex.dex2jar” pliku w tym samym folderze.

Teraz Pobierz Java Decompiler z linku i rozpakować go i start (podwójne kliknięcie) jd-gui.exe

Od jd-gui okno przeglądania wygenerowanego "classes.dex.dex2jar" plik w demofolder, to da wszystkie pliki klas według nazwy src.

Teraz z menu Plik wybierz opcję „zapisz wszystkie źródła” spowoduje to wygenerowanie pliku zip o nazwie „classes_dex2jar.src.zip” składający się z wszystkich pakietów i plików Java.

Wyodrębnij plik zip (classes_dex2jar.src.zip), a otrzymasz wszystkie pliki java z aplikacji .

Powyższe kroki będą generować pliki Java, ale aby uzyskać pliki xml wykonaj następujące kroki: .

Krok 3: Pobieranie plików XML z apk

Pobierz apktool i apktool zainstalować z linku i wyodrębnić zarówno pliki i umieścić go w tym samym katalogu (na przykład „demoxmlfolder”).

Umieść plik apk w tym samym folderze (tj demoxmlfolder)

Teraz otwórz wiersz polecenia i goto katalog, w którym przechowywany jest apktool (tutaj „demoxmlfolder”) i wpisać polecenie „apktool jeśli ramowych-res .apk "Powyższe polecenie powinno spowodować" Zainstalowane Framework ... "Teraz w wierszu polecenia wpisz polecenie" apktool d filename.apk " (gdzie nazwa_pliku to nazwa pliku apk) Spowoduje to wygenerowanie folderu o nazwie nazwa pliku w aktualny katalog (tutaj demoxmlfolder), w którym wszystkie pliki xml będą przechowywane w folderze res \ layout.

Ale chciałbym wiedzieć, jak osiągnąć powyższy programowo wewnątrz Androida. Tak więc moja aplikacja na Androida może po prostu wyodrębnić plik dex innej aplikacji.Nie mam nic przeciwko, jeśli plik jest kopiowany Dex gdzie indziej na telefon, następnie dekompilować (to jest po prostu dekompilacji utknąłem na)

Na zasadzie jak poniżej, które Mam dostęp do każdej aplikacji dex , po prostu nie wiedzą, jak to dekompilować w systemie Android.

Każda pomoc będzie fantastyczna.

final PackageManager pm = getPackageManager(); 
       PackageInfo packageInfo = null; 
       try { 
        packageInfo = pm.getPackageInfo("PACKAGE NAME HERE", PackageManager.GET_META_DATA); 
       } catch (NameNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       File file = new File(packageInfo.applicationInfo.sourceDir); 
       Uri uri = Uri.fromFile(file); 
+1

Wymagałoby to uprawnień roota, ponieważ nie można odczytać zasobów innego procesu/aplikacji, a tym bardziej ich binarnego pliku używanego przez własną aplikację. Tylko moje dwa centy. PD: Przygotuj się na reimplementację kilku lekcji, interfejs API Java na Androida nie będzie replikować pełnego zestawu interfejsu API dla komputerów stacjonarnych. – Machinarius

+0

@Machinarius, Wymagałoby tylko rootu dla prywatnych aplikacji. Sprawdź https://play.google.com/store/apps/details?id=com.njlabs.showjava. Pracowałem kilka miesięcy temu, ale dex2jar działa bardzo wolno na Androidzie. –

+0

Byłem kompletny, pewien model zabezpieczeń Androida nie pozwoliłby ci na to bez uprawnień administratora. Poprawiono mnie. Dobra robota w tym zakresie, gratuluję. Jeśli chodzi o ulepszenia wydajności ... To wymagałoby specyficznego mieszania się z kodem dex2java, aby uczynić go wielowątkowym i takim. – Machinarius

Odpowiedz

8

Można przeglądać źródłowego aplikacji ShowJava here. Wygląda na to, że używa narzędzia Dex2Jar. Dekompilacja rozpoczyna się w BackgroundService, a cała magia odbywa się w specjalnych klasach JAR. Nie wiem, czy ten kod pochodzi z biblioteki, czy też cały ten kod jest przez niego tworzony. Spójrz na metodę ExtractJar i DecompileJar, niż nie powinno być trudno zrozumieć, co się dzieje.

1

Trzeba wykonać kilka czynności, aby uzyskać to działa:

  1. dotarł do dex2jar bitbucket site i pobrać pliki. Dodaj pliki jar do projektu.
  2. Za pomocą DexFileFactory można załadować pakiet apk, przekonwertować go na dex (loadDexFile) i zapisać w pliku (writeDexFile).
  3. Z inną biblioteką, która konwertuje słoiki do plików Java, możesz w końcu odczytać zawartość. Znalazłem Procyon, co wydaje się bardzo proste. Załaduj plik klasy za pomocą InputTypeLoader, a następnie zadzwoń pod numer Decompiler.decompile().

Oczywiście można użyć innych bibliotek w kroku 3, ale dla etapu 1 i 2 nie znalazłem żadnych alternatyw.

Powiązane problemy