Smali - Decompiling/[Modifying]/Compiling
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Іноді цікаво модифікувати код програми, щоб отримати приховану інформацію (можливо, добре обфусцировані паролі або прапори). Тоді може бути цікаво декомпілювати apk, модифікувати код і знову скомпілювати його.
Справочник опкодів: http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
Використовуючи Visual Studio Code та розширення APKLab, ви можете автоматично декомпілювати, модифікувати, скомпілювати, підписати та встановити програму без виконання будь-якої команди.
Ще один скрипт, який значно полегшує це завдання, - https://github.com/ax/apk.sh
Використовуючи APKTool, ви можете отримати доступ до smali коду та ресурсів:
Якщо apktool видає будь-яку помилку, спробуйте встановити остання версія
Деякі цікаві файли, на які варто звернути увагу:
res/values/strings.xml (та всі xml-файли всередині res/values/*)
AndroidManifest.xml
Будь-який файл з розширенням .sqlite або .db
Якщо apktool
має проблеми з декодуванням програми, ознайомтеся з https://ibotpeaches.github.io/Apktool/documentation/#framework-files або спробуйте використати аргумент -r
(Не декодувати ресурси). Тоді, якщо проблема була в ресурсі, а не в вихідному коді, ви не матимете проблеми (також не декомпілюватимете ресурси).
Ви можете змінювати інструкції, змінювати значення деяких змінних або додавати нові інструкції. Я змінюю код Smali, використовуючи VS Code, потім ви встановлюєте розширення smalise, і редактор повідомить вас, якщо будь-яка інструкція є некоректною. Деякі приклади можна знайти тут:
Або ви можете перевірити нижче деякі пояснені зміни Smali.
Після модифікації коду ви можете перекомпілювати код, використовуючи:
Це скомпілює новий APK всередині папки dist.
Якщо apktool видає помилку, спробуйте встановити остання версія
Потім вам потрібно згенерувати ключ (вас попросять ввести пароль та деяку інформацію, яку ви можете заповнити випадковим чином):
Нарешті, підпишіть новий APK:
zipalign - це інструмент вирівнювання архівів, який забезпечує важливу оптимізацію для файлів Android додатків (APK). Більше інформації тут.
Якщо ви надаєте перевагу використовувати apksigner замість jarsigner, вам слід підписати apk після застосування оптимізації з zipalign. АЛЕ ЗВЕРНІТЬ УВАГУ, ЩО ВИ МАЄТЕ ПІДПИСАТИ ЗАСТОСУВАННЯ ТІЛЬКИ ОДИН РАЗ З jarsigner (перед zipalign) АБО З aspsigner (після zipalign).
Для наступного коду Hello World на Java:
Код Smali буде:
Набір інструкцій Smali доступний тут.
Деякі змінні визначені на початку функції за допомогою опкоду const, ви можете змінити їх значення або визначити нові:
Рекомендації:
Якщо ви збираєтеся використовувати оголошені змінні всередині функції (оголошені v0,v1,v2...) помістіть ці рядки між .local <number> та оголошеннями змінних (const v0, 0x1)
Якщо ви хочете вставити код логування в середині коду функції:
Додайте 2 до кількості оголошених змінних: Наприклад: з .locals 10 до .locals 12
Нові змінні повинні бути наступними номерами вже оголошених змінних (в цьому прикладі це повинні бути v10 та v11, пам'ятайте, що починається з v0).
Змініть код функції логування та використовуйте v10 та v11 замість v5 та v1.
Пам'ятайте, щоб додати 3 до кількості .locals на початку функції.
Цей код підготовлений для вставки в середину функції (змініть номер змінних за необхідності). Він візьме значення this.o, перетворить його на String і потім зробить toast з його значенням.
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)