Модифікація Android
Декілька років тому, коли я вперше познайомився з Android, я почув від свого колеги по роботі, що Android передбачає можливість встановлення модифікованих або саморобних прошивок. Зізнатись, тоді я був далекий від цього. І навіть півроку тому мене ледве цікавили подібні речі. Глибоко в душі, я був певен: те, що робить виробник, вже призначено для нормального використання.
У цій серії статей йтиметься про те, як робити reverse програмування для Android, реалізовувати патчі, твікі та моди.
І так! Давайте спершу визначимося з поняттями, які будуть використовуватись у цій статті. Ваше звичне розуміння при цьому може сильно відрізнятися.
Патч- Зміна або заміна існуючого програмного коду з метою модифікації алгоритму програми.
Мод— зазвичай додавання додаткового функціоналу в існуючий програмний код без зміни алгоритму.
Твік— удосконалення функціоналу програми з метою полегшення доступу до параметрів системи.
Підготовка середовища
1.Android SDK. Це середовище розробки додатків для Андроїд. Для того, щоб робити модифікації, нам обов'язково доведеться перевіряти наш програмний код. Середовище розробки є найкращим, що ми можемо використовувати.
2.Android Kitchen. Дана утиліта дозволить вам працювати з образами системних партій офіційної або неофіційної прошивки.
3.JD-GUI. Декомпілятор програмного коду Java. Відразу зазначу, що це найкращий декомпілятор щодо зручності використання.
4.DJ Java Decompiler. Ще один декомпілятор, або дизассемблер, як дехто любить називати, програмного коду мови Java. Не зручний у плані використання, алеРозбирає код, який іноді не розуміє JD-GUI.
5.smali. Ще один дизассемблер, але вже дальвік коду. smali потрібен для дизассемблирования, а backsmali асемблювання коду.
6.dex2jar. Утиліта для конвертації виконуваних файлів коду Dalvik.
Перетворення прошивки
Після того, як прошивка з оптимізованого вигляду (ODEX - оптимізований dalvik виконуваний код, якщо мені не змінює пам'ять) стала DEODEX (тобто НЕ оптимізованою), всі файли, що виконуються, готові до модифікації.
Безпосередньо модифікації
Створення патчів
1. Зробити DEODEX всієї прошивки
3. З кожного файлу, що знаходиться в /system/framework, витягнути файл classes.dex і переконвертувати в JAR за допомогою dex2jar.
4. Кожен отриманий JAR відкрити в JD-GUI та пере-зберегти у вихідний код
5. Розпакувати вихідний код із архіву.
У результаті вийшло стільки папок, скільки було JAR файлів в /system/framework, і кожна папка мала структуру вихідних кодів Java.
Шляхом нескладних маніпуляцій, я швидко знайшов місце, яке генерувало записи в logcat.
Не розглядатимемо всю логіку заборони, тому що для кожного випадку це окрема історія. Мені довелося витратити пару годин, перш ніж я знайшов де проводяться перевірки, побудувати в голові блок схему алгоритму і зрозуміти куди треба лізти, щоб трохи «попсувати» алгоритм.
Код знаходився у файліHTCExtension.jar, а клас, який містив цю підпрограму, знаходився в\com\htc\util\contacts\BuildUtils$Customization.java
Розпакування та аналіз оригінального файлу
1. Спершу нам треба взяти оригінальний DEODEX JAR файл, який відповідає за потрібну частину коду. Унашому випадкуHTCExtension.jar.
2. Відкрити будь-яким архіватором та витягнути від туди classes.dex
3. За допомогою конвертера dex2jar перетворити його на JAR файл. Команда: dex2jar.bat classes.dex
4. Відкрити отриманий файл classes_dex2jar.jar в JD-GUI.
6. Щоб зробити патч, нам треба дизасемблювати сам код Dalvik. Для цього використовуємо baksmali. Найзручніше створити окрему папку і покласти туди три файли разом:HTCExtension.jar,smali.jarтаbaksmali.jar. Даємо команду java -Xmx512m -jar baksmali.jar -a -d -o HTCExtension -x HTCExtension.jar
- це API вашої версії Android. Для JB це 16
- Папка, де знаходяться всі фреймворки прошивки.
У моєму випадку це була команда
java -Xmx512m -jar baksmali.jar -a 16 -d S:\dev\Android\Android-Kitchen\WORKING_JB_15\system\framework -o HTCExtension -x HTCExtension.jar
7. У нашій новоствореній папці з'явилася папка HTCExtension, а в ній наші файли з кодом Dalvik.
8. Шукаємо файл шляхом\com\htc\util\contacts\BuildUtils$Customization.javaі дивимося код:
9. Страшно, чи не так? Нічого не зрозуміло. Але, ця справа можна виправити. Створивши кілька своїх патчів і набивши цим руку, ви легко зможете модифікувати Android код без сторонніх засобів. У нашому випадку, у цьому коді
10. Найпростіший спосіб врятувати отця української демократії, це змінити код на наступний:
тобто змінити значення змінної з 1 на 0. Тобто що б не було, завжди б поверталося значення FALSE і в JD-GUI код виглядав би як
11. Так, метод працюватиме. Але ж ми не шукаємо легких шляхів — це раз. По-друге, не зовсім красиво. Хочеться коду щось на зразок
12. Як нам отримати Dalvik код цього вихідного коду? Для новачків ми зробимо невеликий трюк.
Створення коду Dalvik
1. Відкриваємо Android SDK.
2. Створюємо новий проект і в наш єдиний тестовий клас пишемо наступний код
3. Компілюємо наш проект і потім беремо зібрану програму з робочої області.
4. Кладемо зібраний додаток до папки, де ми з вами потрошили JAR файл.
5. Даємо команду java -Xmx512m -jar baksmali.jar -a -d -o test -x test .apk
6. Ми дизассемблировали щойно зібраний додаток у Dalvik код.
7. Відкриваємо наш файлик test.smali і бачимо там код
8. Все, код для патчингу готовий.
Накочування патчу
1. Dalvik код засмічений маркерами, що вказують на рядок коду в оригінальному вихідному файлі. Це потрібно при виведенні помилок, якщо такі є у вашій програмі. Без вказівок рядків код також чудово працює.
2. Видаляємо рядки з нумерацією рядків, копіюємо та замінюємо метод (підпрограму) у нашому\com\htc\util\contacts\BuildUtils$Customization.javaфайлі.
Компіляція та складання патченого JAR файлу
1. За допомогою backsmali ми розпатрали наш JAR файл, а тепер його треба зібрати назад.
2. Даємо команду java -Xmx512m -jar smali.jar -a 16 HTCExtension -o classes.dex
3. У нашій татці з'являється файлик classes.dex
4. Знову відкриваємоHTCExtension.jarфайл архіватором і замінюємо в ньому існуючийclasses.dexна наш щойно створений.
5. Все, нашHTCExtension.jarмістить модифікований програмний код.
Заміна оригінального файлу на патчений
Зазвичай для рядових користувачівстворюються спеціальні скрипти, які за допомогою recovery замінюються. Але нам таке не цікаво. По-перше, довго і нудно, по-друге ми ж досвідчені користувачі і можемо собі дозволити деякі тонкощі для модифікації прошивки Android.
1. Замінити поточний робочий файл можна наступними командами, якщо у вас вже стоїть прошивка DEODEX і є root доступ:
- Перша команда закидає патчений файл на флешку
- Друга команда відкриває shell
- Третя команда дає root доступ
- Четверта команда монтує систему в режим читання/запису
- П'ята команда створює резервну копію файлу
- 6-а команда перезаписує існуючий файл новим патченим.
- 7-а команда налаштовує дозволи
- 8-а команда видаляє кеш
- 9-а команда робить перезавантаження пристрою.
2. Спасибі, що дочитали до цього пункту, залишилося небагато.
3. Після перезавантаження ваш новий патчений код набуде чинності.
4. Якщо код не працює або вискакує помилка, шляхом не хитрих комбінацій можна повернути назад резервну копію.