0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Что такое Root-права и как их получить на Android: инструкция

Что такое Root-права и как их получить на Android: инструкция

Root-доступ становится все более популярным среди пользователей операционной системы Android, ведь открывает перед обычным пользователем практически неограниченные возможности операционки. Техно 24 подготовил для вас самое интересное о режиме «суперпользователе» Android и как его можно получить.

Удобство управления

Права суперпользователя помогут значительно разнообразить, ускорить и сделать более удобной навигацию на устройстве. Например, Франсишку Баррозу (Francisco Barroso) сумел сделать новую систему жестов из MIUI 10 доступной практически для любых смартфонов со всеми анимациями и жестами. Для пользования достаточно установить приложение Fluid Navigation Gestures.

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

Tilt Scroll — еще одно полезное в управлении устройством приложение. Все, что оно делает, — это скроллит экран наклоном устройства в нужную сторону. Это может быть удобно, когда берешь смартфон грязными руками. В программе есть множество настроек: калибровка положения, включение/выключение функции встряхиванием и масса других полезных параметров.

Прокручивать списки, не касаясь экрана, также можно с помощью Fingerprint Gestures. Приложение позволяет назначить действия на прикосновение к сканеру отпечатков пальцев, а также, при наличии прав root, включить прокрутку списков.

Также списки можно прокручивать с помощью клавиш регулировки громкости. Для этого есть модуль Xposed XUpDown.

Ну и напоследок Overscan — приложение для работы со смартфоном одной рукой. Оно использует небольшой хак Android, позволяющий сдвинуть изображение на экране вниз. Из-за физических ограничений и природы хака отсутствует сжатие картинки по сторонам, а также есть проблемы с совместимостью: некоторые приложения (обычно лаунчеры) становятся непригодными к использованию в режиме Overscan.

Fluid Navigation Gestures

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Похожий контент

Всем привет, с помощью Java2Op сделал обертку библиотеки получил модуль с интерфейсами.
Теперь сам вопрос в JavaInterfaces.pas есть описание:

JUsbManagerClass = interface(JObjectClass) [‘<1048A6E9-E1B5-4DA5-A168-ED91E8DE5284>‘] function _GetACTION_USB_ACCESSORY_ATTACHED: JString; cdecl; function _GetACTION_USB_ACCESSORY_DETACHED: JString; cdecl; function _GetACTION_USB_DEVICE_ATTACHED: JString; cdecl; function _GetACTION_USB_DEVICE_DETACHED: JString; cdecl; function _GetEXTRA_ACCESSORY: JString; cdecl; function _GetEXTRA_DEVICE: JString; cdecl; function _GetEXTRA_PERMISSION_GRANTED: JString; cdecl; function getAccessoryList: TJavaObjectArray ; cdecl;//Deprecated function openAccessory(accessory: JUsbAccessory): JParcelFileDescriptor; cdecl;//Deprecated function openDevice(device: JUsbDevice): JUsbDeviceConnection; cdecl;//Deprecated procedure requestPermission(device: JUsbDevice; pi: JPendingIntent); cdecl; overload;//Deprecated property ACTION_USB_ACCESSORY_ATTACHED: JString read _GetACTION_USB_ACCESSORY_ATTACHED; property ACTION_USB_ACCESSORY_DETACHED: JString read _GetACTION_USB_ACCESSORY_DETACHED; property ACTION_USB_DEVICE_ATTACHED: JString read _GetACTION_USB_DEVICE_ATTACHED; property ACTION_USB_DEVICE_DETACHED: JString read _GetACTION_USB_DEVICE_DETACHED; property EXTRA_ACCESSORY: JString read _GetEXTRA_ACCESSORY; property EXTRA_DEVICE: JString read _GetEXTRA_DEVICE; property EXTRA_PERMISSION_GRANTED: JString read _GetEXTRA_PERMISSION_GRANTED; end; [JavaSignature(‘android/hardware/usb/UsbManager’)] JUsbManager = interface(JObject) [‘<6F603A25-E816-4012-9B23-054B428A4A75>‘] function getDeviceList: JHashMap; cdecl;//Deprecated function hasPermission(device: JUsbDevice): Boolean; cdecl; overload;//Deprecated function hasPermission(accessory: JUsbAccessory): Boolean; cdecl; overload;//Deprecated procedure requestPermission(accessory: JUsbAccessory; pi: JPendingIntent); cdecl; overload;//Deprecated end; TJUsbManager = class(TJavaGenericImport ) end; Что бы получить доступ к методам интерфейса используется следующая конструкция:
JavaObject := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.USB_SERVICE); FUsbManager := TJUsbManager.Wrap((JavaObject as ILocalObject).GetObjectID); теперь я могу получить доступ к методам JUsbManager, а как получить доступ к методам JUsbManagerClass
Вот пример кода на Java, который хочу реализовать в Delphi:
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); List availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager); if (availableDrivers.isEmpty()) < return; >// Open a connection to the first available driver. UsbSerialDriver driver = availableDrivers.get(0); //Вот тут мы видим что из экземпляра класса мы вызываем openDriver, как это сделать в Delphi UsbDeviceConnection connection = manager.openDevice(driver.getDevice()); Как мы можем заметить этого метода в описании интерфейса нет, но есть в классе, как получить доступ к экземпляру класса?

Недавно решил написать небольшое приложение под андроид, которое будет в удобном виде показывать расписание моего ВУЗа (они нам передают 20 летний привет в виде экселя), ну и задно изучить FMX.
Написал за пару дней парсер, все более менее работает. Встал вопрос — какими компонентами все это удобно и красиво отобразить? Перечитал кучу инфы по стандартным компонентам и, кажется, они мне не подойдут
Для того чтобы было понятно, чего именно я хочу — набросал схему. Границы для наглядности.
Каким компонентом это можно реализовать? Если все-таки коробочные тоже годятся, то ткните лицом куда читать 🙂
Заранее спасибо.

поделитесь пожалуйста пустым проектом, готовым к публикации для TV устройств.
что-то никак не получается опубликовать, сейчас отклонили с такими ошибками:
APK:8
No Now Playing notification [card]»
Your App does not contain a “Now Playing” notification [card] for when the user has selected the HOME button within the app. Please refer to our Displaying a Now Playing Card documentation for more details.
APK:8
Play/Pause key event is not respected during playback
Your media apps that play video or music content must respect the play/pause key during playback. Please refer to our Media Play/Pause documentation and Update the Playback State documentation for details.
Missing DPad functionality
Your app requires user interaction for menus or app navigation. Please make sure that all menus and app navigation are fully functional using a DPad. Please refer to our DPAD Control and Hardware Declaration documentation.
ну и баннер не прилепил
No full-size app banner
Your app does not contain a full-size app banner or is it not visible in the launcher. We are targeting 1080P, which we consider xhdpi. Apps should include the banner in the xhdpi (320 dpi) drawables folder with a size of (320px × 180px). Please refer to our Home Screen Banner and UI Patterns documentation.
The title should help users identify apps in the launcher. Please refer to our Visual Design and User Interaction documentation for more information.
был бы очень благодарен за рабочий пустой костяк с манифестом.

Читать еще:  Идентификация без доступа к интернету Windows 7

В процессе разработки столкнулся с очень странной ситуацией, корни которой до сих пор неясны, но решение нашлось.
Итак. Делфи 10.3.3. Чистое приложение — пустая форма и кнопка. Отлично работает на разных устройствах кроме Samsung Galaxy Tab A (2016). Android 5.1.1
Программа падает, не успев даже загрузиться. Любая. При этом она же, скомпилированная на другом компе, запускается нормально. И даже после изменения SDK/NDK на нем, ничего не падает.
LogCat дает крайне странную картину
java.lang.IllegalArgumentException: Unable to load native library: /data/app-lib/com.embarcadero.Project1-1/libProject1.so
Начинаем экспериментировать с SDK, NDK и т.д. Поставил также хотфиксы для 10.3.3.
Сразу скажу, SDK/NDK ставились отдельно через Android studio, не скачивались вместе с Delphi. Не торопитесь бросать чтение на этом месте!)) На другом компе, где все работает, все ставилось точно так же.
Короче, очень много комбинаций версий SDK/NDK проверено.
Результат такой. При постепенном понижении версии NDK все взлетело при NDK v22.

При этом версия SDK видимо такого большого влияния не имеет, потому что этот вариант нормально работает

Повторюсь. На других устройствах все работало и на более новых Ndk. Xiaomi Mi Pad4 , Samsung Galaxy Tab A (2019), Xiaomi Redmi 5 и 5Plus

Спасибо за участие и помощь в разборе завалов @Andrey Efimov

в манифест и свой файл file_paths.xml (или как вам его советуют назвать в интернетах) в деплой.
Теперь все это делается хоть несколько странно и однобоко, но автоматически, путем установки галочки Secure File Sharing

после этого в манифесте автоматически пропишется один из вариантов размещения файлов, которые вы можете найти в интернете. Используется алиас external-path
файл, показанный на рисунке, создается автоматически самой делфи.

теперь остается отгадать, какой путь реально подставится вместо «.»
Как показала практика, все пути выглядят не так, как кажется, если исходить из простого здравого смысла. Целый день использования GetHomeDir и других полезных методов TPath завел меня совсем в тупик.
Оказалось все проще (?)
st:TMemoryStream; OutputDir: JFile; ApkFile: JFile; ApkUri: Jnet_Uri; path, filename: string; . OutputDir := TAndroidHelper.Context.getExternalCacheDir(); path := JStringToString(OutputDir.getAbsolutePath); filename := path+’/ASDroid2.apk’; ApkFile := TJfile.JavaClass.init( StringToJstring(filename)); FApkUri := TAndroidHelper.JFileToJURI(ApkFile); st.Position := 0; st.SaveToFile(filename); обратите внимание, в provider_paths мы задаем external-paths, а в коде ищем ExternalCacheDir. (For.Unbelievably.Creative.Knowers!)
Потом все просто. FApkUri передаем в интент и запускаем
итоговый код примерно таков. (скачивание в потоке с использованием небольшого собственного API, но там ничего важного, можно не обращать внимания)
procedure TasdSettingsFrame.bDownloadClick(Sender: TObject); begin <$IFDEF ANDROID>bDownload.Enabled := False; DownloadAndRun(); <$ENDIF>end; <$IFDEF ANDROID>procedure TasdSettingsFrame.DownloadAndRun(); begin ttask.Run(procedure var aapi:TasdAPI; st:TMemoryStream; OutputDir: JFile; ApkFile: JFile; ApkUri: Jnet_Uri; path, filename: string; begin st := TMemoryStream.Create; aapi := TasdAPI.Clone(_API); try aapi.OnReceiveData := OnReceiveData; aapi.getApk(st); if aapi.Err.Code=0 then begin OutputDir := TAndroidHelper.Context.getExternalCacheDir(); path := JStringToString(OutputDir.getAbsolutePath); filename := path+’/ASDroid2.apk’; ApkFile := TJfile.JavaClass.init( StringToJstring(filename)); FApkUri := TAndroidHelper.JFileToJURI(ApkFile); st.Position := 0; st.SaveToFile(filename); TThread.Synchronize(nil,procedure begin bDownload.Enabled := true; StartActivity(FApkUri); end); end; finally st.Free; aapi.Free; end; end); end; procedure StartActivity(ApkUri: Jnet_Uri); var Intent: JIntent; begin Intent := TJIntent.Create(); Intent.setAction(TJIntent.JavaClass.ACTION_VIEW); Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK or TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_TOP or TJIntent.JavaClass.FLAG_GRANT_WRITE_URI_PERMISSION or TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION); Intent.setDataAndType(apkuri, StringToJString(‘application/vnd.android.package-archive’)); TAndroidHelper.Activity.startActivity(Intent); end; procedure TasdSettingsFrame.OnReceiveData(const Sender: TObject; AContentLength: Int64; AReadCount: Int64; var Abort: Boolean); begin tthread.Synchronize(nil, procedure begin pb1.Max := AContentLength; pb1.Value := AReadCount; end); end; <$ENDIF>Вопросы остались конечно, почему так странно с каталогами, но выяснять пока нет желания. Работает — не трожь.
Всем удачи.
UPD.
Для того, чтобы системный инсталлер запускался, нужно не забыть отметить еще одну галочку

Приветствую. На просторах интернета нашел BASS-библиотеку для Android и соответственно обертку для нее под Delphi.

Вроде бы все работает нормально, но вот при настройке библиотеки при помощи методов
BASS_GetConfigPtr, BASS_SetConfigPtr для работы со строковыми параметрами возникает проблема.
На Windows с этим я легко работал, там достаточно использовать такую конструкцию

PAnsiChar(BASS_GetConfigPtr(configId)) и получаем значение. BASS_SetConfigPtr(configId, PAnsiChar(value)) и задаем значение. Но вот под Android такой способ не проходит, как минимум по одной причине — он не понимает, что такое PAnsiChar. На docwiki.emarcadero.com, есть вот такая статейка. В которой написано, что PAnsiChar нужно заменить одним из трех: System.String, System.MarshalledString или System.SysUtils.TStringBuiler
Только вот, если использовать MarshalledString, то при попытке получить значение приложение просто намертво зависает и все.
Потом я подумал, так как библиотека написана на Java (вероятно), то может стоит попробовать использовать JNI в работе с ней, так как в Java файле, который прилагался вместе с библиотекой. Там я нашел объявления этих функций и заметил, что тип возвращаемого значения Object (ну, не зная Java я просто предположил, что это тоже просто ссылка на значение, например как PAnsiChar в Delphi на Windows).

Читать еще:  Как войти в режим восстановления windows 10

Но, при попытке как-либо использовать это натыкаюсь на проблемы в виде ошибки компиляции, либо очередном зависании приложения.
Так как возвращается Object, то решил попробовать вариант с JObject и JString, но ни один вариант не хочет работать, опять ошибки на стадии компиляции, либо зависание приложение. Может быть, я что-то не так делаю.

В общем, буду признателен за помощь!

Wake Lock Terminator

Отключает процессы. Например, ночью смартфон переходит в режим сна. У некоторых приложений есть процессы, которые запускаются с определенным промежутком, проделывают действия и обратно засыпают. Эти процессы приводят к частым пробуждениям гаджета. Таким образом, если ночью заряд был на уровне 100%? с утра может остаться всего 80%. Приложение было удалено с Google Play, однако на просторах Интернета найти его не так сложно.

Возможные проблемы после получения root-прав

Так бывает, что после рутирования (получения root-прав) ухудшается работа смартфона или планшета (баги, «вылет» приложений, отключение определённых функций). Решением таких проблем является сброс данных, он же «вайп». Сделать его очень просто: заходите в настройки > восстановление и сброс.

Также можно нередко услышать жалобы неопытных пользователей о том, что при скачивании root-прав очень «возмущается» браузер Chrome, а затем ему начинает вторить и компьютерный антивирус. Причина этого проста: root – это взлом системы, использующий её слабые места, и, конечно же, компании Google подобное очень не нравится (выше описано, почему), а компьютерный антивирус, видит, что скачиваемые программы предназначены для взлома и тоже бьёт тревогу. Вирусов, на самом деле, нет, так что отключайте антивирус спокойно. Впрочем, на некоторых сайтах можно подхватить вирус вместе с root-правами, так что после рутирования, всё же, лучше просканировать компьютер на предмет наличия «незваных гостей».

Создайте резервные копии

Titanium Backup — комбайн для создания резервных копий других приложений. С помощью этого приложения легко восстановить набор программ, установленных на смартфон, по состоянию на определенный день, в том виде, в котором они были, вплоть до последней золотой монетки в игре или фотографии в редакторе. Кроме того, через Titanium Backup удаляются ненужные системные приложения, избавиться от которых другим способом невозможно.

Зачем вообще «рутуют» Android?

Получение прав суперпользователя, в народе известное как «рутование», позволяет получить полный контроль над устройством. Обладая правами суперпользователя на устройстве, можно сделать практически все что угодно. Поэтому и существует огромное количество приложений (в том числе и в официальном магазине Google Play), требующих root-права для работы.

Чаще всего такие права нужны для того, чтобы делать нечто такое, что в Android обычно сделать невозможно — например, ограничивать сетевую активность некоторых или всех приложений, удалять надоевшие предустановленные приложения, разгонять процессор и так далее.

Вот наиболее популярные причины, по которым пользователи «рутуют» свои Android-устройства (здесь и далее списки составлены по данным, полученным из Kaspersky Security Network):

  • Установка приложений для взлома игр. Такие приложения получают доступ к памяти игр, чтобы изменять в них те или иные параметры или позволять играть бесплатно.
  • Работа с файловой системой. В первую очередь права супервользователя используются для удаления системных и предустановленных приложений. Кроме того, неограниченный доступ к файловой системе может пригодиться для восстановления удаленных файлов, перемещения приложений на карту памяти, а также для работы «рут-эксплореров» — программ для работы с файлами с расширенными возможностями.
  • Тонкая настройка, разгон или очистка устройства. Под разгоном имеется в виду повышение тактовой частоты процессора устройства, чтобы оно быстрее работало.
  • Перепрошивка. В первую очередь – для установки нештатных прошивок, сделанных энтузиастами.

Какие программы для получения root самые популярные?

По нашим данным, для получения прав суперпользователя люди чаще всего используют вот эти приложения (в порядке убывания популярности):

  • Kingroot
  • 360 Root
  • Framaroot
  • Baidu Easy Root
  • Towelroot
  • One Click Root
  • Mgyun

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

На всякий случай обращаем ваше внимание на то, что этот «хит-парад» не является нашей рекомендацией по использованию приложений для «рутования», он всего лишь отражает их популярность среди пользователей.

Чем опасно «рутование»? Что может пойти не так?

Как мы уже сказали, права суперпользователя позволяют получить полный контроль над устройством. И помимо указанных выше преимуществ, у этого есть и недостатки.

Важно понимать, что наличие у владельца устройства прав суперпользователя в системе нарушает главные принципы безопасности Android. То есть получение root — это по сути взлом операционной системы вашего планшета или смартфона вашими же руками.

В обычной ситуации все приложения в Android работают в изолированных средах (так называемых «песочницах», sandbox) и не могут получить доступ к другим приложениям или к системе. Но, обладая правами суперпользователя, приложение может выйти из своей изолированной среды и получить полный контроль над устройством.

Читать еще:  Почему когда включаешь компьютер монитор не включается

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

Стоит учитывать, что даже в легитимных, «чистых» приложениях бывают ошибки. Так что неприятности могут произойти в том числе «не специально», а просто из-за того, что разработчики где-то что-то не так сделали.

Также следует иметь в виду, что часто в результате «рутования» теряется гарантия устройства. А иногда в процессе получения прав root можно нарушить работу устройства так, что оно превратится в натуральный кирпич, вообще не подающий никаких признаков жизни, — и деньги вам за него не вернут.

А что в «рутованном» Android с вредоносными приложениями?

Для вредоносных приложений после получения прав суперпользователя наступает полное раздолье. Собственно, многие из троянов для Android как раз и пытаются всеми силами «получить рута». Если же пользователь сделал это самостоятельно — это просто подарок для разработчиков зловреда.

Что могут делать мобильные трояны при наличии прав суперпользователя:

  • Воровать пароли из браузера — именно это делал банковский троян Tordow.
  • Скрытно покупать приложения на Google Play — этим промышляют трояны Guerrilla и Ztorg.
  • Подменять адреса в браузере — такой идеальный фишинг реализован в трояне Triada.
  • Скрытно устанавливать приложения, в том числе в системные разделы.
  • Модифицировать прошивку так, что даже после сброса устройства до заводских установок троянец останется на устройстве.
  • Некоторые троянцы-вымогатели используют права суперпользователя для того, чтобы надежней закрепиться в системе.

Стоит отметить, что в большинстве указанных случаев зловреды способны сами получить права суперпользователя на устройстве с помощью использования уязвимостей в системе. Но некоторые зловреды используют уже существующие права. Кроме того, по нашим данным порядка 5% зловредов проверяют наличие прав рута на устройстве — например, так делает мобильный троян Obad.

В каких странах чаще всего «рутуют»?

По нашей статистике чаще всего это делают в Венесуэле — 26% пользователей из этой страны пользуются «рутованными» смартфонами. Среди африканских стран лидирует Алжир — 19% смартфонов там работают с правами суперпользователя. В Азии Android с root наиболее популярен в Бангладеш — 13%. Ну а в Европе на первом месте Молдова с впечатляющими 15%.

Что касается России, то у нас «рутованными» смартфонами пользуются 6,6% владельцев Android-устройств — и это близко к среднемировому показателю (7,6%).

Вот что еще интересно: по нашей статистике, топ-10 стран, в которых чаще всего «рутуют» Android, и топ-10 стран, в которых чаще всего случаются атаки на мобильные устройства, совпадают на 60%. А 9 из 10 самых «рутованных» стран входят в топ-25 самых атакуемых.

Работает ли антивирус в «рутованном» Android

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

Конечно, все зависит от конкретного зловреда и от того, насколько хорошо он умеет использовать возможности «рутованной» системы. Но в целом можно сказать одно: риск того, что защитное решение пропустит угрозу на «рутованном» устройстве, выше, чем на устройстве без прав суперпользователя.

Как получить root на своём телефоне

К сожалению единой инструкции, подходящей для всех телефонов нет. Более того процесс получения root-доступа может различаться даже на разных версиях прошивки одной и той же модели. Инструкции на русском к большинству моделей телефонов можно найти на форуме 4pda.

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

Sony Ericsson (Для большинства аппаратов sony и sony ericsson для получения root разблокировка аппарата не требуется) – http://unlockbootloader.sonymobile.com/instructions

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

Перед тем как что либо делать – ОБЯЗАТЕЛЬНО сделайте резервную копию всех важных данных. И в точности следуйте инструкциям. Если следовать этим двум пунктам, то процесс “взлома” вашего смартфона пройдёт быстро и безболезненно.

Ваша безопасность не гарантируется

Root-права/джейлбрейк серьёзно влияют на безопасность, однако, отказ от такой практики также не гарантирует защиты. Злоумышленник может использовать уязвимость в программном обеспечении вашего смартфона и получить права администратора для своего вредного приложения без использования программ-посредников.

Выше упомянутый сайт Jailbreakme – тому живой пример. Если владелец этого сайта был бы злодеем, то мог бы без проблем использовать эту уязвимость. Вместо того, чтобы предлагать бесплатный jailbreak для всех, например, он мог тайно устанавливать шпионские программы. Другой сайт предлагает какую-то «киберинновацию», которая позволяет читать сообщения других пользователей, установив себе приложение с root-правами. и, таким образом, выполнив «черную работу».

Существует ещё одна, более прямая разница между неповрежденным телефоном и прошедшим процесс root/jailbreaking. Открытое устройство обычно не имеет никакой гарантии, поэтому, вероятно, все будущие проблемы с телефоном вам придется решать самостоятельно (и за свой счет). Стоит ли это делать или нет, это ваше личное решение!

Ссылка на основную публикацию
Статьи c упоминанием слов:

Adblock
detector