Nida - це легка та потужна бібліотека для пентесту та реверс-інжинірингу Android додатків прямо під час виконання
Інструмент дозволяє проводити аналіз і пентест там, де класичні засоби безсилі, інструмент дозволяє отримати дані, які приховані за лаштунками, легко орієнтуватися в обфусфікованих класах, логувати виконання методів, їх аргументи, проливати світло на методи, що викликаються через рефлексію, складати карту виколення коду і гнути додаток під себе.
- Завантажте актуальний .jar файл у Releases
- Підключіть залежність у Gradle
implementation(files("/your/path/nida.jar"))
NidaAPI.initialize(/*Your Context */getApplicationContext());
NidaAPI.profile(Toast.class.getDeclaredMethod("show"), new ProfileListener() {
@Override
public void onProfileComplete(ProfileData profileData) {
Log.i("NidaProfiler", profileData.toString());
}
});
у цьому прикладі ми профільуємо метод show у класі Toast, після виконання отримуємо ProfileData який містить
- getExecutionTime()
- getUsedMemory()
- getMember()
- getCurrentThread()
При використанні цього методу цiль перестає виконувати логіку
NidaAPI.disable(Toast.class.getDeclaredMethod("show"));
NidaAPI.trace(Toast.class.getDeclaredMethod("show"));
для перегляду трасувальних даних необхідно активувати UI панель (Активація панелі та що входить до трасувальних даних див. нижче)
Application клас
NidaMain.startMyEngineFromApplication(this);
або
Activity клас
NidaMain.startMyEngine(this);
При створенні Nida була задіяна концепція NEIP (Nida Easy Inject Policy), завдяки ній процес інжектування вийшов неймовірно простий, а бібліотека легкою, менше 1МБ. Концепція повністю забороняє використання сторонніх бібліотек при розробці, щоб уникнути збільшення розміру та конфліктів класів при інжекції у додаток. Суть легкого інжектування зводиться до того, що всі файли підтримки бібліотеки упаковані в один файл .dex, зображення, шрифти, .so файли нативної підтримки, все це було упаковано в один файл, навіть дизайн панелі був повністю побудований на Java.
Для Activity класу
invoke-static {p0}, Lnida/mmp/main/NidaMain;->startMyEngine(Landroid/app/Activity;)V
Або якщо хочете викликати з Application
invoke-static {p0}, Lnida/mmp/main/NidaMain;->startMyEngineFromApplication(Landroid/app/Application;)V
Дозволяє запускати потрібну програму у віртуальному контейнері, встановлюючи міст із сервісом Nidа. Не вимагає прямого втручання у додаток, зберігаючи його цілісність.
Можна використовувати різні патчери, наприклад, Odex Patcher
При запуску програми з'являється плаваюче вікно, яке супроводжуватиме вас у кожній Activity
Ось як виглядає головне меню Nida:
Тут ви побачите всі класи, які присутні в додатку. У списку є системні класи Android SDK & JDK. Nida уважно стежить за динамічним підвантаженням коду з dex, тому автоматично додає класи, яких немає у додатку до списку. Не важливо, якими класами ви хочете маніпулювати - системними або звичайними, всі вони рівні перед Nida. Особливу увагу було приділено UI частини Nida та швидкому орієнтуванню за класами. Для багатозадачності була зроблена система вкладок: в одній вкладці переглядаємо члени класу, в іншій трасувальні дані - все просто.
При відкритті класу ми бачимо всі його нутрощі: поля, конструктори, методи.
Огляд виконаний у стилі IDE від JetBrains
Розглянемо по порядку взаємодію з членами класу
Nida автоматично підвантажуватиме статичні поля
При натисканні на полі можна вибрати пункт Set та динамічно задати його значення
Якщо поле має примітивний тип, можна вписати дані вручну, щоб Nida їх спарсила. Якщо поле залежить від певного об'єкта, ми можемо вибрати його з будь-якого класу привівши ініціалізацію.
При натисканні методу можна вибрати відразу кілька пунктів
Логується кожен виклик методу, в дані входять:
- Назва методу
- Час виконання
- Аргументи, які отримав метод
- Результат виконання методу
- Повний StackTrace методу
У додаткових опціях трасування можна вибрати збереження аргументів або результату виконання методу в пам'ять Nida. Збережені об'єкти будуть доступні для повторного використання та взаємодії.
У списку StackTrace можна перейти на будь-який клас і метод, звідки здійснювався виклик.
Доступно три опції інжектування:
- Before method call (Виконує виклик методу, що інжектується, до виклику цiлi)
- After method call (Виконує виклик методу, що інжектується після виклику цiлi)
- Replace method call (Заміна значення методу, що повертається, доступна мапіпуляція аргументами методу)
Розглянемо всі варіанти:
- Можна виконати наш Inject метод усередині цільового. Наприклад, підключивши свій dex file, вибрати клас, метод, провівши ініціалізацію.
- Заміна об'єкта, що повертається цільовим методом.
- Можна спарсити примітивний об'єкт, або вибрати вручну з іншого класу. Якщо потрібно, можна перехопити і змінити аргументи, що передаються методу.
- Можна викликати метод N кількість разів, є можливість збереження повернутого значення в пам'ять Nida.
У цьому розділі ви можете додавати свої dex файли, Nida автоматично проіндексує їх та включить до складу програми.
Показує до яких методів і звідки додаток звертався через рефлексію
Повноцінне редагування розмітки активності. Після натискання на будь-який елемент екрана відкривається панель з інформацією про елемент, у списку є атрибути, які можна динамічно змінювати.
- Підтримка трасування .so файлів
- Режим де-обфускації імен класів
- Розширення функцій View editor
- Пiдтримка Kotlin класiв
- Міграція на Kotlin
- Трасування мережі, емулювання вхідних та вихідних запитів
- Динамічне редагування smali з використанням кодогенерації