2017-01-10 3 views
11

Ich frage mich, wie Parallel Space App andere Anwendungen duplizieren und ausführen kann, ohne ihre APKs zu kopieren oder unter modifizierten Paketnamen auszuführen, wie andere Apps auf Playstore (zB: "com.whatever.name-of-duplicated-app") .Wie man APKs auf einem kundenspezifischen Datenverzeichnis ausführt?

Nach der Überprüfung ihrer AndroidManifest.xml, die erstellten Ordner auf /data/data/, und die Protokolle auf dem Gerät, das einzige Schlussfolgerung, die ich bekommen konnte ist, dass irgendwie Parallel Space der Lage ist, die von der Ausführung Code von anderen APKs, aber es ordnet die Datenverzeichnisse dieser Anwendungen in seinem eigenen Datenverzeichnis zu.

Evidences:

  1. Verzeichnisse wie folgt erstellt: /data/data/com.lbe.parallel.intl/parallel_intl/0/whatever-package-name-you-cloned
  2. Jeder Duplizierte App-Ausführung beginnt mit einer neuen Aufgabe von einem ihrer Proxy Aktivitäten und dann findet irgendwie die duplizierte Anwendung des neu erstellten Prozesses statt.

Anfangs dachte ich, es war etwas, mit DexClassLoader/PathClassLoader APIs, aber ich konnte nicht weiter Fortschritte mit dieser Untersuchung. Ich sah auch einige Fragen wie diese one, aber es scheint nicht der Fall zu sein.

+0

@CommonsWare von Ihnen Jeder hat eine Vorstellung über diese Frage? Vielen Dank im Voraus. – JPMagalhaes

Antwort

12

Ich analysierte die Xiaomi Redmi Note 3, die Multi-Instanz-Apps für WhatsApp ermöglicht. Was es tut, ist ziemlich einfach, es schafft ein anderes Benutzerprofil innerhalb des Rahmens, um die zwei zu unterscheiden.

u0_a171 1832 631 1094576 91608 SyS_epoll_ 0000000000 S com.whatsapp 
u999_a171 8571 631 1037396 65024 SyS_epoll_ 0000000000 S com.whatsapp 

Parallelraum machte etwas noch interessanter. Bevor in die Details erhalten, die Ausgabe von ps

u0_a45 2915 249 1120668 61264 SyS_epoll_ b6ca7010 S com.lbe.parallel.intl 
u0_a45 6876 249 1081464 40588 SyS_epoll_ b6ca7010 S com.google.android.gms.persistent 
u0_a45 6945 249 995016 19828 SyS_epoll_ b6ca7010 S com.google.process.gapps 
u0_a45 11296 1  1220488 22760 futex_wait b6c7a8b0 S com.google.android.gms 
u0_a45 12303 249 1064788 59680 SyS_epoll_ b6ca7010 S com.freecharge.android 
u0_a100 12786 249 699476 45096 jbd2_log_w b6ca6fe8 D com.freecharge.android 

Hier können analysieren, habe ich Parallel Space zu schaffen, ein anderes Konto für Freecharge verwendet. Wenn wir also die letzten beiden Prozesse beobachten, wird einer von ihnen in der Parallel-Space-Prozess-ID gehostet, während die andere App in ihrer eigenen Prozess-ID ist.

Reverse Engineering Parallel Space mit apktool und dex2jar die Ergebnisse waren wie folgt.

Parallel Space deklariert 100 Proxy-Aktivitäten, 100 Proxy-Dienste und 100 Proxy-Anbieter. Diese werden verwendet, um die Anwendung zu hosten, die geklont werden soll. Daher befindet sich die geklonte App im selben Prozessraum wie der Parallel Space. Es hatte auch Android Framework Stubs von ActivityManager, ServiceManager, AccountManager, LocationManager und viele mehr. Wenn die App kompiliert wird, erstellt sie im Wesentlichen dieselben Klassen wie in framework.jar, das mit Android-Geräten geliefert wird. Mit diesem Proxy-Stub und Java Reflexion erstellt und hostet die App in ihrem eigenen Prozessraum. Dazu fängt es einfach die Activity Manager-Aufrufe ab und leitet neue Informationen ein, die dann an das Framework weitergeleitet werden.

Es erstellt auch eine neue Verzeichnisstruktur zum Speichern von App-Informationen in seinem/data/data/-Ordner zum Hosten der geklonten Anwendungsdaten.

Die Details sind immens, die Entwickler von Parallel Space haben umfangreiches Wissen aus dem AOSP-Quellcode genutzt, um das Verhalten zu nutzen und auch die Verwendung von Java-Klassen durch Reflection und Proxies zu nutzen.

Update:

gefunden einfach die Open-Source-Version von Parallel Raum auf GitHub. Dies funktioniert genau nach denselben Prinzipien. Link unten.

https://github.com/asLody/VirtualApp

+0

Große Analyse, danke! Ich habe eine eigene Version des ActivityManagers im Paket com.lbe.doubleagent.service gefunden. Wie Sie gesagt haben, fängt es wahrscheinlich jeden Aufruf des Frameworks ab und implementiert einige Schlüsselelemente neu, um das gewünschte Verhalten zu erhalten. – Perazzo

+1

Ja genau. Ich frage mich jetzt, ist der Himmel die Grenze, was sie mit diesem Ansatz tun können! –

Verwandte Themen