Данная статья является переводом соответствующей статьи Aditya Agrawal. Оригинал доступен по ссылке.

Файл AndroidManifest.xml является достаточно важной частью файла APK (особенно когда речь идёт о безопасности).

В файле AndroidManifest.xml должен быть упомянут каждый Service, ContentProvider, Activity, Broadcast Receiver.

Давайте разберёмся поподробнее в AndroidManifest.xml.

Но сначала я хотел бы рассказать о нескольких важных методах просмотра декомпилированного файла AndroidManifest.xml.

 

Метод #1: с использованием Drozer.

В Drozer есть модуль, который называется app.package.manifest, который показывает содержимое файла AndroidManifest.xml указанного приложения в консоли Drozer.
Введите в консоль Drozer run app.package.manifest org.owasp.goatdroid.fourgoats, и на экран выведется информация, приведённая ниже.

AndroidManifest.xml

<manifest versionCode="1"
          versionName="1.0"
          package="org.owasp.goatdroid.fourgoats">
  <uses-sdk minSdkVersion="9"
            targetSdkVersion="15">
  </uses-sdk>
  <application theme="@2131361870"
               label="@2131296266"
               icon="@2130837632"
               debuggable="true">
    <activity label="@2131296266"
              name=".activities.Main">
      <intent-filter>
        <action name="android.intent.action.MAIN">
        </action>
        <category name="android.intent.category.LAUNCHER">
        </category>
      </intent-filter>
    </activity>
    <activity label="@2131296267"
              name=".activities.Login">
    </activity>
    <activity label="@2131296268"
              name=".activities.Register">
    </activity>
    <activity label="@2131296284"
              name=".activities.Home">
    </activity>
    <activity label="@2131296285"
              name=".fragments.DoCheckin">
    </activity>
    <activity label="@2131296269"
              name=".activities.Checkins">
    </activity>
    <activity label="@2131296271"
              name=".activities.Friends">
    </activity>
    <activity label="@2131296272"
              name=".fragments.HistoryFragment">
    </activity>
    <activity label="@2131296272"
              name=".activities.History">
    </activity>
    <activity label="@2131296270"
              name=".activities.Rewards">
    </activity>
    <activity label="@2131296287"
              name=".activities.AddVenue">
    </activity>
    <activity label="@2131296291"
              name=".activities.ViewCheckin"
              exported="true">
    </activity>
    <activity label="@2131296292"
              name=".fragments.MyFriends">
    </activity>
    <activity label="@2131296294"
              name=".fragments.SearchForFriends">
    </activity>
    <activity label="@2131296274"
              name=".activities.ViewProfile"
              exported="true">
    </activity>
    <activity label="@2131296296"
              name=".fragments.PendingFriendRequests">
    </activity>
    <activity label="@2131296297"
              name=".activities.ViewFriendRequest">
    </activity>
    <activity label="@2131296301"
              name=".fragments.MyRewards">
    </activity>
    <activity label="@2131296302"
              name=".fragments.AvailableRewards">
    </activity>
    <activity label="@2131296303"
              name=".activities.Preferences">
    </activity>
    <activity label="@2131296306"
              name=".activities.About">
    </activity>
    <activity label="@2131296310"
              name=".activities.SendSMS">
    </activity>
    <activity label="@2131296313"
              name=".activities.DoComment">
    </activity>
    <activity label="@2131296272"
              name=".activities.UserHistory">
    </activity>
    <activity label="@2131296316"
              name=".activities.DestinationInfo">
    </activity>
    <activity label="@2131296328"
              name=".activities.AdminHome">
    </activity>
    <activity label="@2131296330"
              name=".activities.AdminOptions">
    </activity>
    <activity label="@2131296326"
              name=".fragments.ResetUserPasswords">
    </activity>
    <activity label="@2131296327"
              name=".fragments.DeleteUsers">
    </activity>
    <activity label="@2131296325"
              name=".activities.DoAdminPasswordReset">
    </activity>
    <activity label="@2131296327"
              name=".activities.DoAdminDeleteUser">
    </activity>
    <activity label="@2131296329"
              name=".activities.SocialAPIAuthentication"
              exported="true">
    </activity>
    <activity label="@2131296266"
              name=".activities.GenericWebViewActivity">
    </activity>
    <service name=".services.LocationService">
      <intent-filter>
        <action name="org.owasp.goatdroid.fourgoats.services.LocationService">
        </action>
      </intent-filter>
    </service>
    <receiver label="Send SMS"
              name=".broadcastreceivers.SendSMSNowReceiver">
      <intent-filter>
        <action name="org.owasp.goatdroid.fourgoats.SOCIAL_SMS">
        </action>
      </intent-filter>
       >

    </receiver>
  </application>
  <uses-permission name="android.permission.SEND_SMS">
  </uses-permission>
  <uses-permission name="android.permission.CALL_PHONE">
  </uses-permission>
  <uses-permission name="android.permission.ACCESS_COARSE_LOCATION">
  </uses-permission>
  <uses-permission name="android.permission.ACCESS_FINE_LOCATION">
  </uses-permission>
  <uses-permission name="android.permission.INTERNET">
  </uses-permission>
</manifest>

 

Метод #2: после декомпиляции APK-файла с использованием apktool.

Введите в консоль apktool d «OWASP GoatDroid-FourGoats Android App.apk», после чего указанный APK-файл приложения FourGoats будет декомпилирован.

Теперь вы можете просто открыть файл AndroidManifest.xml из созданной программой папки.

7-1

 

Метод #3: с использованием AndroGuard.

Используется плагин AndroGuard в Sublime Text, который который производит все действия намного проще, чем работая с файлами androguard.
Ниже приведена анимация, которая описывает данный процесс:

7-2

Я бы посоветовал придерживаться метода #1, т.к. остальные методы имеют ограниченную область применения. Я не отрицаю тот факт, что apktool и AndroGuard — тоже хорошие инструменты, но не полностью подходят для этой цели.

В Android компонент считается открытым, если атрибут exported (в AndroidManifest.xml) установлен в true. Но он также является открытым, если для него установлен атрибут intent-filter (intent-фильтр, «фильтр назначения»). Однако разработчики могут в явном виде делать компоненты закрытыми (несмотря ни на какие intent-фильтры), устанавливая атрибут exported в false. Разработчики могут также устанавливать значения атрибута permission («разрешения») для получения некоторых разрешений для отдельных компонентов, таким образом ограничивая их права.

AndroidManifest.xml (с пояснениями)

<manifest versionCode="1"
          versionName="1.0"
          package="org.owasp.goatdroid.fourgoats">
## minSdkversion говорит от уровне API, ниже которого приложение не запустится.
## У каждого релиза Android есть свой уровень API. У Android 4.4.4 уровень API равен 19.
  <uses-sdk minSdkVersion="9"
            targetSdkVersion="15">
  </uses-sdk>
## Тег "application" рассказывает детальнее о ресурсах.
  <application theme="@2131361870"
               label="@2131296266"
               icon="@2130837632"
               debuggable="true">
## Здесь тегами "activity" определены несколько Activity с разным значением поля "name".
##Это Activity экспортируется, т.к. используется intent-filter.
    <activity label="@2131296266"
              name=".activities.Main">
      <intent-filter>
        <action name="android.intent.action.MAIN">
        </action>
        <category name="android.intent.category.LAUNCHER">
        </category>
      </intent-filter>
    </activity>
    <activity label="@2131296267"
              name=".activities.Login">
    </activity>
    <activity label="@2131296268"
              name=".activities.Register">
    </activity>
    <activity label="@2131296284"
              name=".activities.Home">
    </activity>
    <activity label="@2131296285"
              name=".fragments.DoCheckin">
    </activity>
    <activity label="@2131296269"
              name=".activities.Checkins">
    </activity>
    <activity label="@2131296271"
              name=".activities.Friends">
    </activity>
    <activity label="@2131296272"
              name=".fragments.HistoryFragment">
    </activity>
    <activity label="@2131296272"
              name=".activities.History">
    </activity>
    <activity label="@2131296270"
              name=".activities.Rewards">
    </activity>
    <activity label="@2131296287"
              name=".activities.AddVenue">
    </activity>
## Экспортируемое Activity
    <activity label="@2131296291"
              name=".activities.ViewCheckin"
              exported="true">
    </activity>
    <activity label="@2131296292"
              name=".fragments.MyFriends">
    </activity>
    <activity label="@2131296294"
              name=".fragments.SearchForFriends">
    </activity>
## Экспортируемое Activity
    <activity label="@2131296274"
              name=".activities.ViewProfile"
              exported="true">
    </activity>
    <activity label="@2131296296"
              name=".fragments.PendingFriendRequests">
    </activity>
    <activity label="@2131296297"
              name=".activities.ViewFriendRequest">
    </activity>
    <activity label="@2131296301"
              name=".fragments.MyRewards">
    </activity>
    <activity label="@2131296302"
              name=".fragments.AvailableRewards">
    </activity>
    <activity label="@2131296303"
              name=".activities.Preferences">
    </activity>
    <activity label="@2131296306"
              name=".activities.About">
    </activity>
    <activity label="@2131296310"
              name=".activities.SendSMS">
    </activity>
    <activity label="@2131296313"
              name=".activities.DoComment">
    </activity>
    <activity label="@2131296272"
              name=".activities.UserHistory">
    </activity>
    <activity label="@2131296316"
              name=".activities.DestinationInfo">
    </activity>
    <activity label="@2131296328"
              name=".activities.AdminHome">
    </activity>
    <activity label="@2131296330"
              name=".activities.AdminOptions">
    </activity>
    <activity label="@2131296326"
              name=".fragments.ResetUserPasswords">
    </activity>
    <activity label="@2131296327"
              name=".fragments.DeleteUsers">
    </activity>
    <activity label="@2131296325"
              name=".activities.DoAdminPasswordReset">
    </activity>
    <activity label="@2131296327"
              name=".activities.DoAdminDeleteUser">
    </activity>
## Для этого Activity был установлен флаг "exported", т.е. другие приложения могут получать доступ к этому Activity приложения FourGoats.
    <activity label="@2131296329"
              name=".activities.SocialAPIAuthentication"
              exported="true">
    </activity>
    <activity label="@2131296266"
              name=".activities.GenericWebViewActivity">
    </activity>
## Здесь указан Service, который тоже экспортируется, т.к. используется intent-filter.
    <service name=".services.LocationService">
      <intent-filter>
        <action name="org.owasp.goatdroid.fourgoats.services.LocationService">
        </action>
      </intent-filter>
    </service>
## Здесь тегом "receiver" указан Receiver, который также экспортируется, т.к. используется intent-filter.
    <receiver label="Send SMS"
              name=".broadcastreceivers.SendSMSNowReceiver">
      <intent-filter>
        <action name="org.owasp.goatdroid.fourgoats.SOCIAL_SMS">
        </action>
      </intent-filter>
    </receiver>
  </application>
## Здесь указаны разрешения, требуемые приложением.
  <uses-permission name="android.permission.SEND_SMS">
  </uses-permission>
  <uses-permission name="android.permission.CALL_PHONE">
  </uses-permission>
  <uses-permission name="android.permission.ACCESS_COARSE_LOCATION">
  </uses-permission>
  <uses-permission name="android.permission.ACCESS_FINE_LOCATION">
  </uses-permission>
  <uses-permission name="android.permission.INTERNET">
  </uses-permission>
</manifest>

Надеюсь, что я доступно объяснил, что из себя представляет файл AndroidManifest.xml.