Запуск службы с привилегиями Root или добавление разрешений с помощью root

В настоящее время я разрабатываю приложение, которое считывает SMS / электронную почту во время вождения. Многие пользователи пожелали поддержки WhatsApp / KakaoTalk.

Однако, поскольку нет «официального» способа получения их сообщений, будет только три варианта, требующих root:

Более простой способ сканирования их базы данных в заданной интервал.

  • Легко реализуется.
  • Однако эффективность батареи
  • Также сообщения сразу не считываются.

Другой способ – запустить службу с правами root и зарегистрировать приемник, который прослушивает свои push-уведомления. Это необходимо сделать с помощью root, поскольку для обоих пакетов требуется разрешение на основе подписи для получения своих push-уведомлений.

  • Сложнее реализовать
  • Лучший пользовательский интерфейс

Также мне пришло в голову следующее: можно ли вручную добавить разрешения в APK после установки? В этом случае я мог бы добавить разрешения c2dm в свой пакет.

  • Это упростит ситуацию
  • Тем не менее, я немного боюсь изменить права на приложение, так как это полностью противоречит принципу Android Sandbox.
  • И все же, если бы это было возможно, дайте мне знать!

Проблема в том, как именно я запускаю службу с правами root (действительно ли это возможно)? Я знаю, как запускать команды оболочки или двоичные файлы с помощью root , но я понятия не имею, как запустить часть APK как root.

Кроме того, можно ли интегрировать BroadcastReceiver в двоичный файл? У меня нет опыта работы с C / C ++, особенно в среде Android.

Можете ли вы мне помочь? Благодарю.

Edit: Как я уже сказал в комментарии, я не хочу использовать AccesibilityService , так как он не соответствует моим потребностям (например, он даст мне «2 непрочитанных сообщения», если более одного непрочитанных, также он не включает полный тела).

Edit2: Просто для выяснения вещей: я знаю, как запускать команды с помощью root. Мне нужно знать, как зарегистрировать Broadcastreceiver, который получает определенные «обычные» приемники вещания, которые не получают, так как для широковещательной передачи требуется разрешение на основе подписи, которого у меня нет.

Solutions Collecting From Web of "Запуск службы с привилегиями Root или добавление разрешений с помощью root"

Это далеко от тривиального, но должно работать, когда приложения, которые вы хотите контролировать, используют базы данных sqlite или, что более общие, пишут сообщения в файл, когда они приходят.

Вам действительно необходимо иметь root-доступ к устройству, так как это нарушает систему безопасности Android:

Напишите собственный процесс, который запускается как демон с NDK и запускает его один раз после загрузки с правами root. У вас есть 3 основные проблемы:

Как узнать, что-то изменилось?

Это легкая часть. Вам нужно будет использовать интерфейс linux inotify, который должен быть доступен на каждом телефоне Android, поскольку у SDK есть FileObserver с API 1, поэтому вы находитесь на стороне сохранения здесь.

Еще одна интересная вещь – поймать сообщения C2DM. Я нашел класс NDK, который называется BroadcastReceiver , поэтому NDK может их поймать. Но я лично этого не делал, это неправильно, чтобы украсть намерения. Также вам придется перераспределить их или позволить им путешествовать к реальному получателю, поэтому я не буду описывать это подробно здесь. Он может работать, но может быть сложнее и должен быть только резервным.

Итак, когда вы решили это, возникает следующая проблема:

Как читать изменения в экономном режиме?

У вас есть проблема, большая, здесь. Файл не принадлежит вам, вы даже не имеете права знать, где он (обычно). Таким образом, контролируемое приложение не знает вас и будет действовать так, как будто файл принадлежит ему исключительно. Если они используют какой-то простой текстовый файл для написания сообщений, вам нужно найти способ безопасного его чтения, поскольку он может быть перезаписан или расширен в любое время. Но вам может повезти, когда они используют sqlite, в соответствии с этим вполне допустимо иметь более одного одновременного читателя, всего лишь одного автора. Мы в спецификации, все отлично. Когда вы сейчас зачитали новые данные, больше проблем решить:

Как вернуть новые данные в основное приложение?

Вы должны делать только минимальный минимум в этой программе c / c ++, потому что он работает от имени root. Вы также должны защищать пользователей приложений от нарушений безопасности, поэтому, пожалуйста, запрограммируйте демона с этим. У меня нет реальной идеи, что это может работать очень хорошо, но вот некоторые из них:

  • Напишите собранные данные в вашу собственную базу данных sqlite (легко в c / c ++ и java)
  • Напишите собранные данные в простой файл (не рекомендуется вообще, боль в задней части)
  • Отправить Intent, который содержит новые данные (возможно, не так просто в c / c ++, но легко в java)
  • Розетки / трубы / …, каждый механизм rpc, который вы могли бы себе представить, который вам привнес Linux (так же, как и файл, не делайте этого)

Как указано в приведенном выше тексте, будьте осторожны, когда вы пишете этого демона, так как это потенциальная угроза безопасности. Также может быть трудно сделать это, когда вы вообще не знаете о c / c ++, и даже когда вы написали простые программы, это должно быть нетривиальной задачей.

В моем поиске через Интернет я нашел эти классы NDK c ++, о которых я говорил выше. Его можно найти в коде google . У меня нет опыта работы с NDK и с оболочкой c ++, но, возможно, стоит посмотреть, когда вы планируете это написать.

Невозможно запустить службу (или любой другой компонент приложения, если на то пошло), как root, если вы настроите неизмененные, не связанные с корнем устройства. Это позволит сделать все механизмы безопасности в Android бессмысленными.

Также невозможно изменить разрешения APK во время выполнения. Разрешения всегда предоставляются или отклоняются во время установки APK. Дополнительную информацию по этому вопросу можно найти в http://developer.android.com/guide/topics/security/security.html .

Сила, я должен сказать вам, что служба Android не требует корневого доступа, вместо этого некоторые действия (например, Access, Read, Write system resources) требуют Root Permissions. Каждый Android-сервис, предоставляемый в Android SDK, может работать без ROOT ACCESS.

Вы можете выполнить действия с правами root с помощью команд оболочки.

Я создал абстрактный класс, который поможет вам в этом

 import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; import android.util.Log; public abstract class RootAccess { private static final String TAG = "RootAccess"; protected abstract ArrayList<String> runCommandsWithRootAccess(); //Check for Root Access public static boolean hasRootAccess() { boolean rootBoolean = false; Process suProcess; try { suProcess = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(suProcess.getOutputStream()); DataInputStream is = new DataInputStream(suProcess.getInputStream()); if (os != null && is != null) { // Getting current user's UID to check for Root Access os.writeBytes("id\n"); os.flush(); String outputSTR = is.readLine(); boolean exitSu = false; if (outputSTR == null) { rootBoolean = false; exitSu = false; Log.d(TAG, "Can't get Root Access or Root Access deneid by user"); } else if (outputSTR.contains("uid=0")) { //If is contains uid=0, It means Root Access is granted rootBoolean = true; exitSu = true; Log.d(TAG, "Root Access Granted"); } else { rootBoolean = false; exitSu = true; Log.d(TAG, "Root Access Rejected: " + is.readLine()); } if (exitSu) { os.writeBytes("exit\n"); os.flush(); } } } catch (Exception e) { rootBoolean = false; Log.d(TAG, "Root access rejected [" + e.getClass().getName() + "] : " + e.getMessage()); } return rootBoolean; } //Execute commands with ROOT Permission public final boolean execute() { boolean rootBoolean = false; try { ArrayList<String> commands = runCommandsWithRootAccess(); if ( commands != null && commands.size() > 0) { Process suProcess = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(suProcess.getOutputStream()); // Execute commands with ROOT Permission for (String currentCommand : commands) { os.writeBytes(currentCommand + "\n"); os.flush(); } os.writeBytes("exit\n"); os.flush(); try { int suProcessRetval = suProcess.waitFor(); if ( suProcessRetval != 255) { // Root Access granted rootBoolean = true; } else { // Root Access denied rootBoolean = false; } } catch (Exception ex) { Log.e(TAG, "Error executing Root Action", ex); } } } catch (IOException ex) { Log.w(TAG, "Can't get Root Access", ex); } catch (SecurityException ex) { Log.w(TAG, "Can't get Root Access", ex); } catch (Exception ex) { Log.w(TAG, "Error executing operation", ex); } return rootBoolean; } } 

Расширьте свой класс с помощью RootAccess или создайте экземпляр класса RootAccess и переопределите метод runCommandsWithRootAccess ().

Запуск чего-то как root не является правильным способом решения этого.

Вместо этого рассмотрите службу доступности, которая может следить за новыми уведомлениями:

AccessibilityEvent

«Мне нужно знать, как зарегистрировать Broadcastreceiver, который получает определенные« обычные »приемники вещания, которых нет, потому что для самого вещания требуется разрешение на основе подписи, которого у меня нет».

Вы не можете. Период. Конец истории. И поблагодарить гход за это.

Да, если вы используете искушенные корневые устройства, чтобы иметь некоторый код с правами root, вы можете теоретически делать все, что захотите. На практике это может быть довольно сложно обойти это ограничение, и платформа часто разработана таким образом. Вам, по крайней мере, нужно будет возиться с состоянием, поддерживаемым и / или сохраненным менеджером пакетов, и, вероятно, потребуется заставить пользователя перезагрузить устройство, чтобы получить изменения, сделанные вами как root, чтобы на самом деле повлиять. И, конечно же, вы тогда возитесь с глубоко внутренними деталями реализации платформы, что означает разброс повсюду в разных версиях платформы и разных сборках от разных производителей.

вы можете использовать

 pm grant your.permission 

Как команду оболочки для предоставления дополнительных разрешений для вашего приложения. Я думаю, что команда была добавлена ​​совсем недавно, поэтому, если вы ориентируетесь на более старые версии, вам может потребоваться прямое изменение «package.xml».

Файл app / dex можно выполнить как root с помощью команды app_process, но я еще не понял, как получить допустимый контекст (с этим вы можете использовать java.io.File api для доступа ко всем файлам, но Нестационарные методы андроида, такие как bindService и т. Д., Будут терпеть неудачу, потому что вы работаете без контекста приложения).

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

Еще одна вещь, которую я могу вам рассказать, заключается в том, что вы не можете запускать Service или что-то еще в качестве пользователя root , только на root устройствах, и нелегкая задача для запуска устройств через ваше приложение, а также это не будет то, что Многие пользователи захотят.

Как вы в настоящее время получаете доступ к SMS ? Если у вас есть BroadcastReceiver вы можете установить MAX_PRIORITY для своего receiver и, возможно, перехватить сообщения перед другими приложениями. Это можно сделать следующим образом:

  <receiver android:name=".SmsReceiver" > <intent-filter android:priority="100" > <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> 

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