Zwei apk-Dateien zu einer verbinden

Bild

Ich habe mich irgendwie dazu entschlossen, zwei apk-Dateien zu verkleben, aber es gibt nicht viele Informationen darüber, wie man das im Internet macht. Dann begann mit dem Ahmyth-Trojaner für Android (seine Quelle ) eine Reise in die Welt des Klebens von Apk mit eigenen Händen. Kurz dazu weiter ...

Kurz zum Kern des Problems:

Es gibt zwei apk-Dateien (sagen wir 1.apk und 2.apk). Die Aufgabe besteht darin, 3.apk zu erstellen, das 1 und 2 apk klebt (und deren Funktionen ausführt).

Zusammenfassend (Python-Code):


Wir haben:


1. Ordner apk - für Dateien mit apk;
2. Ordner tmp - für dekompilierte Dateien;
3. Tools- Ordner - mit zusätzlicher Software (wie apktool.jar, sign.jar, testkey).

Zuerst bestimmen wir den aktuellen Ordner, in dem wir arbeiten, und die Ordner, in denen wir dekompilieren werden:

#!/usr/bin/python # -*- coding: utf-8 -*- import re import codecs import os from os import listdir import shutil import subprocess import datetime pwd = os.getenv("PWD", os.getcwd()) #   apkFolder1=pwd+"/tmp/1" #  apk1 apkFolder2=pwd+"/tmp/2" #  apk2 

Dann dekompilieren wir apk-Dateien in den tmp-Ordner:

 print " "+pwd+"/apk/1.apk" subprocess.call("java -jar "+ pwd+"/tools/apktool.jar d "+pwd+"/apk/1.apk -f -o " + pwd+"/tmp/1" , shell=True ) print " "+pwd+"/apk/2.apk" subprocess.call("java -jar " + pwd+"/tools/apktool.jar d "+pwd+"/apk/2.apk -f -o " + pwd+"/tmp/2" , shell=True ) 

Nach diesem Schritt haben wir zwei Ordner / tmp / 1 und / tmp / 2 mit dekompilierten Dateien. Jetzt ist der lustige Teil die Vereinigung von Manifesten !

 print "  " mainfest1 = open(apkFolder1+"/AndroidManifest.xml", "r").read() #   ,       service1 = mainfest1[(mainfest1.find("</activity>")+len("</activity>")):mainfest1.find("</application>")] #      permission1=mainfest1[ mainfest1.find("<uses-permission"):mainfest1.find("<application ")]#    mainfest2 = open(apkFolder2+"/AndroidManifest.xml", "r").read() #       new_mainfest2 = mainfest2[0:mainfest2.find("<application")] +permission1+ mainfest2[mainfest2.find("<application"):mainfest2.find("</application")] +service1 + mainfest2[mainfest2.find("</application>"):mainfest2.find("</manifest>")+len("</manifest>")] #    new_mainfest = open(apkFolder2+"/AndroidManifest.xml", "w") new_mainfest.write(new_mainfest2 ) new_mainfest.close() 

Jetzt in der Reihenfolge in diesem Code:

Wir finden die Datei AndroidManifest.xml im Ordner / tmp / 1:

 mainfest1 = open(apkFolder1+"/AndroidManifest.xml", "r").read() 

In dieser Datei finden wir alle deklarierten Dienste und Klassen:

 service1 = mainfest1[(mainfest1.find("</activity>")+len("</activity>")):mainfest1.find("</application>")] 

Kopieren Sie im Ordner AndroidManifest.xml / tmp / 1 alles vom Tag "<Verwendungsberechtigung" in das Tag "<Anwendung". Hier sind alle Berechtigungen, die das Programm benötigt:

 permission1=mainfest1[ mainfest1.find("<uses-permission"):mainfest1.find("<application ")] 

Wir finden die Datei AndroidManifest.xml im Ordner / tmp / 2:

 mainfest1 = open(apkFolder2+"/AndroidManifest.xml", "r").read() 

Danach müssen wir all dies in einer Datei kombinieren , damit alles vorhanden ist.

Das neue Manifest (new_mainfest2) besteht aus:

  1. Der Beginn der Anwendung AndroidManifest.xml 2.apk (vom Anfang bis zum Ende der erforderlichen Berechtigungen);
  2. Wir fügen hier die Anwendungsberechtigungen 1.apk (Berechtigung1) hinzu;
  3. Fügen Sie alles, was in AndroidManifest.xml der 2.apk-Anwendung enthalten ist, von "<application" zu "hinzu.

Fügen Sie alle Dienste der Anwendung hinzu 1.apk (service1);
Fügen Sie die Reste der Anwendung AndroidManifest.xml 2.apk hinzu.

 new_mainfest2 = mainfest2[0:mainfest2.find("<application")] +permission1+ mainfest2[mainfest2.find("<application"):mainfest2.find("</application")] +service1 + mainfest2[mainfest2.find("</application>"):mainfest2.find("</manifest>")+len("</manifest>")] 

Überschreiben von AndroidManifest.xml im Ordner / tmp / 2:

 #    new_mainfest = open(apkFolder2+"/AndroidManifest.xml", "w") new_mainfest.write(new_mainfest2 ) new_mainfest.close() 

Damit ist der Build von AndroidManifest abgeschlossen. Es bleiben alle Klassen von / tmp / 1 nach / tmp / 2 zu kopieren. Genauer gesagt werden wir die kleinen Ordner (hier sind alle Anwendungsklassen) kopieren und unbekannt :

 subprocess.call("cp -rn "+apkFolder1+"/smali "+apkFolder2 , shell=True ) #   /smali apkFolder1  /smali apkFolder2 subprocess.call("cp -rn "+apkFolder1+"/unknown "+apkFolder2 , shell=True ) #   /unknown apkFolder1  /unknown apkFolder2 

Nun, abschließend müssen Sie all dies in einer APK-Datei sammeln, unterschreiben:

  print " apk   "+ pwd+"/tmp/3.apk" subprocess.call("java -jar " + pwd+"/tools/apktool.jar b "+pwd+"/tmp/2 -o " + pwd+"/tmp/3.apk" , shell=True ) print "  "+ pwd+"/tmp/3.apk" subprocess.call("java -jar " + pwd+"/tools/sign.jar "+pwd+"/tmp/3.apk --override", shell=True ) 

Infolgedessen wird die 3.apk-Datei im tmp-Ordner angezeigt, der die beiden anderen zusammenklebt.

PS In dieser Ausführungsform wird beim Verkleben der Berechtigungen von zwei Anwendungen deren Vergleich und Hinzufügen nur derjenigen, die nicht vorhanden sind, nicht überprüft. Die Genehmigungserklärung kann (und wird) doppelt vorhanden sein. In diesem Stadium funktioniert jedoch alles mit Duplizierung.

Quellen:

AhMyth-Android-RAT

Source: https://habr.com/ru/post/de422885/


All Articles