Получить оригинальный файл dex из родной библиотеки Android

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

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

Я говорю оригинальный dex-файл, потому что, если я правильно понимаю (и поправляю меня, если я ошибаюсь), dex-файл преобразуется в общий объект ELF, когда установлен apk — двоичный исполняемый файл, специфичный для архитектуры устройства. По этой причине мне не удалось проверить / проверить подпись файла * .dex, указанного в / proc / self / maps (пример: /data/dalvik-cache/x86/data@[email protected]@base .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 в ваше приложение. Поместите его в свою папку ресурсов и вызовите его из нативного файла, используя exec или то, что использует C ++. Размещение исполняемого файла в приложении Android говорит, что это возможно сделать. Oracle документация о jarsigner говорит, что самозаверяющие баночки выводят НЕИЗВЕСТНО для издателя. Маловероятно, что кто-то загрузит приложение в Google Play, но теоретически они могут подписать его подлинным сертификатом, поэтому не уверены, действительно ли это безопасно. Опять же, вы должны быть в состоянии проверить, что он подписан вашим сертификатом.

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]