- Как сделать API на любое Android приложение. На примере WhatsApp
- Анализ ситуации.
- 1. Официальный API
- 2. Сторонний сервис. Подключение через WhatsApp WEB
- 3. Ручной режим
- Решение
- Отправка сообщения
- Приём сообщений
- Плюсы, минусы, доработка и планы
- Chat API Android SDK for WhatsApp API
- You can customize this SDK to your needs and make it more convenient by clicking here:
- Requirements
- Installation
- Maven users
- Gradle users
- Others
- Getting Started
- Documentation for API Endpoints
- Documentation for Authorization
- instanceId
- token
- Recommendation
- Preparatory work
- The first steps for beginners
- How to Use
- 1. Starting a new project
- 2. Add reference of the library project
- 3. Write sample code
- How to Test
- Other WhatsApp API SDKs
- Ломаем софт для Android. Внедряем малварь в WhatsApp
- Содержание статьи
- WARNING
- Ищем точку входа
- Пишем payload
- Xakep #213. FUCK UAC
- Вызываем Payload
- Идем дальше
- Периодические задачи
- Выводы
- Евгений Зобнин
Как сделать API на любое Android приложение. На примере WhatsApp
Анализ ситуации.
Казалось, требуется всего лишь отправлять и принимать сообщения. А столько подводных камней…
1. Официальный API
Официального API в релизе тогда ещё не было. Но Facebook успел прислать ссылку на форму, для подключения официального API, находящегося в тестировании.
2. Сторонний сервис. Подключение через WhatsApp WEB
Рассматривал вариант «серого» способа, использование неофициального сервиса, который отправляет сообщения через WEB интерфейс, подключается сканированием QR кода.
Но это зависимость от чужого API, в любой момент может всё отвалиться, да и передавать чужому сервису номера клиентов не хотелось. А ещё писать под чужой авторский API, да ещё который придётся переписывать, при переезде на другой сервис, тоже такое себе удовольствие.
Ну и ещё требуется держать телефон включенным (хотя некоторые сервисы за доп плату решали эту проблему 🙂
3. Ручной режим
Посадить человека, пускай копипастит сообщения клиентам. Шутки шутками, а из этой идеи родилось решение!
Решение
Отправка сообщения
Есть такая программка для автоматизации действий под Android, называется Tasker, одна из первых подобных программ. Но я в ней не разобрался с первого раза… Поискал аналоги, наткнулся на программу Automagic. В ней события, действия и ветвления рисуются как блок схема.
И вот в ней я то и придумал решение, root права нам не нужны. Получилось методом научного тыка нарисовать скрипт отправки сообщения, далее буду называть поток, так именуется каждый отдельный нарисованный алгоритм в данной программе. А теперь разберём его работу:
- Каждые 5 секунд периодичным таймером генерируется событие и передаётся следующему блоку.
- Блок HTTP Request спрашивает у сервера, есть ли в очереди следующее сообщение, которое нужно отправить? Бэкенд написан на PHP.
- Парсим ответ сервера JSON.
- Если от сервера в ответе пришла метка, что нужно отправить сообщение, идём дальше.
- Проверяем, включен ли экран устройства, если нет, отправляем уведомление, с целью разбудить телефон. Если же экран включен, и не выполняется другой поток, проверяющий статус, доставлено ли сообщение, то:
- Генерируем ссылку и открываем её, что бы инициировать диалог с полученным от сервера номером телефона в WhatsApp’е
- Самое интересное. Блок Control UI. В нём в виде кода реализована логика проверки успешности открытия чата (проверка регистрации в мессенджере), вставка текста в окно ввода и клацанье по кнопке Отправить.
Приём сообщений
Принимать сообщения на много проще. Ставим событие на уведомление от мессенджера. Как только приходит уведомление, помечаем его прочитанным, и отправляем его на сервер как есть. Тот уже спарсит адресата и текст.
Плюсы, минусы, доработка и планы
Основную функцию отправки сообщения алгоритм выполняет отлично. Так как не используется WEB интерфейс, схватить баню от мессенджера тут меньше рисков, как мне кажется. Арендовал слабенький виртуальный сервер, установил туда Android и перенёс всё.
На отправку одного сообщения новому контакту уходит
5 сек. Для проверки доставки и прочтения сообщения, разработал отдельный поток, но он в черновом варианте и иногда не срабатывает. Поэтому о нём позже.
В данный момент не реализована функция приёма медиа сообщений (фото, аудио, вложения), но это можно выгружать из WhatsApp, используя кнопку поделиться сообщением в будущем.
Чуть позже хочу сверху виртуальной машины, где запущен мессенджер, написать SIP транк, через который можно будет звонить через WhatsApp как через SIP ^.^ что может сэкономить расходы на связь.
Ещё хочу делать скриншоты аватарок и отправлять их на сервер, для прикрепления миниатюры к контакту в CRM системе.
Ну и вообще самое интересное: Данный способ обёртывания в API подойдёт почти для любого приложения под Android 🙂
Всё изначально разрабатывал и запускал на Android 9, xiaomi mi 9 se, root прав нет.
UPD:
Пример на Python3.8 в качестве бекенда доступен на GitHub, доработан алгоритм ловли уведомлений и код отправки из комментариев от ivan909020
Источник
Chat API Android SDK for WhatsApp API
You can customize this SDK to your needs and make it more convenient by clicking here:
The SDK allows you to receive and send messages through your WhatsApp account. Sign up now
Download SDK and unpack the archive. Connect SDK to your project.
Requirements
Building the API client library requires Maven to be installed.
Installation
To install the API client library to your local Maven repository, simply execute:
To deploy it to a remote Maven repository instead, configure the settings of the repository and execute:
Refer to the official documentation for more information.
Maven users
Add this dependency to your project’s POM:
Gradle users
Add this dependency to your project’s build file:
Others
At first generate the JAR by executing:
Then manually install the following JARs:
Getting Started
Please follow the installation instruction and execute the following Java code:
Documentation for API Endpoints
All URIs are relative to https://api.chat-api.com
Documentation for Authorization
Authentication schemes defined for the API:
instanceId
Type: API key
API key parameter name: instanceId
Location: URL query string
token
Type: API key
API key parameter name: token
Location: URL query string
Recommendation
It’s recommended to create an instance of ApiClient per thread in a multithreaded environment to avoid any potential issues.
Preparatory work
At the very beginning, we need to connect whatsapp with our script, so as we write the code, we check its operation. To do this, go to your personal account and get a QR code there. Next, open WhatsApp on your smartphone, go to Settings -> WhatsApp Web -> Scan a QR code.
Now we need to indicate a WebHook URL so the server can run the scrip when new messages arrive. Indicate a direct link to your script. You can’t indicate server IP only, but you can indicate the port.
The first steps for beginners
The generated code uses a few Gradle dependencies e.g., Jackson, Volley, and Apache HttpClient. The reference to these dependencies is already added in the build.gradle file will be installed automatically. Therefore, you will need internet access for a successful build.
- In order to open the client library in Android Studio click on Open an Existing Android Project .
- Browse to locate the folder containing the source code. Select the location of the WhatsappAPI gradle project and click Ok .
- Upon successful import, the project can be built by clicking on Build > Make Project or pressing Ctrl + F9 .
How to Use
The following section explains how to use the WhatsappAPI library in a new project.
1. Starting a new project
For starting a new project, click on Create New Android Studio Project .
Here, configure the new project by adding the name, domain and location of the sample application followed by clicking Next .
Following this, select the Phone and Tablet option as shown in the illustration below and click Next .
In the following step, choose Empty Activity as the activity type and click Next .
In this step, provide an Activity Name and Layout Name and click Finish . This would take you to the newly created project.
2. Add reference of the library project
In order to add a dependency to this sample application, click on the android button shown in the project explorer on the left side as shown in the picture. Click on Project in the drop down that emerges.
Right click the sample application in the project explorer and click on New > Module as shown in the picture.
Choose Import Gradle Project and click Next .
Click on Finish which would take you back to the sample application with the refernced SDK.
In the following step first navigate to the SampleApplication > settings.gradle file and add the line
implementation project(path: ‘:WhatsappAPILib’)«` to the dependencies section as shown in the illustration below. Also add the following packagingOptions.
packagingOptions exclude ‘META-INF/LICENSE’ exclude ‘META-INF/NOTICE’ exclude ‘META-INF/DEPENDENCIES’ >
Finally, press Sync Now in the warning visible as shown in the picture below.
3. Write sample code
Once the SampleApplication is created, a file named SampleApplication > app > src > main > java > MainActivity will be visible in the Project Explorer with an onCreate method. This is the entry point for the execution of the created project. Here, you can add code to initialize the client library and instantiate a Controller class. Sample code to initialize the client library and using controller methods is given in the subsequent sections.
How to Test
The generated code and the server can be tested using automatically generated test cases. JUnit is used as the testing framework and test runner.
In Android Studio, for running the tests do the following:
- Right click on SampleApplication > WhatsappAPILib > androidTest > java) from the project explorer.
- Select «Run All Tests» or use «Ctrl + Shift + F10» to run the Tests.
Other WhatsApp API SDKs
You can configure the SDK or generate other SDKs in 30+ programming languages: Chat API SDK generator.
Источник
Ломаем софт для Android. Внедряем малварь в WhatsApp
Содержание статьи
В прошлый раз мы разобрались, как взламывать приложения для Android. В большинстве случаев сделать это очень легко. Сегодня мы пойдем намного дальше и модифицируем одно очень известное приложение, заставив его сливать на сторону все входящие СМС и отправлять СМС на короткие номера. И опять же сделать это будет совсем нетрудно.
Напомню, что с прошлого набега на чужой софт у тебя должны были остаться несколько инструментов, а также алиасы в
/.bashrc, необходимые для их быстрого запуска. Все это пригодится тебе и сегодня. Кроме того, в этот раз тебе понадобится среда разработки Android Studio. В статье я буду исходить из предположения, что сама Android Studio установлена в каталог
/Android/android-studio, а SDK, то есть набор компиляторов и инструментов сборки, — в каталог
Что касается софта, который мы будем препарировать, я предлагаю остановиться на WhatsApp — мегапопулярном приложении, которое входит в топ-10 всех магазинов приложений за все времена и, конечно же, нередко становится целью хакеров, внедряющих в него самые разные гадости. Так что статья получится более чем наглядной.
WARNING
Ищем точку входа
Как и в прошлый раз, идем на apkpure.com, вбиваем в строку поиска адрес WhatsApp в Google Play и скачиваем пакет APK. Для удобства переименовываем его в whatsapp.apk и перемещаем в каталог
/tmp. Всю дальнейшую работу мы будем вести в нем.
Следующий шаг — найти наилучшее место для внедрения нашего зловредного кода. По объективным причинам такое место — это самое начало кода приложения, и если бы мы имели дело с обычной настольной Java, то это был бы метод main() главного класса приложения. Однако в Android исполнение приложения начинается не с main() . Фактически у здешнего софта вообще нет единой точки входа, оно состоит из множества компонентов, каждый из которых может получить управление при возникновении того или иного события.
Если мы хотим, чтобы наш код запускался при старте приложения с рабочего стола, нам нужно вставить его в класс, получающий управление при возникновении события (если быть точным, это называется «интент») android.intent.action.MAIN категории android.intent.category.LAUNCHER . Чтобы найти этот класс, придется дизассемблировать WhatsApp с помощью apktool и прочитать файл AndroidManifest.xml :
Искомый класс носит имя com.whatsapp.Main. Открываем
/tmp/whatsapp/smali/com/whatsapp/Main.smali и ищем метод OnCreate() :
Это и есть искомая точка входа. C этого метода начинается исполнение графического Android-приложения, когда оно получает интент android.intent.action.MAIN , другими словами — когда юзер тапает по иконке приложения пальцем. В этот метод мы будем внедрять наш payload.
Пишем payload
Какой же код мы внедрим в WhatsApp? Для начала заставим его вывести на экран сообщение «Hi from malware!». Очень простая в реализации функция, которая позволит быстро проверить, что все работает так, как мы и рассчитывали. Если ты читал прошлую часть, то уже должен догадаться, как это сделать. Но не стоит торопиться, в этот раз мы не будем вставлять в код отдельные куски smali-кода, а вместо этого создадим отдельный класс, методы которого уже и будем вызывать из кода WhatsApp. Такой подход гораздо более удобен и позволяет как угодно расширять функциональность приложения, внося в его оригинальный код минимальные изменения.
Итак, открываем Android Studio, создаем новый проект, в поле Application name пишем Whatsapp, а в поле Company domain — com. Таким образом среда разработки сама разместит наш класс в пакете com.whatsapp, точно так же, как в оригинальном приложении. При выборе типа активности (Add an activity) выбираем Add No Activity. В левой части экрана разворачиваем список app → java → com.whatsapp и с помощью правой кнопки мыши создаем новый класс Payload. Добавляем в него следующие строки:
Простейший payload
Xakep #213. FUCK UAC
Это и есть наш класс с единственным статическим методом, выводящим на экран сообщение. Теперь класс необходимо скомпилировать и транслировать в байт-код Dalvik. С помощью среды разработки без танцев с бубном это не получится, поэтому сделаем все из командной строки.
Для начала создадим в
/tmp структуру каталога, аналогичную оригинальному приложению, и скопируем в нее исходный код класса:
Теперь скомпилируем его и транслируем в код Dalvik:
Обрати внимание на android-23 и 23.0.3 в путях: чтобы они существовали, у тебя должен быть установлен SDK для Android 6.0 и соответствующие инструменты сборки (при первом запуске Android Studio предложит установить их сама).
В текущем каталоге (
/tmp ) должен появиться файл Payload.dex . Его необходимо дизассемблировать:
И скопировать в каталог с ранее дизассемблированным кодом WhatsApp:
Вызываем Payload
Теперь в дизассемблированном коде WhatsApp есть наш класс, осталось только вызвать его статический метод run() . Чтобы это сделать, достаточно добавить следующую строку куда-то в начало метода onCreate() :
На Java этот код выглядел бы так:
То есть инструкция invoke-static, по сути, имеет такой вид:
Регистр p0 , который мы передали в качестве аргумента, всегда ссылается на текущий объект и эквивалентен ключевому слову this в Java. Текущий объект в данном случае имеет класс Activity, мы передаем его методу run() нашего класса, чтобы он смог использовать его для вывода сообщения на экран.
Метод OnCreate() с нашим кодом
Все, осталось только собрать WhatsApp обратно в APK и подписать тестовым ключом:
Полученный файл whatsapp-payload.s.apk закидываем на карту памяти и устанавливаем.
Сработало!
Идем дальше
Какой же это зловред, если вместо кражи личной информации он только и делает, что сообщает о себе? Полностью согласен, поэтому сейчас мы существенно расширим возможности нашего payload. Он никак не будет выдавать своего присутствия, а вместо этого просто скинет все входящие СМС в файл на карте памяти:
Данный код читает базу данных СМС и записывает на карту памяти красивый текстовый файл sms.txt , содержащий СМС в формате:
При необходимости код можно дополнить, чтобы файл сразу сливался на удаленный сервер, а затем уничтожался, дабы не оставлять следов. Чтобы код заработал, в манифест приложения (
/tmp/whatsapp/AndroidManifest.xml ) необходимо добавить разрешение на чтение СМС:
Далее остается только скомпилировать класс, перегнать в smali, скопировать в приложение, собрать и подписать его, так же как мы делали это в предыдущем разделе. Организовать отправку СМС на короткий номер и того проще:
Причем в этом случае даже не надо править AndroidManifest.xml — права на отправку СМС у WhatsApp уже есть.
Файл sms.txt, сформированный нашим кодом
В целом все просто, но есть одно большое но! Дело в том, что два приведенных выше куска кода будут отлично работать только до тех пор, пока ты не установишь хакнутый WhatsApp на смартфон под управлением Android 6.0 и выше. А тогда приложение упадет на старте, и причина в том, что «шестерка» требует явного запроса прав (в том числе на чтение СМС и запись на карту памяти) перед тем, как функции, защищенные этими правами, будут использованы.
И здесь мы попадаем в одну не очень приятную ситуацию. Запросить-то права мы можем, вот только сама система запроса права реализована не в нашу пользу, потому как событие «Пользователь нажал на „Да“» может быть обработано только активностью приложения с помощью колбэка onRequestPermissionsResult() . Другими словами, придется вносить изменения в сам Main.smali .
Но есть способ проще и тупее. На самом деле нам совсем необязательно дожидаться, пока юзер нажмет кнопку «Да» или «Нет», после нажатия система так или иначе либо даст разрешение на выполнение операции, либо запретит, поэтому мы можем просто подождать и после этого проверить, есть ли у нас нужные права:
Данный код проверяет, запущен ли он в Android 6 или выше (API 23), и если да, то запускает код запроса разрешений на чтение СМС и запись на карту памяти, затем засыпает на десять секунд, а просыпаясь, проверяет, есть ли права (то есть нажал ли юзер «Да»). Если есть — отрабатывает уже знакомый нам код, нет — ничего не происходит.
Профессиональные программисты сожрут меня живьем за усыпление основного потока приложения, но мы здесь не в чемпионате на правильный код участвуем, главное, чтобы payload отработал, на остальное наплевать.
Периодические задачи
Проблема текущей реализации payload в том, что он будет запущен только во время холодного старта приложения, то есть при первом запуске, запуске после перезагрузки либо после того, как приложение будет вытеснено из памяти системой. Для одноразовой задачи это нормально, но что, если нам необходимо, чтобы наш зловред работал в фоне?
Для этого можно использовать сервис, то есть специальный поток, который будет висеть в фоне и делать нужную нам работу. Однако для нашей задачи это слишком избыточное решение. Гораздо удобнее использовать AlarmManager — специальную подсистему Android, позволяющую запускать нужный код через определенные интервалы. В отличие от сервисов AlarmManager не требует модификации AndroidManifest, достаточно просто привести код класса Payload к следующему виду:
Метод run() устанавливает Alarm, который должен срабатывать каждую минуту (60 * 1000 мс) и запускать код, указанный в методе onReceive() . Красота этого подхода в том, что после установки Alarm’а он будет срабатывать вне зависимости от того, запущено ли приложение. То есть, если пользователь запустил хакнутый WhatsApp, а затем закрыл его, а система завершила WhatsApp при нехватке памяти, он вновь будет запущен в фоне, когда сработает Alarm.
Выводы
Как видишь, внедрить собственный код в чужое приложение не просто реально, а реально настолько, что с этой задачей справится даже ребенок. Все, что нужно, — знать основы программирования для Android и чуть-чуть понимать код smali. И тогда открываются просто безграничные возможности модификации других приложений. К примеру, можно реализовать систему загрузки полноценных плагинов, о чем я уже писал, или даже получить root, скачать и установить APK с вирусом в системный раздел.
За сим откланиваюсь. Встретимся в следующей статье цикла!
Евгений Зобнин
Редактор рубрики X-Mobile. По совместительству сисадмин. Большой фанат Linux, Plan 9, гаджетов и древних видеоигр.
Источник