Thumbnail: thi

Advent Projekt - THI App Reboot Pt. 2

von am unter blog
8 Minuten TTR (Time To Read)

Disclamer

Ich möchte niemanden beleidigen, und falls das so rüber kommt tut es mir leid. Ziel ist es den Code/die Anwendung anzuschauen und erklären wie man wo was besser machen hätte können.

Einführung

Über die Adventszeit möchte ich die THI App rebooten, heute gibt es Pt. 2 des Projekts.
Zunächst wollen wir die THI App mal entpacken um zu schauen, was so unter der Haube steckt um APKs zu besorgen muss man etwas googlen ich habe die APK von APKPure prinzipiell ist es nie Empfehlenswert die APK von wo anders zu laden als den Play Store, denn wie ihr hier lernen werdet, ist das Manipulieren recht einfach…

Vorgehensweise

  1. APK besorgen
  2. APKtool auf die APK anwenden
  3. Mal nachschauen was drinn ist, und vermutungen bekräftigen

APK besorgen

Wie bereits gesagt habe ich die APK von APKPure, ich will das hier mal nicht verlinken, da es eigentlich selten dumm ist… Die Bessere Möglichkeit ist die APK vom Handy zu Exportieren, dazu eignen sich vermutlich mehrere FileExplorer, ich nutze SolidExplorer. Da die App auf dem Gerät installiert wurde müsste diese eigentlich auch bereinigt sein und Informationen welche nicht für das Endgerät genutzt werden verwerfen… (OK tuts nicht, einfach den Satz vergessen, der Export ist genauso groß wie der APKPure Download, ~14MB)

APK entpacken

Das apktool ist ein tolles werkzeug zum entpacken, vor allem wen wir fast nichts ändern müssen, das Manifest und die Ressourcen sind frei einsehbar.

# APK Entpacken
apktool d thi-app_original.apk

Nach dem Entpacken sollten wir einen Ordner mit den Dateien haben

  AndroidManifest.xml
  apktool.yml
d assets
d lib
d original
d res
d smali

Gewonnene Daten begutachten

Zunächst wollen wir uns das Manifest anschauen.

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  android:compileSdkVersion="28"
  android:compileSdkVersionCodename="9"
  android:installLocation="auto"
  package="com.embarcadero.THIApp"
  platformBuildVersionCode="28"
  platformBuildVersionName="9">
  <uses-permission android:name="android.permission.INTERNET"/>
  <uses-feature android:glEsVersion="0x00020000" android:required="true"/>
  <application
    android:debuggable="false"
    android:hardwareAccelerated="true"
    android:icon="@drawable/ic_launcher"
    android:label="THIApp"
    android:largeHeap="false"
    android:persistent="false"
    android:restoreAnyVersion="false"
    android:theme="@style/AppTheme">
    <activity
      android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
      android:label="THIApp"
      android:launchMode="singleTask"
      android:name="com.embarcadero.firemonkey.FMXNativeActivity">
      <meta-data android:name="android.app.lib_name" android:value="THIApp"/>
      <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
      </intent-filter>
    </activity>
    <receiver android:name="com.embarcadero.rtl.notifications.NotificationAlarm"/>
  </application>
</manifest>

package

Das Package verweist nicht wirklich auf die THI zu erwarten wäre de.thi.campusapp bzw de.thi.app also eigentlich nimmt man immer den Firmen/Domain namen des erstellers, und nicht des Frameworks.

uses-feature

OpenGL Embedded Systems, haben wir hier ein Spiel vor uns oder was? Wozu braucht man bei einer simplen App OpenGL, sollte das UI nicht eigentlich von Android kommen?

activity

Die Anwendung besitzt nur eine Activity FMXNativeActivity welche die Native Bibliothek THIApp benötigt.

receiver

Wir haben hier einen Alarm Receiver NotificationAlarm, ich weiß jetzt nicht wozu, mal schauen ob wir ihn finden…

Daten Decompilieren

APKtool hat leider seine grenzen, es erzeugt doch recht schlecht lesbare smali Dateien, eine art VM Assembler für Android. Deshalb nutzen wir nun das Tool Bytecode Viewer.

FMXNativeActivity

vom Schnellen überfliegen wird hier ein UIWrapper erstellt. Wir beachten mal nur die onCreate

@SuppressLint({"NewApi"})
   protected void onCreate(Bundle var1) {
      DeviceArchitectureChecker.check();
      this.virtualKeyboard = new VirtualKeyboard(this);
      super.onCreate(var1);
      this.getWindow().takeSurface((Callback2)null);
      this.getWindow().setFormat(0);
      if (VERSION.SDK_INT >= 22) {
         this.getWindow().setClipToOutline(false);
      }

      this.getWindow().setSoftInputMode(48);
      var1 = this.getIntent().getExtras();
      if (var1 != null) {
         this.mStartupGCM = var1.getBundle("gcm");
      }

      this.mEditText = new FMXEditText(this);
      this.mEditText.setVisibility(8);
      this.mViewGroup = (ViewGroup)this.findViewById(16908290);
      this.mViewGroup.addView(this.mEditText);
      this.mViewGroup.setTag("mViewGroup");
      ViewCompat.setOnApplyWindowInsetsListener(this.getWindow().getDecorView(), new 1(this));
      this.mMediaLibrary = new FMXMediaLibrary(this);
      this.mMediaLibrary.setListener(this);
      this.mViewStack = new ViewStack(this);
      this.virtualKeyboard.addOnKeyboardStateChangedListener(new 2(this));
   }

Interessant ist, dass irgenwie ein Virtuelles Keyboard erstellt wird, das würde sogar passen, da der Display Context vermutlich in einem Nativen OpenGL bereich lauft und dieses Virtuelle Keyboard von dort aus irgendwie gesteuert wird…

Also nicht wirklich vielversprechend, da infos raus zu bekommen…

Der PackageTree verrät dass die lib wohl firemonkey heißt, FireMonkey ist eine Lib von Embarcadero Technologies um Cross Platform UIs zu erstellen, scheint so halb nativ die dinge nachzuimplementieren… Es bleibt jedoch ein Delphi/C++ Framework… Es wird versucht in OpenGL/Direct2D zu zeichnen, eigentlich bin ich nochimmer nicht davon überzeugt, weshalb man nicht einfach ein PWA macht…

NotificationAlarm

Ok hier haben wir nur irgendwie einen Notification Sheduler…
Können wir ignorieren, scheint ein ungenutztes Relikt des Frameworks zu sein.

rtl Package

Beim Decompilieren der APK findet man ein rtl package von Embarcadero, scheint wohl “RealTimeLink” zu heißen, da dort Methoden zu finden sind welche auf die Kommunikation mit der Nativ-Lib hinweisen…

Neue Informationen

Wir konnten bestätigen, dass es sich um eine Native (im sinne von JNA) Anwendung handelt.
Das Framework nutzt reines OpenGL, kann jedoch Android Nativ Komponenten einbinden, es entsteht ein Misch aus OpenGL und Android Nativ, dies ist noch eine wage Vermutung aber so scheint es.
Die Logik bleibt in der Lib libTHIApp.so eingekapselt…

Nächster Schritt

Da wir zu faul sind die C Bib zu entpacken/analysieren werden wir mit einer Netzwerkanalyse fortfahren.

Schritte

  1. Einführung Pt 1
  2. Groben Überblick über die Anwendung verschaffen Pt 2
  3. REST Calls Analysieren
    1. App Vorbereiten Pt 3
    2. Man In The Middle Proxy Pt 4
  4. REST Bridge Basteln
    1. Überlegungen Pt 5
    2. Converter Basteln Pt 6
    3. Gap Gap
    4. JWT Clearify Pt 7
  5. Neues Projekt auf Github anlegen
  6. UI implementieren
  7. REST verknüpfen
android, analyze, reverseengineer, REST, thi