Многие видели демо-видео персонального ассистента Hound, который по возможностям не уступает, и даже опережает такие известные приложения, как Google Now и Siri. Также Hound доступен свободно для скачивания на Google Play (на территории US), но, к сожалению, он находится в стадии разработки и требует инвайта при запуске.
У меня сразу зачесались руки срочно протестировать это чудо, и, устав ждать инвайта по почте (примерно через минуту), я взялся за дебаггер… который мне так и не понадобился, поскольку все оказалось проще, но об этом по порядку.
Примечание: я не являюсь профессиональным разработчиком на Android, взломщиком и прочее, все выполняется для удовлетворения собственного любопытства и на свой страх и риск. О любых неточностях сообщайте в комментариях или в личных сообщениях.
Первым делом, необходимо получить apk файл с приложением. Можно поискать в интернете, но мы не ищем легких путей. Я скачал последнюю версию из Google Play и вытащил приложение из папки /data/app/com.hound.android.app-1 (необходимы права администратора, т.е. root).
Любое приложение для Andoid представляет собой apk файл, который на самом деле является переименованным zip архивом. Если открыть его любым архиватором, мы увидим такую картину:
Рассмотрим содержимое поподробнее:
- assets — хранит в себе разнообразные файлы, которые приложение может использовать по своему усмотрению, например, в нашем случае здесь лежат шрифты
- lib — здесь хранятся сторонние библиотеки в виде .so файлов.
- META-INF — здесь содержатся метаданные о apk файле, такие как SHA1 хеш каждого файла и подпись разработчика. Таким образом, нельзя изменить приложение, не сломав подпись. Можно подписать его заново, своей подписью, но оно Android не даст установить его поверх оригинальной версии, поэтому ее надо удалить перед установкой.
- res — здесь находятся некоторые ресурсы приложения, такие как изображения и xml файлы, содержащие информацию о внешнем виде приложения.
- AndroidManifest.xml — вся служебная информация о приложении, версия, разрешения и многое другое.
- classes.dex — а вот то что нам нужно, в этот файл упакованы все исполняемые файлы приложения (классы), написанные на языке Java.
- resources.arsc — это тоже ресурсы приложения, только в скомпилированном виде, а вот чем они отличаются от тех, что в папке res, мне не известно.
Нам повезло, почти все приложение, за исключением сторонних библиотек, написано на Java, а значит нам не нужно сидеть в отладчике и дизассемблировать низкоуровневый код.
Теперь необходимо распаковать classes.dex и попытаться вытащить из него код. Для этого используем Apktool. Со страницы «Install» качаем исполняемый jar файл, а также обертку для его использования из командной строки. Достаточно скопировать оба файла в папку с приложением (или добавить в переменную окружения) и выполнить следующую команду:
apktool -r decode имя_файла.apk
Параметр -r необходим, чтобы не тратить время на распаковку ресурсов, которые мы не будем редактировать.
Теперь в папке, одноименной с названием приложения, мы видим уже чуть больше, чем в архиваторе. Файл classes.dex теперь отсутствует, а вместо него появилась папка smali, в которой хранятся классы в виде текстовых файлов. Но погодите, а где же Java? Вокруг одни файлы с расширением .smali, в которых хранится что-то отдаленно похожее на ассемблер.
Это — язык опкодов Dalvik, в который компилируется Java код. Есть приложения, которые могут попытаться восстановить исходный код из этих файлов, но надо же потом изменять этот код, а пересборка из Java кода — дело неблагодарное. Поэтому будем разбираться в smali коде, благо он довольно понятный, а также в нем остались нетронутыми названия функций. Чем мы и воспользуемся.
Найдем код, который отвечает за доступ в приложение. Зная название приложения и английский язык становится понятно, что основные классы приложения находятся в папке smali/com/hound/android/appcommon. Проблема состоит в том, чтобы найти то место, где проверяется наличие инвайта. Нам поможет поиск по файлам, например, в Windows можно использовать команду:
findstr /s /i /m искомая_строка *.*
В коде может быть как «invite», так и «invitation», поэтому выкинем последнюю букву из слова и будем искать «invit». Бинго, вот оно, метод isInvitationComplete() в файле smali/com/hound/android/appcommon/app/Config.smali:
.method public isInvitationComplete()Z
.locals 2
.prologue
.line 578
const v0, 0x7f080174
const v1, 0x7f0b001f
invoke-direct {p0, v0, v1}, Lcom/hound/android/appcommon/app/Config;->getBoolean(II)Z
move-result v0
return v0
.end method
В нем запрашивается булева переменная из параметров приложения и возвращается ее значение. Но зачем нам такие сложности! Давайте всегда будем возвращать true. Заменим «move-result v0» на «const/4 v0, 0x1» и сохраним файл. Будем надеятся, что все приложение полагается на эту маленькую функцию, которая отныне будет считать нас полноправными бета-тестерами.
Остается только собрать приложение обратно. Используем снова замечательную утилиту Apktool:
apktool -r build имя_папки
Не забудьте, что нам нужна вся папка, распакованная до этого, а не только smali. После того, как apktool закончит работу, заходим в эту папку, затем в dist, где находится собранный apk файл.
И он не будет работать, а точнее, не установится. Мы изменили содержимое приложения, а значит подпись теперь недействительна. Необходимо заново подписать приложение. Если вы являетесь разработчиком под Android, можете воспользоваться собственной подписью и Android SDK. Но у многих нет ни того, ни другого, им можно использовать тестовую подпись, и отдельно взятую из SDK утилиту signapk.jar. Также есть утилита sign.jar, в которую уже встроена подпись. Достаточно выполнить следующую команду:
java -jar sign.jar имя_файла.apk
Рядом появится файл имя_файла.s.apk, который и будет подписанным приложением. Закачиваем его на устройство, устанавливаем, и радуемся полностью рабочему приложению!
А можно просто найти в интернете пропатченную версию, которую кто-то недавно выложил.
Комментарии (9)
grozaman
06.06.2015 11:51+4И как оно? Поспрашивали? Всё как на ролике?
VaMpir
06.06.2015 13:17+2Я проверял. Правда ставил по инструкции с xda, где не нужно патчить, а просто изменить файл конфигурации.
В принципе, учитывая моё довольно корявое произношение, распознавание более-менее нормально (правда не всегда). Что касается поиска, то, насколько понял, заточено в основном на энциклопедические и календарные данные (города, столицы и т.д., как в ролике) и, как ни странно, музыку. На простых запросах, типа «Where is California?», «What is the capital of United States?» выдавал в первом случае карту с Калифорнией, в втором — надпись «Capital of Unites States is Washington» и таблицу с данными о США (население, площадь) и т.д.
Проверил также календарные данные, типа «How many days between today and the day after tomorrow», отвечает правильно, 2 дня. Даже распознало фразу «What day of week was september,12, 2002?» и выдало правильный ответ («September 12, 2002 was on Thursday»).
К сожалению, более сложные и длинные фразы протестировать не смог, потому что с моим произношением при длине фразы больше 7-8 слов распознавало правильно в лучшем случае пару слов, и, не в силах найти ответ, перебрасывало на поисковик (Bing).
AndreWin
06.06.2015 17:07Все читают теги!)
Кстати, вроде действия, описанные в статье, взломом не являются. Поправьте меня, если это не так (я не программист).dbanet
06.06.2015 18:44+1А чем же ещё это является? :)
Загрузить бинарник в IDA, найти функцию проверки ключа поиском по строке, а потом в HIEW по байтам заменить — это ж всегда было любимое дело.
А это — ну, мабильные погромисты, ондройды всякие — современный вариант.
lostpassword
Прикольно.
ИМХО, пост вполне Хабра достоин. Даже немного странно, что он здесь.)
noxwell Автор
На хабре у меня есть публикация, а здесь еще нет, из-за этого на моей учетной записи всякие ограничения, касающиеся кармы. А так бы я конечно опубликовал статью на хабре.