Главная страница

Протокол проверки вкр в системе Антиплагиат


Скачать 1.89 Mb.
НазваниеПротокол проверки вкр в системе Антиплагиат
Дата01.04.2023
Размер1.89 Mb.
Формат файлаpdf
Имя файлаKQdGzfNnTIE2.pdf
ТипПротокол
#1029322
страница2 из 4
1   2   3   4

не требует дополнительных настроек устройства.
У данного способа, конечно, есть недостаток. Для работы VPN в ядре
Linux требуется поддержка TUN-интерфейса, поэтому при её отсутствии,
программа не будет корректно работать. Однако эта проблема может присутствовать лишь на Android устройствах с неофициальными прошивками
(например, на основе LineageOS), в случае, если поддержка данного интерфейса была убрана из ядра.
1.5
Техническая спецификация протоколов передачи данных
Как было сказано выше, для обработки и анализа трафика используется стек TCP/IP – набор сетевых протоколов, регулирующий сетевые соединения между устройствами в Интернете. Так, рассматриваемый стек протоколов описывает, как информация должна быть представлена, отправлена и получена,
т.е. способ передачи данных от отправителя к получателю. Стек TCP/IP
включает в себя четыре уровня [3], представленные в таблице 2.
Таблица 2 – Уровни стека TCP/IP
Уровень
Примеры протоколов
Прикладной
(Application layer)
HTTP, FTP, DNS, SMTP
Транспортный
(Transport layer)
TCP, UDP
15

Уровень межсетевого взаимодействия
(Internet layer)
IP
Уровень межсетевых интерфейсов
(Network access layer)
Ethernet, IEEE 802.11 WLAN, Token
Ring
Cтержнем всего стека
TCP/IP
является уровень межсетевого взаимодействия. Функциями данного уровня является управление, упаковка,
фрагментация, логическая адресация и маршрутизация трафика. Основным протоколом рассматриваемого уровня является протокол IP, техническая спецификация которого определяется документом RFC 791 [12].
Функцией протокола IP является доставка дейтаграмм от отправителя к получателю,
в частности,
их адресация и
фрагментация/сборка.
Рассматриваемый протокол не обеспечивает гарантированной и надежной доставки дейтаграммы до получателя, в частности, дейтаграммы могут придти не в том порядке, в котором были отправлены, могут быть повреждены,
продублированы или не дойти до получателя вовсе.
Для идентификации перехваченного трафика необходимо иметь представление о структуре заголовка IP-пакета. Согласно пункту 3.1 Формат заголовка (Internet Header Format) документа RFC 791 [12], заголовок дейтаграммы IP имеет вид, представленный на рисунке 2.
Поле Version (4 бита) указывает на версию протокола, а также является определяющим для формата заголовка. В рассматриваемой спецификации описывается версия 4.
16

Рисунок 2 – Формат заголовка дейтаграммы IP
В поле IHL (4 бита) содержится размер заголовка IP. Помимо этого,
данное поле является указателем на начало данных.
Значение поля Type of Service (ToS, 8 битов) указывает на абстрактные параметры желаемого качества обслуживания,
которые впоследствии используются при определении реальных параметров обслуживания при передаче дейтаграммы. Формат данного поля представлен на рисунке 3.
Биты 0 – 1 предназначены для значения предпочтений (Precedence) и могут принимать следующие значения:

111 – управление сетью;

110 — межсетевое управление;

101 — CRITIC/ECP;

100 — сверхсрочно;

011 — срочно;

010 — незамедлительно;

001 — приоритетный;

000 — обычный.
17

Бит 3 представляет собой флаг задержки (Delay) и может принимать значения 0 (обычная задержка) и 1 (малая задержка).
Бит 4 – это флаг пропускной способности (Throughput), принимающий значения 0 и 1 для обычной и высокой пропускной способности соответственно.
Бит 5 предназначен для установки флага надежности (Reliability),
который может принимать значения 0 (обычная надежность) и 1 (высокая надежность).
Рисунок 3 – Формат поля ToS
Использование вышеперечисленных флагов может привести к
увеличению стоимости обслуживания, поэтому рекомендуется использовать не более двух флагов из трёх возможных.
Поле Total Length (16 битов) содержит общий размер дейтаграммы,
включающий размер заголовка и данных. Типичный размер заголовка IP
составляет 20 октетов, в то время как максимальный – 60 октетов.
Поле Identification (16 битов) представляет собой идентификационный номер и предназначено для правильной сборки фрагментов дейтаграммы.
Поле Flags (3 бита) представляет набор флагов управления. Возможные значения рассматриваемого поля представлены в таблице 3.
Таблица 3 – Набор флагов управления
Бит
Значение
0
Зарезервирован (по умолчанию, значение 0)
18

1 0 – фрагментация возможна
1 – фрагментация недопустима
2 0 – фрагмент является последним
1 – фрагмент не является последним
Поле Fragment Offset (13 битов) указывает на положение фрагмента в исходной дейтаграмме.
Поле TTL (8 битов) определяет максимальный срок жизни дейтаграммы.
Так, если значение рассматриваемого поля равно нулю, дейтаграмма уничтожается.
Значение поле Protocol (8 битов) представляет собой идентификатор протокола следующего уровня, который содержится в поле данных дейтаграммы. Идентификаторы протокола определяются документом RFC 790
Assigned Numbers [25].
Так как некоторые поля заголовка, например, TTL, меняются при передаче дейтаграммы, в поле Header Checksum содержится значение контрольной суммы для всего заголовка,
которое проверяется и
пересчитывается при каждой обработке заголовка.
Поля Source address (32 бита) и Destination address (32 бита) представляют собой адреса отправителя и получателя соответственно.
Поле Options (переменная длина) и Padding (переменная длина) являются необязательными полями.
Рассмотрев описание IP дейтаграммы, можно выделить поля, являются наиболее важными в условиях поставленной задачи:

поле Source Address (Адрес отправителя), которое позволит понять,
откуда был отправлен дейтаграмма;
19


поле Destination Address (Адрес получателя), которое позволит понять, кому предназначается дейтаграмма;

поле Protocol (Протокол), определяющее протокол, который использовался для передачи данных.
Согласно пункту 2.1 Связь с другими протоколами («Relation to Other
Protocols») документа RFC 791 [12] схема взаимодействия протокола IP с другими протоколами имеет вид, представленный на рисунке 4.
Рисунок 4 – Взаимодействие протокола IP с другими протоколами
Как видно из рисунка, протокол IP взаимодействует с протоколами вышележащего транспортного уровня и уровнем межсетевых интерфейсов.
Транспортный уровень представляет собой интерфейс сетевых приложения для доступа к сети. Основными функциями рассматриваемого уровня являются сегментация собщений,
управление трафиком,
мультиплексирование сеанса (предоставление средств приема данных из разных приложений и их передачи в приложение-получатель), а также обнаружение и исправление ошибок.
Транспортный уровень включает в себя два основных протокола:
протокол управления передачей (TCP, Transmission Control Protocol) и протокол
20
пользовательских дейтаграмм (UDP, User Datagram Protocol). Рассмотрим каждый из них.
Техническая спецификация протокола TCP определяется документом
RFC 793 [13].
В указанном документе описываются основные функции,
которыми обладает протокол TCP, его программные реализации, а также интерфейсы, которым требуется TCP сервис.
Согласно указанному документу, данный протокол предназначен для организации надежного и потенциально безопасного обмена данными между приложениями, т.е. обмена данными, требующими гарантированной доставки.
Гарантия доставки обеспечивается за счет использования порядковых номеров и передачи подтверждений. Протокол TCP обладает поддержкой таких функций, как:

базовый обмен данными (Basic Data Transfer) – поддержка непрерывного потока октетов в каждом направлении между отправителем и получателем;

надежность (Reliability) – восстановление данных в случае их дублирования, повреждения, утраты, доставки в неверном порядке;

управление потоком данных (Flow Control) – управление передаваемыми отправителем данными с помощью возврата с каждым установленным флагом ACK значения поля Window, которое показывает диапазон допустимых номеров октетов, которые могут быть отправлены до получения следующего разрешения;

мультиплексирование (Multiplexing) – одновременная обработка нескольких потоков данных;

поддержка соединений (Connections) – поддержка информации о состоянии для каждого потока данных, включающая в себя сокет, порядковые номера и размер окна;
21


предпочтения и безопасность (Precedence and Security) –
возможность установки пользователем предпочтений и режима безопасности для соединений.
Согласно пункту 3.1 Формат заголовка (Header Format) документа RFC
793 [13], заголовок дейтаграммы TCP имеет вид, представленный на рисунке 5.
Рисунок 5 – Формат заголовка TCP-дейтаграммы
Поля Source Port (32 бита) и Destination Port (32 бита) содержат значения портов отправителя и получателя соответственно.
Значение поля Secuence Number (32 бита) представляет собой порядковый номер первого октета данных в сегменте (в случае, если в рассматриваемом сегменте присутствует бит SYN, первый октет данных имеет значение, равное значению поля плюс 1).
Значение поля Acknowledgment Number (32 бита) представляет собой следующий порядковый номер, который отправитель должен получить (в случае, если бит ACK установлен).
Поле Data Offset (4 бита) указывает на начало данных в сегменте.
22

Поле Control Bits (6 битов) содержит значения следующих битов управления:

URG (указывает на значимость поля Urgent Point);

ACK (указывает на значимость поля Acknowledgment Number);

PSH (функция Push);

RST (сброс соединения);

SYN (синхронизация порядковых номеров);

FIN (у отправителя больше нет данных).
Значение поля Window (16 битов) представляет количество октетов данных, которые отправитель ожидает получить.
Поле Checksum (16 битов) содержит значение контрольной суммы заголовка.
Поле Urgent Point (16 битов) представляет собой указатель на срочные данные, т.е. смещение их начала от порядкого номера текущего сегмента.
Протокол UDP представляет собой минимальный механизм передачи сообщений между прикладными программами без установления соединения. В
отличии от протокола TCP, рассматриваемый протокол не гарантирует доставки, защиту от дублирования и повреждения дейтаграмм. Техническая спецификация протокола UDP определяется документом RFC 768 [14].
Согласно рассматриваемой спецификации,
UDP-заголовок имеет вид,
представленный на рисунке 6.
Аналогично TCP пакету, поля Source Port (16 бит) и Destination Port (16
бит) содержат значения портов отправителя и получателя, значение поля Length
(16 бит) представляет собой длину общую дейтаграммы (как заголовка, так и данных), а поле Checksum (16 бит) представляет собой контрольную сумму дейтаграммы.
23

Рисунок 6 – Формат UDP заголовка
В условиях данной задачи наибольший интерес представляют поля TCP и
UDP дейтаграмм, определяющие номера портов отправителя и получателся, а также значения битов управления (для TCP дейтаграммы).
1.6
Обзор архитектуры ОС Android
Android – это операционная система с открытым исходным кодом,
основанная на ядре Linux и разрабатываемая корпорацией Google.
Рассматриваемая операционная система используется на миллионах устройств
– от мобильных телефонов до наручных часов и телевизоров – в более чем 190
странах по всему миру.
Android представляет собой программный стек, состоящий из нескольких компонентов. Основные компоненты рассматриваемой операционной системы можно представить в виде иерархии, представленной на рисунке 7.
Как было сказано выше, ОС Android базируется на урезанном ядре Linux,
что позволяет рассматриваемой операционной системе использовать ключевые функции безопасности, а также разработчикам создавать аппаратные драйвера для популярного ядра. Помимо этого, к функциям ядра относятся управление памятью, оборудованием, питанием и задачами, потоковая обработка,
предоставление драйверов и т.д.
24

Рисунок 7 – Архитектура ОС Android
Следующим уровнем программного стека ОС Android является уровень аппаратной абстракции. Данный уровень предоставляет собой совокупность
25
нескольких библиотечных модулей, каждый из которых представляет собой интерфейс определенного аппаратного компонента (например, аудио, камера или Bluetooth) и который загружается в случае, когда API-интерфейсу требуется доступ к аппаратным ресурсам.
Среда исполнения Android включает в себя виртуальные машины Dalvik и
ART (Android Runtime). Dalvik и ART (Android Runtime) представляют собой управляемые среды выполнения, которые используются приложениями и некоторыми системными службами Android. Работа приложений изолирована от ОС и ограничена пределами виртуальной машины, что обеспечивает защиту ядра от каких-либо воздействий. Таким образом, приложение запускается в собственном экземпляре виртуальной машины, которая, в свою очередь,
ограничивается процессом, управляемым ядром Linux. Данный механизм представлен на рисунке 8.
Рисунок 8 – Механизм работы Android приложения
Виртуальная машина Dalvik является предшественником ART (Android
Runtime) и используется на устройствах под управлением ОС Android ниже версии 5.0. Однако, если разрабатываемое приложение работает со средой выполнения ART, то оно может работать и со средой выполнения Dalvik, в то время как выполнение обратного не гарантируется. Помимо виртуальных
26
машин, среда исполнения Android включает в себя набор основных
Java-библиотек, которые обеспечивают большую часть функциональности языка программирования Java.
Многие базовые компоненты и сервисы Android (например, ART или
HAL) требуют нативные библиотеки, написанные на языках C и C++. Данные библиотеки включены в промежуточный уровень программного обеспечения и предоставляют необходимый функционал для приложений. Например, за запись и воспроизведение аудио и видео отвечает Media Framework, поддержку
2D- и 3D-графики обеспечивает OpenGL ES, для работы с базами данных используется SQLite и т.д. В случае, если разрабатываемому приложению требуется код, написанный на языках C/C++, доступ к некоторым из нативных библиотек можно получить непосредственно из кода, используя Android NDK.
Следующим уровнем программного стека является совокупность API,
написанных на языке Java. С помощью Java API осуществляется доступ к основному функционалу и библиотекам ОС Android. Рассматриваемый уровень включает в себя такие компоненты как Recource Manager (предоставляет доступ к ресурсам – графике, локализованным строкам, аудио и т.д.), Content Providers
(позволяет приложениям получать доступ к данным из других приложений или предоставлять собственные данные), View System (используется для создания пользовательского интерфейса) и др.
Верхний уровень программного стека представляет собой совокупность приложений – как пользовательских, так и системных. Все разрабатываемые приложения работают на этом уровне. Устройство под управлением ОС
Android поставляется с
набором основных приложений
(контакты,
SMS-сообщения, электронная почта, браузер и т.д.). Системные приложения предоставляют ключевой функционал,
которым разработчики могут использовать в своем приложении. Например, если разрабатываемому
27
приложению необходимо отправить SMS-сообщение или совершить звонок, не нужно самостоятельно создавать эту функцию – можно использовать любое приложение для SMS-сообщений или звонков, уже установленное на устройстве.
1.7
Обзор структуры Android-приложения
Android представляет собой мощную среду разработки для создания приложений и
игр,
которая основывается на сочетании языка программирования Java и расширяемого языка разметки XML.
Внешний вид каждого из экранов Android-приложения определяется с помощью макетов (layouts), которые описываются на языке разметки XML и представляют собой совокупность компонентов графического пользовательского интерфейса (GUI) – кнопок, текстовых полей, списков и т.д.
Язык программирования Java используется для реализации функционала программы. Специальные java-классы, так называемые активности (activity),
используют указанные макеты и определяют, какие действия должны происходить при определенных условиях. Например, если макет содержит кнопку, в java-классе необходимо описать, что должно происходить при нажатии на неё.
Activity – это один из фундаментальных компонентов приложения на платформе Android, который предоставляет экран, с помощью которого пользователи могут взаимодействовать с приложением, например, набрать номер телефона, сделать фотографию, просмотреть карту и т.д. Как правило,
Android-приложение может состоять из нескольких activity, слабо связанных друг с другом. Для каждой activity указывается макет, который используется для прорисовки окна графического интерфейса.
Для разработки стабильных и надежных приложений необходимо учитывать следующие основные состояния activity:
28
a)
возобновлена
(activity находится в
стадии выполнения,
пользователь видит activity); б)
приостановлена (пользователь не видит activity, поскольку она перекрывается другой activity, однако она по-прежнему содержит информацию о компонентах и находится в памяти); в)
остановлена (activity по-прежнему содержит информацию о компонентах и находится в памяти, но никак не связана с диспетчером окон)
[16].
Обработка переходов из одного указанного состояния в другое реализуется через ряд методов, в совокупности составляющий жизненный цикл activity. Указанный жизненный цикл схематично представлен на рисунке 9.
Реализация каждого программного компонента, обозначенного на предыдущих стадиях данной выпускной квалификационной работы, основана на фрагментах – классе Fragment, представляющем собой поведение или часть пользовательского интерфейса в
activity.
Одна activity может взаимодействовать с неограниченным количеством фрагментов. Так, на примере разрабатываемого приложения, класс MainActivity взаимодействует с фрагментами FragmentPackets (отображение списка перехваченных сетевых пакетов), FragmentDetails (просмотр подробной информации о сетевом пакете),
FragmentFilters (установка фильтров для перехваченного сетевого трафика).
Фрагмент обладает собственным жизненным циклом, однако на него напрямую влияет жизненный цикл аctivity, т.е. в случае, если аctivity приостановлена, то в этом же состоянии находятся все фрагменты, которые встроены в неё. Жизненный цикл фрагмента и его взаимосвязь с состоянием, в котором находится аctivity, представлен на рисунке 10.
29

Рисунок 9 – Жизненный цикл activity
30

Рисунок 10 – Жизненный цикл фрагмента и его взаимосвязь с состоянием activity
При создании фрагмента, как правило, необходимо реализовать следующие методы жизненного цикла:
31
а)
onCreate() – метод, который вызывается системой при создании фрагмента. В реализации этого метода следует инициализировать ключевые компоненты фрагмента; б)
onCreateView() – метод, который вызывается системой при первом отображении пользовательского интерфейса на экране, следовательно, в его реализации следовать инициализировать компоненты пользовательского интерфейса; в)
onPause() – метод, который вызывается системой в случае, если пользователь покидает фрагмент, например, при переходе с одного экрана на другой [17].
Помимо Java-кода и макетов Android-приложениям необходимы дополнительные ресурсы,
в частности, графические и аудио-файлы,
локализованные строки и т.д.
Кроме того, необходимой частью любого Android-приложения является так называемый манифест – файл AndroidManifest.xml, который хранится в корневом каталоге приложения и содержит необходимую информацию приложения, в частности, список компонентов, необходимых библиотек и разрешений, требуемых приложению для его корректной работы и выполнения определенного функционала (например,
разрабатываемому приложению требуется разрешение на использование VPN-соединения и доступ в Интернет).
32

2
Практическая часть
2.1
Формализация задачи
На предыдущем этапе выполнения выпускной квалификационной работы сформулированы основные функции разрабатываемого программного обеспечения, в частности:

перехват сетевого трафика в режиме реального времени;

просмотр подробной информации о перехваченных пакетах;

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

с использованием локального VPN сервера;

в реальном времени;

не влияя на работоспособность приложений,
отправляющих/принимающих сетевой трафик;

в фоновом режиме.
Пользователь должен иметь возможность просмотра подробной информации о перехваченном пакете, в частности:

информацию о приложении, выполняющем обработку пакета
(название, идентификатор процесса);

ip-адреса и используемый порт источника и получателя пакета;

доменные имена источника/получателя пакета;

название протокола;

версия протокола;

флаги (при наличии);

данные (при наличии);
33


время перехвата пакета.
Фильтрация перехваченного трафика должна быть доступна по следующим параметрам:

приложение, выполняющее обработку пакета;

ip-адрес источника пакета;

ip-адрес получателя пакета;

тип протокола.
2.2
Используемые шаблоны проектирования
При разработке приложения под Android устройства нередко весь функциональный код, а также обработка взаимодействий с пользователем и работа с асинхронными задачами помещается в методы жизненного цикла
Activity или Fragment, тем самым усложняя поддержку, расширение и тестирование приложения. Для решения этой проблемы для каждого из компонентов разрабатываемого программного обеспечения использовался шаблон
MVP
(Model-View-Presenter).
Данный шаблон предоставляет возможность отделить логику от уровня представления, т.е. то, как работает интерфейс, от того, как он представляется на экране, что, в свою очередь,
делает фоновые процессы независимым от большинства событий, связанных с жизненным циклом. Таким образом, шаблон MVP позволяет разделить обязанности приложения на следующие уровни: model, view, presenter [18].
Модель (Model) представляет собой интерфейс, ответственный за доступ и управление данными. К основным функциям рассматриваемого слоя относится использование API удаленного сервера, кэширование данных,
управление базами данных и т.д.
Посредник
(Presenter)
представляет собой посредника между графическим представлением (View) и данными (Model). Он извлекает данные из модели, выполняет их обработку и передает их View. Помимо этого, он
34
отвечает за обновление модели и содержит методы, отвечающие за взаимодействие пользователя через интерфейс приложения.
Представление (View) отвечает за представление данных. Помимо этого,
он вызывает методы посредника (Presenеter) при каждом взаимодействии пользователя с графическим интерфейсом (например, нажатие кнопок).
Таким образом, преимуществами использования данного шаблона являются:

разделение обязанностей между компонентами, что, в свою очередь, облегчает понимание, расширение и поддержку кода;

возможность изменения графического интерфейса без повреждения логики приложения;

облегчение автоматизированного тестирования приложения, т.к.
из-за четких границ между компонентами, становится намного проще тестировать каждый компонент в отдельности.
Графическая структура шаблона MVP представлена на рисунке 11.
Рисунок 11 – Структура шаблона MVP
Другим архитектурным шаблоном, используемым при разработке программного обеспечения в данной выпускной квалификационной работе,
является шаблон Внедрение зависимости (Dependency Injection, DI) – процесс
35
предоставления внешней зависимостей, необходимых для компонента, который возлагается на внешний, специально предназначенный для этого общий модуль.
Данный шаблон является «cпецифичной формой инверсии управления»
(Inversion of control), и его использование позволяет решить следующие проблемы:

изменение одного программного компонента не ведет к изменениям других программных компонентов;

изменение одного программного компонента не приводит к возникновению неконтролируемых ошибок в
других программных компонентах;

программный компонент легко изолировать от остальной части приложения для повторного использования или тестирования.
В случае, если разрабатываемое приложение содержит в себе множество классов, каждый из которых обладает своими зависимостями, их ручное внедрение через точку входа приложения (например, функция main () или метод onCreate()) является затруднительной задачей. Поэтому для реализации рассматриваемого шаблона в разрабатываемом приложении использовалась библиотека с открытым исходным кодом Dagger2, который автоматически генерирует весь код для внедрения зависимостей. Основными преимуществами использования этой библиотеки являются:

простая конфигурация сложных зависимостей;
– код, генерируемый данной библиотекой, легко понять и отладить;

Dagger2 предоставляет простой способ получить ссылки на общие экземпляры;

простота тестирования модулей и интеграция;

малые размеры библиотеки [19].
36

Для упрощения взаимодействия (обмена данными и событиями) между компонентами приложения использовался поведенческий шаблон проектирования Издатель-Подписчик (Pub-Sub). Связь между объектами осуществляется через шину событий (Event Channel). Издатель отправляет событие в шину событий, а подписчик, в свою очередь, подписывается на нужное событие и слушает его на шине [20]. Схематично рассматриваемый шаблон представлен на рисунке 12.
Рисунок 12 - Шаблон Издатель-подписчик
Для упрощения реализации данного шаблона в рамках разрабатываемого программного обеспечения используется библиотека EventBus. Указанная библиотека упрощает связь между издателями и подписчиками, а также хорошо работает с фрагментами и фоновыми потоками, избегая сложных зависимостей.
Кроме этого, плюсом этой библиотеки является небольшой размер.
2.3
Структура программного обеспечения
При разработке архитектуры программного обеспечения целесообразно выполнить декомпозицию программы на отдельные функциональные или
37
логические компоненты, которые содержат четко определенные методы и события. Это позволяет обеспечить более высокий уровень абстракции и гибкости системы, а также облегчает задачу тестирования и поддержки программного обеспечения.
Каждый компонент представляет собой программную составляющую,
предназначенную для решения одной из задач разрабатываемого программного обеспечения и представляющую для данной цели весь необходимый функционал. Помимо этого, каждый компонент характеризуется набором входящих данных, необходимых для выполнения обозначенных функций [11].
Каждый из компонентов должен обладать следующими свойствами:

работа программного компонента не должна зависеть от работы других компонентов (только от входящих данных);

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

VPN-компонент;

компонент логирования сетевого трафика;

компонент просмотра подробной информации о пакете;

компонент фильтрации перехваченного сетевого трафика.
После определения основных компонентов системы выполнена идентификация их взаимодействия между друг другом, а также входные данные для каждого их них. Результат представлен в виде схемы на рисунке 13.
38

На основании разработанной схемы взаимодействия разработана структура Java-кода, которая представлена в таблице 4. Код программы представлен в приложении А.
Каталог
Файл
Описание adapters/ PacketsListAdapter.java
Представляет собой адаптер,
который используется для отображения списка перехваченных пакетов common/ Constants.java
Содержит список общих константных переменных, в частности, сетевые адреса и протоколы, маршруты и т.д.
Utils.java
Включает в
себя общие методы, например, получение текущей даты,
списка
39
используемых приложений и др. di/ application/AppComponent.java
Реализация шаблона проектирования
Dependency
Injection application/AppModule.java details/DetailsComponent.java details/DetailsModule.java filters/FiltersComponent.java filters/FiltersModule.java packets/PacketsComponent.java packets/PacketsModule.java events/
AppInfosEvent.java
Событие, отправляемое при получении информации об установленных приложениях
DetailsEvent.java
Событие, отправляемое при запросе подробной информации о пакете
UpdatePacketsEvent.java
Событие, отправляемое при обновлении списка перехваченных пакетов
40
fragments/ details/presenter/DetailsPresenter.java Реализация компонента просмотра подробной информации о пакете details/presenter/IDetailsPresenter.jav a details/view/FragmentDetails.java details/view/IDetailsView.java filters/presenter/FiltersPresenter.java Реализация компонента фильтрации перехваченных пакетов filters/presenter/IFiltersPresenter.java filters/FragmentFilters.java filters/IFiltersView.java packets/presenter/PacketsPresenter.jav a
Реализация компонента логирования сетевого трафика packets/presenter/IPacketsPresenter.ja va packets/view/FragmentPackets.java packets/view/IPacketsView.java models/
Packet.java
Модель сетевого пакета
PacketFilter.java
Модель фильтра
41
service/ handlers/CommandHandler.java
Обработчик команд установки/деактивации
VPN-соединения handlers/PacketHandler.java
Обработчик нового перехваченного сетевого пакета
MintferVpnService.java
Программная реализация VPN
сервера
/
MainActivity.java
Главная активность,
корая отвечает за запуск приложения
Рисунок 13 – Взаимодействие компонентов разрабатываемого программного обеспечения
Таблица 4 – Структура приложения
42

43

44

Продолжение таблицы 4Продолжение таблицы 4Продолжение таблицы 4
Как видно из таблицы 4, в разрабатываемом программном обеспечении используются две модели – для описания структуры пакета и фильтра.
Подробное описание модели сетевого пакета представлено в таблице 5, а фильтра – в таблице 6.
Таблица 5 – Модель сетевого пакета
Поле
Тип
Описание version int
Версия протокола IP protocol int
Тип протокола flags int
Флаги (при наличии) sourceAddress
String
Адрес источника sourcePort int
Порт источника destinationAddress
String
Адрес получателя destinationPort int
Порт получателя uid int
Уникальный идентификатор data
String
Данные applicationInfo
ApplicationInfo Информация о
приложении,
которое обрабатывает пакет
45
date
String
Время и дата перехвата пакета sourceDomainName
String
Доменное имя источника destinationDomainName
String
Доменное имя получателя
Таблица 6 – Модель фильтра
Алгоритм работы приложения заключается в следующем. Работа программы начинается с запуска MainActivity. При запуске активности открывается экран логирования сетевого трафика, а также вызывается метод получения списка всех установленных на телефоне приложений, который затем сохраняется их в виде списка для дальнейшего использования. Помимо этого,
указанная активность обладает следующим основным функционалом:
Поле
Тип
Описание sourceAddress
String
Адрес отправителя destinationAddress
String
Адрес получателя protocol
Constants.TransportProtocol Тип протокола applicationInfo
ApplicationInfo
Информация о
приложении,
которое обрабатывает пакет isFiltering boolean
Использование фильтрации пакетов
46


обработка пользовательского нажатия на кнопку запуска/остановки перехвата трафика;

обработка пользовательского нажатия на кнопку фильтрации трафика;

генерация зависимостей компонентов.
При нажатии на кнопку запуска/остановки перехвата сетевого трафика активность взаимодействует с
VPN-компонентом,
вызывая его соответствующие методы.
2.4
VPN-компонент
Локальный
VPN-сервер является основным компонентом разрабатываемого программного обеспечения. Рассматриваемый компонент реализует следующие функции:

запуск и остановка локального VPN-сервера;

перехват и обработка пакета;

обработка ошибок, возникающих при работе VPN-сервера.
Для программной реализации рассматриваемого компонента использовался интерфейс VPNService [22], доступный для устройств под управлением ОС Android версии 4.0 и выше. Данный класс использует протокол IP, позволяет создавать виртуальный сетевой интерфейс и настраивать адресацию и правила маршрутизации. При работе с указанным интерфейсом необходимо учитывать следующее:

при первом подключении пользователя требуется получить разрешение от пользователя;

одновременно может работать только одно VPN-соединение, т.е.
при создании нового соединения, предыдущее разъединяется;

в течение всего времени использования VPN-соединения системой отображается уведомление о его использовании.
47

Класс VPNService содержит два основных метода:

prepare(Context) – останавливает VPN-соединение, созданное другим приложением, если такое имеется;

establish() – устанавливает новое VPN-соединение, используя параметры, предоставленные классом-помощником VPNService.Builder.
Класс VPNService.Builder [23] всегда используется только в рамках
VPNService. Основные методы, используемые для установки VPN-соединения в рамках разрабатываемого программного обеспечения, и их краткое описание представлены в таблице 7.
Таблица 7 – Основные методы класса VPNService.Builder
Метод
Параметры
Описание метода addAddress(String address,
int prefixLength)
String address – сетевой адрес, int prefixLength – длина префикса
Устанавливает сетевой адрес
VPN-интерфейса addDnsServer(Strin g address)
String address – DNS-адрес
Используется для настройки DNS addRoute(String address,
int prefixLength)
String address – сетевой адрес, int prefixLength – длина префикса
Используется для настройки маршрутизации setMtu(int mtu) int mtu – значение MTU
Устанавливает максимальный объём данных,
который
48
может быть передан за одну итерацию addAllowedApplica tion(String packageName)
String packageName – название пакета (приложения)
Разрешает определенному приложению доступ к VPN-соединению addDisallowedAppli cation(String packageName)
String packageName – название пакета (приложения)
Запрещает определенному приложению доступ к VPN-соединению setSession(String session)
String session – имя сессии
Устанавливает имя сессии establish()

Создает
VPN-соединение, используя установленные параметры
49

Продолжение таблицы 7
Алгоритм работы рассматриваемого компонента заключается в
следующем. При нажатии пользователя на кнопку старта перехвата сетевого трафика вызывается метод prepare(Context). Данный метод возвращает так называемое намерение (Intent) – механизм, который в рассматриваемом случае является объявлением о намерении запустить сервис. Если указанное возвращаемое значение не является нулевым, вызывается метод запуска сервиса. В данном методе задаются параметры VPNService.Builder и создается
VPN интерфейс, на который перенаправляются все сетевые пакеты. Каждый сетевой пакет анализируется и передается обработчику PacketHandler, который,
в свою очередь, по полученному идентификатору процесса определяет приложение, которое является источником или получателем пакета, а затем генерирует событие UpdatePacketsList.
2.5
Компонент логирования сетевого трафика
Функцией компонента логирования является просмотр перехваченного сетевого трафика, в частности:

отображение списка перехваченных пакетов;

обновление данного списка в режиме реального времени;

очистка данного списка;

обработка ошибок, возникающих при работе данного компонента.
50

Диаграмма классов рассматриваемого компонента представлена на рисунке 14.
Рисунок 14 – Диаграмма классов компонента логирования сетевого трафика
51

Как было сказано выше, экран логирования сетевого трафика открывается при запуске приложения. При запуске компонента вызывается метод registerEvent(),
в котором выполняется подписка на событие
UpdatePacketsEvent. После того, как VPN-компонент генерирует указанное событие, в методе onUpdatePacketsEvent(UpdatePacketsEvent event) извлекается перехваченный пакет и добавляется в список, после чего вызывается метод updatePacketsList(List packetsList), который обновляет отображаемый список пакетов.
При нажатии на любой элемент из списка перехваченных пакетов генерируется событие DetailsEvent(Packet packet), входящим параметром которого является модель указанного элемента, после чего открывается экран просмотра подробной информации о пакете.
2.6
Компонент просмотра подробной информации
Компонент просмотра подробной информации о пакете предоставляет собой пользовательский интерфейс просмотра следующих параметров указанного пакета:

информацию о приложении, выполняющем обработку пакета
(название, идентификатор процесса);

ip-адреса и используемый порт источника и получателя пакета;

доменные имена источника/получателя пакета;

название протокола;

версия протокола;

флаги (при наличии);

данные (при наличии);

время перехвата пакета.
52

Эти данные извлекаются из переданной модели пакета и отображаются в виде списка. Диаграмма классов указанного компонента представлена на рисунке 15.
Рисунок 15 – Диаграмма компонента просмотра подробной информации о сетевом пакете
2.7
Компонент фильтрации
Компонент фильтрации перехваченного сетевого трафика по заданным пользователем параметрам обладает следующим функционалом:

установка одного или нескольких фильтров для списка перехваченных пакетов;

сброс фильтров для данного списка;
53


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

название приложения, выполняющего обработку пакета;

ip-адрес отправителя пакета;

ip-адрес получателя пакета;

тип протокола.
Диаграмма классов компонента фильтрации списка перехваченных пакетов представлена на рисунке 16.
Рисунок 16 – Диаграмма компонента фильтрации сетевого трафика
Экран фильтрации списка перехваченных пакетов открывается после нажатия на соответствующую кнопку в верхнем меню. Он представляет собой текстовые поля для ввода пользовательских значений и кнопку сохранения,
54
после нажатия на которую создается модель PacketFilter и происходит автоматический переход на предыдущий экран со списком перехваченных пакетов, которые фильтруются по заданной модели PacketFilter. Для сброса установленных фильтров необходимо нажаться на соответствующую кнопку на экране фильтрации.
2.8
Руководство пользователя
Программное обеспечение, разработанное в ходе выполнения данной выпускной квалификационной работы, предназначено для мониторинга сетевой активности на устройствах под управлением ОС Android. Указанное средство позволяет в режиме реального времени отслеживать сетевой трафик установленных на устройстве приложений, а также проводить анализ и фильтрацию сетевых пакетов. Для использования данного приложения не требуется каких-либо специальных навыков или знаний.
Для работы с приложением, разработанным в ходе выпускной квалификационной работы, необходимо иметь устройство на базе ОС Android версии 4.0 и выше, на который требуется установить apk-файл приложения.
55

Стартовый экран приложения представлен на рисунке 17.Рисунок 17 –
Стартовый экран приложения
На верхней панели находятся кнопки «Фильтр» и «Корзина». При нажатии на кнопку «Фильтр» откроется экран установки параметров фильтрации. Для того, чтобы очистить текущий список перехваченных пакетов,
необходимо нажать на кнопку «Корзина».
Для запуска или остановки перехвата сетевого трафика необходимо нажать на кнопку в правом нижнем углу. При первом запуске приложения появится диалоговое окно с запросом на подключение к сети VPN,
56
представленное на рисунке 18. Для продолжения работы требуется нажать на кнопку «ОК».
Рисунок 18 – Запрос на подключение к сети VPN
После начала перехвата сетевого трафика, на главном экране отобразиться динамически обновляемый список перехваченных пакетов, как показано на рисунке 19. Для каждого сетевого пакета отображается:

название приложения, которое обрабатывает пакет;

иконка приложения;

ip-адрес получателя сетевого пакета;

тип используемого протокола;
57


время перехвата сетевого пакета.
Рисунок 19 – Отображение списка перехваченных пакетов
Для просмотра подробной информации о каком-либо сетевом пакете необходимо нажать на любой элемент списка, после чего откроется экран,
представленный на рисунке 20.
58

Рисунок 20 – Экран просмотра подбробной информации о пакете
В верхней части экрана отображается следующая информация:

название приложения, которое обрабатывает пакет;

имя пакета;

уникальный идентификатор;

иконка приложения;

доменное имя отправителя;

доменное имя получателя.
В нижнем блоке содержатся детальная информация о выбранном сетевом пакете, в частности:

IP-адрес и порт отправителя;
59


IP-адрес и порт получателя;

тип используемого протокола;

версия протокола;

флаги (при наличии);

дата перехвата пакета.
При нажатии на кнопку «Фильтры» в верхнем меню открывается экран,
представленный на рисунке 21.
Рисунок 21 – Экран установки фильтров
На данном экране можно установить параметры фильтрации для перехваченного трафика. Для этого в поля «Source address» и «Destination address»
необходимо ввести
IP-адреса отправителя и
получателя,
соответственно. При нажатии на поле «Application» откроется список установленных на устройстве приложений. Для выбора приложения
60
необходимо нажать на его название. Аналогично с полем «Protocol» – из списка доступных протоколов необходимо выбрать нужный.
Можно указать как все параметры фильтрации, так и некоторые, заполнив соответствующие поля. После ввода данных необходимо нажать на кнопку
«Apply», после чего откроется главный экран приложения, на котором будет отображен список перехваченных пакетов, отфильтрованный по заданым параметрам. Для сброса установленных фильтров необходимо нажать на кнопку «Reset».
Пример возможных параметров фильтрации представлен на рисунке 22.
Рисунок 22 – Пример установленных параметров фильтрации
61

3
Вредные психофизиологические факторы, влияющие на нервную систему специалиста по защите информации. Методы и средства физической культуры, снижающие их воздействие
Нервная система является одним из основных механизмов поддержания человеческого организма в равновесии. Она регулирует деятельность и взаимодействие всех органов и систем человека, в то время, как заболевания этой системы оказывают серьезное влияние на организм в целом, могут привести к инвалидности или даже к летальному исходу (например,
сосудисто-мозговая недостаточность или инсульт). Причинами заболеваний нервной системы являются различные факторы – от несбалансированного питания до инфекционных заболеваний, и различные психофизиологические факторы не являются исключением.
Психофизиологические факторы,
которые негативно влияют на работоспособность и эффективность человека, можно подразделить на две группы:

нервно-психические перегрузки;

физические перегрузки.
Влияние на нервную систему специалиста по защите информации оказывает как первая группа, так и вторая группа. Нервно-психические перегрузки негативно сказываются на центральной нервной системе (т.е. на функциях головного мозга), в то время, как физические перегрузки оказывают влияние на периферическую нервную систему. Рассмотрим подробнее каждую из них.
К нервно-психическим перегрузкам можно отнести: а)
перегрузки из-за монотонности трудового процесса – постоянное повторение однообразных действий приводит к тому, что человек теряет
62
интерес к работе, вследствие чего снижается его концентрация внимания и производительность; б)
умственное и эмоциональное перенапряжение, в частности, из-за большого объема работы, постоянных переработок сверх нормы рабочего времени, сжатых сроков, может привести к нервному истощению и эмоциональному «перегоранию» работника; в)
эмоциональные перегрузки из-за негативных взаимоотношений в трудовом коллективе отрицательно сказываются на ментальном здоровье человека, что также может привести к стрессам и нервному истощению; г)
перенапряжение органов чувств (в рассматриваемом случае,
органов зрения) может привести к постоянным головным болям и тошноте.
Постоянные психоэмоциональные стрессы наносят вред не только нервной системе человека, но и его физическому здоровью.
Физические перегрузки бывают:

статические (например, длительное пребываение человека в неудобной позе или статическое напряжение отдельных групп мышц);

динамические (например, частые наклоны туловища, наклоны и повороты головы и т.д);

гиподинамические (например, перегрузки опорно-двигательного аппарата или системы дыхания).
Физические перегрузки часто приводят к перенапряжению нервной системы человека, заболеваниям конечностей, шеи, поясницы и т. д.
Для того, чтобы свести к минимуму негативные последствия указанных психофизиологических факторов, рекомендуется использовать следующие методы и средства физической культуры:

гигиенические факторы;

физические упражнения;
63


природные ресурсы.
К гигиеническим факторам относится не только соблюдение личной и общественной гигиены, но и следование принципам здорового питания,
соблюдение режима дня и сна, полноценный отдых и т. д.
Физические упражнения являются одним из основных средств физической культуры. Регулярные физические нагрузки активизируют приток кислорода в ткани мозга, позволяют снизить умственное и физическое напряжение, избавиться от неврозов, а также приносят положительные эмоции и повышают активность головного мозга. В настоящее время во многих компаниях присутствуют регулярные корпоративные игры в футбол или баскетбол после рабочего дня, а в некоторых – занятия йогой в обеденный перерыв.
К природным ресурсам относятся солнце, воздух и вода. Они используются как дополнительные факторы, которые создают благоприятные условия для физических нагрузок, а также как самостоятельные средства оздоровления организма (например, закаливание, солнечные ванны и т. д.).
64

Заключение
В данной выпускной квалификационной работе рассмотрена проблема мониторинга сетевой активности приложений на устройствах под управлением
ОС Android.
В процессе выполнения данной выпускной квалификационной работы выполнены обзор, сравнение и выявление недостатков у существующих аналогов разрабатываемого программного обеспечения, анализ существующих способов программной реализации поставленной задачи и изучение используемых протоколов передачи данных, а также рассмотрена архитектура операционной системы Android и структура Android-приложения.
В ходе выполнения данной выпускной квалификационной работы выполнено проектирование архитектуры программного обеспечения, а также разработаны алгоритмов работы приложения.
В итоге получена программа, реализуюшая перехват сетевого трафика на устройствах под управлением ОС Android версии 4.0 и выше, которая позволяет проводить мониторинг сетевой активности в режиме реального времени,
просматривать перехваченный трафик и детальную информацию о каждом пакете, а также выполнять фильтрацию трафика по заданным пользователем параметрам – IP-адресах отправителя и получателя, приложению, которое занимается обработкой пакета, а также по типу используемого приложения. В
завершении выпускной квалификационной работы выполнена разработка руководства пользователя,
а также рассмотрены вредные психофизиологические факторы, влияющие на нервную систему специалиста по защите информации и средства физической культуры, снижающие их воздействие
Таким образом, задание на выпускную квалификационную работу выполнено в полном объеме.
65

Список используемых источников
1
Тайная жизнь мобильных приложений [Электронный ресурс]. –
Режим доступа:

https://www.kaspersky.ru/blog/secret-life-of-apps/14313​
,
свободный. – Загл. с экрана (дата обращения: 09.01.2018).
2
Systems analysis and design. Alan Dennis, Barbara Haley Wixom,
Roberta
M.
Roth
[Электронный ресурс].

Режим доступа:
http://www.saigontech.edu.vn/faculty/huynq/SAD/Systems_Analysis_Design_UML_
5th%20ed.pdf​
, свободный. – Загл. с экрана (дата обращения: 03.12.2017).
3
В. Олифер, Н. Олифер. Компьютерные сети. Изд. 4-е. М., 2010. 943
с. (дата обращения: 03.12.2017).
4
RFCs
[Электронный ресурс].

Режим доступа:
https://www.ietf.org/standards/rfcs​
, свободный. – Загл. с экрана (дата обращения:
03.12.2017).
5
А. Бхаргава. Грокаем алгоритмы. Иллюстрированное пособие для программистов и любопытствующих. Санкт-Петербург: изд. Питер, 2017. 288 с.
6
Э.Фримен, Э.Фримен. Паттерны проектирования. Санкт-Петербург:
изд. Питер, 2013. 656 с.
7
К. Сьерра, Б. Бертс. Изучаем Java. М.: изд. Эксмо, 2017 г. 720 с.
8
Б. Эккель. Философия Java. Санкт-Петербург: изд. Питер, 2009 г.
640 с.
9
Android Developers [Электронный ресурс]. – Режим доступа:
https://developer.android.com/index.html​
, свободный. – Загл. с экрана
(дата обращения: 24.12.2017).
10
Meet Android Studio [Электронный ресурс]. – Режим доступа:
https://developer.android.com/studio/intro/index.html​
, свободный. – Загл. с экрана
(дата обращения: 24.12.2017).
66

11
Создание архитектуры программы или как проектировать табуретку
[Электронный ресурс]. – Режим доступа: ​
https://habrahabr.ru/post/276593/​
,
свободный. – Загл. с экрана (дата обращения: 18.12.2017).
12
RFC 791 – Internet Protocol [Электронный ресурс]. – Режим доступа:
https://tools.ietf.org/html/rfc791​
, свободный. – Загл. с экрана (дата обращения:
11.12.2017).
13
RFC 793 – Transmission Control Protocol [Электронный ресурс]. –
Режим доступа: ​https://tools.ietf.org/html/rfc79​3, свободный. – Загл. с экрана
(дата обращения: 11.12.2017).
14
RFC 768 – User Datagram Protocol [Электронный ресурс]. – Режим доступа: ​
https://tools.ietf.org/html/rfc768​
, свободный. – Загл. с экрана
(дата обращения: 11.12.2017).
15
Platform Architecture [Электронный ресурс]. – Режим доступа:
https://developer.android.com/guide/platform/index.html​, свободный. – Загл. с экрана (дата обращения: 19.12.2017).
16
Activity
[Электронный ресурс].

Режим доступа:
https://developer.android.com/reference/android/app/Activity.html, свободный. –
Загл. с экрана (дата обращения: 19.12.2017).
17
Fragments
[Электронный ресурс].

Режим доступа:
https://developer.android.com/guide/components/fragments.html,
свободный.

Загл. с экрана (дата обращения: 19.12.2017).
18
Model-View-Presenter:
Android guidelines.
Francesco
Cervone
[Электронный ресурс].

Режим доступа:
https://medium.com/@cervonefrancesco/model-view-presenter-android-guidelines-94 970b430ddf​, свободный. – Загл. с экрана (дата обращения: 21.12.2017).
67

19
Dagger. A fast dependency injector for Android [Электронный ресурс].
– Режим доступа: ​
https://google.github.io/dagger/​
, свободный. – Загл. с экрана
(дата обращения: 21.12.2017).
20
Паттерн Издатель-Подписчик [Электронный ресурс]. – Режим доступа: ​https://reyvart.com/tech/publisher-subscriber-pattern/​, свободный. – Загл.
с экрана (дата обращения: 21.12.2017).
21
GitHub – greenrobot/EventBus [Электронный ресурс]. – Режим доступа: ​
https://github.com/greenrobot/EventBus​
,
свободный. – Загл. с экрана
(дата обращения: 21.12.2017).
22
VpnService
[Электронный ресурс].

Режим доступа:
https://developer.android.com/reference/android/net/VpnService.html,
свободный.
– Загл. с экрана (дата обращения: 09.01.2018).
23
VpnService.Builder[Электронный ресурс].

Режим доступа:
https://developer.android.com/reference/android/net/VpnService.Builder.html​, свободный. – Загл. с экрана (дата обращения: 09.01.2018).
24
Разработка VPN-клиента под Android (Часть 1) [Электронный ресурс]. – Режим доступа:
https://habrahabr.ru/company/mobisoft/blog/231827/,
свободный. – Загл. с экрана (дата обращения: 17.12.2017).
25
RFC 790 – Assigned Numbers [Электронный ресурс]. – Режим доступа: ​
https://tools.ietf.org/html/rfc790​
, свободный. – Загл. с экрана
(дата обращения: 11.12.2017).
68

Приложение А
(обязательное)
Код программы
69

MainAcrivity.java public class MainActivity extends AppCompatActivity { private FloatingActionButton fab; private PacketFilter packetFilter; private boolean isConnected = false;
@NonNull private AppComponent applicationComponent;
@NonNull public static MainActivity get(@NonNull Context context) { return (MainActivity) context;
}
@Override protected void onStart() { super.onStart();
ArrayList tcpInfos = new ArrayList<>();
Utils.getInstalledAppsInfo(getPackageManager());
}
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar);
70
fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View view) { if (!isConnected) { startVPN();
} else { isConnected = false;
MintferVpnService.stop("stopped", getApplicationContext()); fab.setImageResource(R.drawable.ic_start);
}
}
}); applicationComponent = prepareAppComponent().build(); if (savedInstanceState == null) {
FragmentManager manager = getSupportFragmentManager(); manager.beginTransaction()
.add(R.id.container, new FragmentPackets())
.commit();
}
}
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu);
71
return true;
}
@Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { case R.id.action_filters:
FragmentManager manager = getSupportFragmentManager(); manager.beginTransaction()
.replace(R.id.container, new FragmentFilters())
.addToBackStack(null)
.commit(); return true; case R.id.action_clear:
EventBus.getDefault().post(new ClearPacketListEvent());
} return super.onOptionsItemSelected(item);
}
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == Constants.VPN_REQUEST_CODE && resultCode ==
RESULT_OK) {
72

MintferVpnService.start("prepared", this); isConnected = true; fab.setImageResource(R.drawable.ic_stop);
}
} private void startVPN() {
Intent vpnIntent = VpnService.prepare(this); if (vpnIntent != null) startActivityForResult(vpnIntent, Constants.VPN_REQUEST_CODE); else onActivityResult(Constants.VPN_REQUEST_CODE, RESULT_OK, null);
}
@NonNull private DaggerAppComponent.Builder prepareAppComponent() { return DaggerAppComponent.builder()
.appModule(new AppModule(this));
}
@NonNull public AppComponent applicationComponent() { return applicationComponent;
} public PacketFilter getPacketFilter() { return packetFilter;
73

} public void setPacketFilter(PacketFilter packetFilter) { this.packetFilter = packetFilter;
}
}
MintferVpnService.java public class MintferVpnService extends VpnService { private static final String TAG = MintferVpnService.class.getSimpleName(); private long jni_context = 0; private Thread tunnelThread = null; private MintferVpnService.Builder last_builder = null; private ParcelFileDescriptor vpn = null; private boolean temporarilyStopped = false; private Map mapHostsBlocked = new HashMap<>(); private Map
1   2   3   4


написать администратору сайта