Как я могу подсчитать вызовы методов внутри APK? (в формате .smali)

Я пытаюсь разработать инструмент, который в основном анализирует APK приложения для Android и подсчитывает количество вызовов определенного метода API (например, android.app.AlarmManager.set())

<сильный>1. Какой подход вы рекомендуете?

До сих пор я использовал APKTool, и теперь у меня есть .smali файлов. Однако для одного и того же источника Java у меня может быть несколько файлов:

  • ExportAsyncTask$1.smali
  • ExportAsyncTask$2.smali
  • ExportAsyncTask$3.smali
  • ExportAsyncTask$4.smali

<сильный>2. Что означают эти несколько файлов?

<сильный>3. Полученные файлы .smali также включают внешние библиотеки, которые я хотел бы исключить из анализа. Как мне это сделать?


person Luis Cruz    schedule 24.01.2017    source источник


Ответы (1)


<сильный>1. Какой подход вы рекомендуете?

Да, Apktool можно использовать для вашей задачи. Каждый класс java в APK будет представлен файлом .smali в дереве каталогов, представляющим пакеты. Smali — это язык виртуальной машины Android. Этот язык намного проще, чем Java, и, следовательно, его легче анализировать. В вашем случае вы должны искать invoke кодов операций и Landroid/app/AlarmManager;->set строк. Если вы работаете в Linux, вы можете, например, grep и посчитать их. В Windows у вас есть текстовые редакторы, такие как Notepad++, которые позволяют выполнять текстовый поиск в нескольких файлах.

<сильный>2. Что означают эти несколько файлов?

В Java есть внутренние классы и неявные внутренние классы. Первая появится в OutherClass$InnerClass.smali, а вторая, не имеющая собственного имени, получит номера, например OuterClass$1.smali. Иногда вы даже получаете более глубокие уровни, такие как a$b$c$1.smali.

<сильный>3. Полученные файлы .smali также включают внешние библиотеки, которые я хотел бы исключить из анализа. Как мне это сделать?

У вас нет точного способа сделать это. Но вообще говоря, когда вы смотрите на дерево пакетов/каталогов многих образцов, вы обычно улавливаете закономерность. Например. обычно код приложения находится в пакете com.*, а android.*, org.* и uk.* включают библиотеки. После такой проверки вы просто исключаете эти каталоги из поиска.

person Ilia Barahovski    schedule 24.01.2017