NDK-Anwendung Signaturprüfung

8

Ich habe einen Sicherheitsschlüssel in einer Anwendung. Ich möchte es sicher aufbewahren. Ich speichere es gerne in einer nativen Shared Library (vielleicht aus einem Code). Danach möchte ich, dass es von einer Methode zurückgegeben wird, die die Signatur des ursprünglichen APK überprüft. Daher kann niemand diese Datei außer vertrauenswürdigen Anwendungen verwenden. Ich weiß, dass diese ndk-Bibliothek auch dekompiliert werden könnte, aber das ist noch schwieriger, Reverse Engineering von nativem Code zu machen als java .class-Dateien.

Frage:

  1. Gibt es eine Möglichkeit, die Signatur der Ursprungs-APK aus dem nativen Code (c / c ++) zu berechnen?
  2. Wie kann ich sicherstellen, dass die Bibliothek von der vertrauenswürdigen Anwendung aufgerufen wird?
Yevgen Kulik 04.06.2015, 17:06
quelle

1 Antwort

6

Ich werde versuchen, Ihre erste Frage hier zu beantworten:

Die Signatur Ihrer Anwendung wird in der DEX-Datei (Dalvik Executable) Ihres APK gespeichert. DEX-Dateien haben folgende Struktur:

  1. Kopfzeile
  2. Datenabschnitt (enthält Strings, Code-Anweisungen, Felder usw.)
  3. Arrays von Methodenbezeichnern, Klassenbezeichnern usw.

Also, das ist der Anfang des Headers der DEX-Datei:

  1. DEX_FILE_MAGIC Konstante - ubyte [8]
  2. Adler-32 Prüfsumme Ihrer Anwendung (außer DEX_FILE_MAGIC und Prüfsumme selbst) - uint
  3. SHA-1-Signatur Ihrer Anwendung (außer DEX_FILE_MAGIC, Prüfsumme und Hash selbst) - ubyte [20]

Um also eine Signatur Ihrer apk zu berechnen, sollten Sie die SHA-1-Signatur Ihrer DEX-Datei ausgehend von dem Offset 32 ​​berechnen.

Um Zugriff auf die DEX-Datei Ihrer apk aus systemeigenem Code zu erhalten, können Sie den Prozessspeicher lesen, der in / proc / self / maps:

gespeichert ist %Vor%

Jede Zeile in der Datei proc / $ ID / maps hat folgende Struktur:

  1. Adresse
  2. Berechtigungen
  3. Offset
  4. Gerät
  5. inode
  6. Pfadname

Hier finden Sie eine bessere Beschreibung der Struktur der proc / $ ID / maps-Datei: Linux verstehen / proc / id / maps

Um den Speicherort der DEX-Datei im Prozessspeicher zu ermitteln, sollten Sie in jeder Zeile Ihrer proc / self / maps-Datei die Spalte "Pfadname" auschecken. Wenn die der DEX-Datei entsprechende Zeile gefunden wird, sollten Sie die Anfangs- und Endadresse des DEX-Dateibereichs eingeben:

%Vor%

Wenn Sie also Start- und Endadressen des Bytecodes Ihrer Apk haben, können Sie die Signatur Ihrer Apk berechnen.

    
floyd 04.06.2015, 18:28
quelle