2016-11-05 5 views
1

Я хотел бы реализовать проверку проверки подлинности проверки приложения (или файла dex) для проверки того, что немодифицированное приложение использует мою общую сборную библиотеку (* .so) build с NDK. Я хотел бы выполнить все проверки подписи непосредственно на C++, без Java. В настоящее время я узнал, что здесь можно получить доступ к файлу apk: /data/app/--1/base.apk. Из файла apk я предполагаю, что возможно получить содержимое исходного файла dex, возможно, даже без извлечения, поскольку файл apk выровнен.Получить исходный файл dex из родной библиотеки android

  1. Кто-нибудь знает, как читать файл dex без извлечения из apk?

Я говорю оригинальный файл dex, потому что, если я правильно понимаю (и исправляю, если ошибаюсь), файл dex преобразуется в общий объект ELF, когда apk установлен - двоичный исполняемый файл, специфичный для архитектуры устройства. Именно по этой причине я не смог проверить/проверить подпись файла * .dex, указанного в/proc/self/maps (пример: /data/dalvik-cache/x86/[email protected]@[email protected] .apk @ classes.dex), потому что во время компиляции невозможно узнать подпись, потому что файл dex будет изменен.

Я знаю, что метод проверки исходного файла dex не очень безопасен, потому что я думаю, что его можно обойти на корневом устройстве легко, заменив оптимизированный файл dex - просто запустите dex2oat в пользовательском файле dex и поместите его в (/ data/dalvik -cache/...).

  1. Есть ли другой лучший способ проверить, является ли приложение оригинальным из собственной библиотеки, используя простой C++? (Без вызова Java через JNI)

ответ

1
  1. Кто-нибудь знает, как читать DEX файл без извлечения из APK?

Оффлайн, я не могу придумать, как это сделать.

  1. Есть ли другой лучший способ проверить, является ли приложение оригинальным из собственной библиотеки, используя простой C++? (Без вызова Java через JNI)

Я могу думать о нескольких (и все они с ума, как шляпник):

  1. ли хэш APK и сравнения с хэш на внешний веб сервер. Нельзя жестко кодировать хэш, так как это меняет хэш. Это должно быть проще всего. Для бонусных очков сохраните их локально, поэтому будущие прогоны не потребуют сетевого подключения.
  2. Вставить jarsigner в свое приложение. Поместите его в свою папку с ресурсами и вызовите его из native с помощью exec или любого другого C++. Hosting an executable within Android application говорит, что это можно сделать. Oracle documentation of jarsigner говорит, что самозаверяющие баночки выдают UNKNOWN для издателя. Маловероятно, что кто-то загрузит приложение в Google Play, но теоретически они могут подписывать его с помощью аутентичного сертификата, поэтому не уверен, что это действительно безопасно. Опять же, вы должны проверить, что он подписан с вашим сертификатом.

Возможно, это может случиться для таких глупых людей, как я, которые используют устройство на базе Intel.

  1. Пожар и сера. Распакуйте с помощью zlib и проверьте сертификат с помощью OpenSSL. Я бы серьезно подумал об изменении карьеры, прежде чем попробовать это, но тогда я не поклонник C/C++.
+0

Для аутентификации приложений я фактически использовал что-то похожее, как в вашем последнем пункте. Я жестко закодирован в общедоступном сертификате собственной библиотеки, найденном внутри META-INF/CERT.RSA, и использовал zlib для извлечения APK и сравнения встроенного значения с найденным в реальном APK. Фактически встроенная строка значений зашифровывается. Здесь не нужен OpenSSL. Атакующий должен атаковать (например, отлаживать) двоичную Native-библиотеку, чтобы обойти эту проверку, которую я хотел. META-INF/CERT.RSA в APK нельзя подделать - Android гарантирует это. – jozols